SQL Server  Merry-Go-Round Scan
0

SQL Server ‘da bilindiği gibi veriler Page (Sayfa) denilen bölümlerde tutulur. Page ‘lerde tutulan verilere erişmek istediğimizde SQL Server fiziksel ve mantıksal okumalar yaparak veriye erişmemizi sağlar. SQL Server ‘da bir veri üzerinde işlem yapmak için talepte bulunduğumuzda SQL Server öncelikle veririnin bulunduğu Page (Sayfa) ‘leri diskten okuyup ( Fiziksel Okuma ) Buffer Cache diye adlandırılan bir önbelleğe yükler. SQL Server ‘da bir veriye erişmek istediğimizde bu verinin tutulduğu Page ‘ler önce Buffer Cache üzerinde kontrol edilir varsa buradan okuma yaparak ( Mantıksal Okuma ) gerçekleşir. Eğer ilgili Page’ler Buffer Cache üzerinde yoksa önce diskten okunup ( Fiziksel Okuma ) Buffer Cache yüklenir daha sonra işlem Buffer Cache ( Mantıksal Okuma) olarak devam eder.

SQL Server üzerine gönderilen okuma istekleri Relational Engine denilen bir birim tarafından kontrol edilir ve Storage Engine denilen başka bir birim tarafından da optimize edilir. Relational Engine veriye erişim için en etkili yöntemi belirler. ( Table Scan , Index Scan , Keyed Read) – ( Tablo taraması , Index taraması, Anahtar alan okuması ) Storage Engine ise yapılacak okumaları optimize eder.

SQL Server üzerinde yapılan okuma işlemlerinde süreç temel olarak verinin tutulduğu sayfayı (Page) Buffer Cache üzerinde oku eğer sayfa Buffer Cache üzerinde yoksa disk üzerinde okuyup Buffer Cache yükle ve oradan oku şeklinde yürütülür.

SQL Server üzerinde bir tablodaki tüm kayıtları okuma ihtiyacı olduğunda veya tablo üzerinde Index olmaması / kullanılabilecek uygun bir Index olmaması vb. durumlarda SQL Server Table Scan ( Tablo Taraması ) yöntemi ile veriye ait olan tüm Page ‘leri okumaktadır.

Table Scan işlemi çok maliyetli olup birden fazla işlemin Table Scan yöntemi ile veriye erişmesi durumunda sisteme ciddi bir yük bindirecektir. Table Scan yöntemini optimize etmek için SQL Server Enterprise ( Kurumsal Sürüm ) sürümünde bulunan bir özellik kullanılmaktadır. Advanced Scanning ( Gelişmiş Tarama ) diye tanımlanan bu özellik Merry-Go-Round olarak adlandırılmaktadır.

Advanced Scanning ile birden fazla gelen Table Scan işleminin paylaşılması sağlanmaktadır. SQL Server ‘a iletilen bir işlem eğer Table Scan yöntemi ile veriye erişim sağlamak istiyorsa ve o sırada başka bir işlem erişilecek veri üzerinde zaten Table Scan işlemi yapıyorsa SQL Server Enterprise sürümünde Database Engine yeniden bir Table Scan işlemi başlatmak yerine devam eden taramaya gelen diğer isteği de dahil eder. Bu şekilde SQL Server her gelen istek için her bir sayfayı tekrar tekrar okumak yerine bir her sayfası bir sefer okur ve çalışan sorguların planına okunan sayfa bilgileri iletilir.

Table Scan yapan ilk istek tüm okunan sayfaları doğrulayıp sürecini tamamlamaktadır ancak taramaya dahil edilen diğer istekler taramaya katıldıkları noktadan itibaren süreci tamamlasa bile katıldıkları noktadan önce olan sayfaları da okuması gerekmektedir. Bunun için tarama başlangıcına dönülüp katılım sağlanan noktaya kadar tekrar Page ‘ler okunur. Tüm işlemler tamamlanana kadar Database Engine veri sayfaları arasında dönmeye devam eder. Bu yapıya Merry-Go-Round ( Atlı Karınca ) adı verilmiştir.

Not: Yukarıdaki Page okuma sürecinin işleyişinden dolayı SELECT ifadesi ile sorgulanan kayıtların sırasının ORDER BY kullanılmadan hep aynı sırada kayıtları döndüreceği garanti edilemez.

Daha anlaşılır olması açısından konuyu örneklendirecek olursak;

100.000 Page ‘lik bir tablomuz olduğunu varsayalım. 1. kullanıcı Table Scan işlemine dönüşen bir sorgu çalıştırır. SQL Server verileri getirmek için sayfaları taramaya başlar. 10.000 sayfa tarandığında 2. kullanıcı aynı tabloyu tarayacak başka bir sorgu çalıştırır. Bu noktada Database Engine 10.000 ‘den sonraki Page ‘ler için bir okuma isteği zamanlar ve okunan sayfaları her iki isteğe de iletir. Tarama işlemi 50.000 Page geldiğinde 3. Bir kullanıcı da aynı tabloyu tarayacak bir sorgu daha iletir. Bu sefer SQL Server 50.001. sayfadan başlayarak okunan kayıtları her üç kullanıcıya da iletmeye başlar. Süreç sonunda 1. Kullanıcının işlemi tamamlanır 100.000 Page okunur. 2. ve 3. kullanıcı için tarama işlemi 1. Page geri dönülerek sayfalar en baştan taranmaya başlar. 2. Kullanıcının taramaya dahil olduğu nokta olan 10.000 Page kadar okunan kayıt sonrası 2. Kullanıcının da işlemi tamamlanır. 50.000 Page kadar okuma devam eder ve 50.000 Page okunduktan sonra 3. Kullanıcının da tarama işlemi tamamlanır. Her bir istek için Atlı karınca ‘ya ( Merry-Go-Round ) benzer bir yapı ile okumalar tamamlanır.

SQL Server Enterprise ( Kurumsal ) olmayan versiyonlarda her bir kullanıcı okunan her bir sayfayı paylaşmak yerine tekrar tekrar okumaya çalışır. Bu da bellek üzerinde darboğaz meydana getirip performansı azaltmaktadır.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

TAGs: SQL Server, Table Scan, Index Scan, Merry-Go-Round, Page, SQL Server Enterprise, Advanced Scanning, Buffer Cache, Database Engine, Relational Engine , Storage Engine

Bu İçeriğe Tepkin Ne Oldu?
  • 11
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Selçuk Üniversitesi Bilgisayar programcılığı bölümünden mezun olduktan sonra birçok firmada Yazılım, İş zekası ve Veritabanı Uzmanı olarak çalıştım. Şu an Türkiye’nin en büyük şirketlerinden biri olan Doğan Online’da Veritabanı Yöneticisi olarak çalışıyorum.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir