Sorgu planlarını anlama
Yürütme planı ayrıntılarına geçmeden önce veritabanı iyileştiricilerinin nasıl çalıştığını anlamak önemlidir. SQL Server, kullanılan sütunlardaki istatistiklere ve sorgu planındaki her işlem için olası dizinlere göre birden çok olası planın maliyetini hesaplayan maliyet tabanlı bir sorgu iyileştirici kullanır. Bu bilgiler, optimizatörün her planın toplam maliyetini belirlemesine yardımcı olur. Karmaşık sorguların binlerce olası yürütme planı olabilir, ancak iyileştirici her birini değerlendirmez. Bunun yerine, iyi performans gösterme olasılığı yüksek planları belirlemek için buluşsal yöntemler kullanır ve ardından değerlendirilenlerden en düşük maliyet planını seçer.
Sorgu iyileştiricisi maliyet tabanlı olduğundan karar alma için doğru girişler sağlamak çok önemlidir. SQL Server, sütun ve dizinlerdeki verilerin dağılımını izlemek için istatistiklere dayanır ve en iyi olmayan yürütme planlarının oluşturulmasını önlemek için bu istatistiklerin güncel tutulması gerekir. SQL Server, tablodaki veriler değiştikçe istatistiklerini otomatik olarak güncelleştirse de, verilerin hızla değiştirilmesi için daha sık güncelleştirmeler yapılması gerekebilir. İyileştirici, veritabanının uyumluluk düzeyi, istatistiklere dayalı satır tahminleri ve kullanılabilir dizinler dahil olmak üzere bir plan oluştururken birçok faktörü dikkate alır.
Kullanıcı veritabanı altyapısına bir sorgu gönderdiğinde aşağıdaki işlem gerçekleşir:
- Sorgu doğru söz dizimi için ayrıştırılır ve doğruysa veritabanı nesnelerinin ayrıştırma ağacı oluşturulur.
- Ayrıştırma ağacı daha sonra bağlama için Algebrizer adlı bir veritabanı altyapısı bileşenine giriş yapılır. Bu adım, sorgudaki sütunların ve nesnelerin mevcut olduğunu doğrular ve işlenen veri türlerini tanımlar. Çıkış, bir sonraki adım için giriş görevi görecek bir sorgu işlemci ağacıdır.
- Sorgu iyileştirmesi YOĞUN CPU kullanımına sahip olduğundan veritabanı altyapısı yürütme planlarını plan önbelleği olarak adlandırılan özel bir bellek alanında önbelleğe alır. Sorgu için zaten bir plan varsa, bu plan önbellekten alınır. Önbellekteki her sorgunun, sorgudaki T-SQL'i temel alarak oluşturulan ve query_hash olarak bilinen bir karma değeri vardır. Motor, geçerli sorgu için bir query_hash oluşturur ve plan önbelleğinde eşleşmeleri kontrol eder.
- Plan yoksa, Sorgu İyileştiricisi maliyet tabanlı iyileştiricisini kullanarak sorguda kullanılan sütunlar, tablolar ve dizinlerle ilgili istatistikleri temel alan çeşitli yürütme planı seçenekleri oluşturur. Çıktı bir sorgu yürütme planıdır.
- Sorgu, plan önbelleğinden bir yürütme planı veya önceki adımda oluşturulan yeni bir plan kullanılarak yürütülür. Çıkış, sorgunuzun sonuçlarıdır.
Not
Sorgu işlemcisinin nasıl çalıştığı hakkında daha fazla bilgi edinmek için bkz . Sorgu İşleme Mimarisi Kılavuzu
Bir örneğe bakalım. Aşağıdaki sorguyu göz önünde bulundurun:
SELECT orderdate,
AVG(salesAmount)
FROM FactResellerSales
WHERE ShipDate = '2013-07-07'
GROUP BY orderdate;
Bu örnekte, SQL Server FactResellerSales tablosunda OrderDate, ShipDate ve SalesAmount sütunlarının varlığını denetler. Bu sütunlar varsa, SQL Server sorgu için bir karma değeri oluşturur ve eşleşen bir karma değeri için plan önbelleğini inceler. Eşleşen bir karma değer bulunursa, motor planı yeniden kullanmaya çalışır. Eşleşen karma değer bulunmazsa, SQL Server OrderDate ve ShipDate sütunlarında kullanılabilir istatistikleri inceler.
WHERE
ShipDate sütununa başvuran yan tümcesi, bu sorgudaki koşul olarak bilinir.
ShipDate sütununu içeren bir kümelenmemiş dizin varsa, maliyetler kümelenmiş dizinden veri almaktan daha düşük olması koşuluyla SQL Server bunu plana dahil eder. İyileştirici daha sonra kullanılabilir seçenekler arasından en düşük maliyet planını seçer ve sorguyu yürütür.
Sorgu planları, verileri almak ve tahmini satır sayıları gibi bilgileri yakalamak için bir dizi ilişkisel işleci birleştirir. Yürütme planının bir diğer öğesi de verileri birleştirme veya sıralama gibi işlemler için gereken bellektir ve bellek verme olarak bilinir. Bellek izni, istatistiklerin önemini vurgular. SQL Server, bir işlecin aslında 100 satır döndürmesine rağmen 10.000.000 satır döndüreceğini tahmin ederse, sorguya daha büyük bir bellek payı ayrılır. Çok büyük bir bellek izni iki soruna neden olabilir. İlk olarak sorgu, SQL Server'ın büyük miktarda bellek ayırmasını beklediğini belirten bir RESOURCE_SEMAPHORE beklemeyle karşılaşabilir. SQL Server varsayılan olarak yürütmeden önce sorgu maliyetinin (saniye cinsinden) 25 katı kadar bekler ve 24 saate kadar bekler. İkincisi, sorgu yürütülürken yeterli bellek yoksa, çalışması bellekten daha yavaş olan "tempdb"ye taşınır.
Yürütme planı ayrıca veritabanı uyumluluk düzeyi, paralellik derecesi ve sorgu parametreleştirilmişse sağlanan parametreler gibi sorguyla ilgili diğer meta verileri de depolar.
Sorgu planları grafik gösterimde veya metin tabanlı biçimde görüntülenebilir. Metin tabanlı seçenekler SET komutları ile çağrılır ve yalnızca geçerli bağlantıya uygulanır. Bu planlar, T-SQL sorgularını çalıştırabileceğiniz her yerde görüntülenebilir.
Çoğu DBA, planın şekli de dahil olmak üzere planı bir bütün olarak görmenizi sağladığından grafik planları tercih eder. Grafik sorgu planlarını görüntülemenin ve kaydetmenin çeşitli yolları vardır. Bu amaca yönelik en yaygın araç SQL Server Management Studio'dur. Ayrıca, grafik yürütme planlarını görüntülemeyi destekleyen üçüncü taraf araçlar da vardır.
Üç farklı yürütme planı türü vardır.
Tahmini Yürütme Planı
Bu tür yürütme planı sorgu iyileştiricisi tarafından oluşturulur. Sorgu belleği verme işleminin meta verileri ve boyutu, sorgu derlemesi sırasında veritabanında bulunan istatistiklerden gelen tahminleri temel alır. Metin tabanlı tahmini planı görmek için sorguyu yürütmeden önce komutunu SET SHOWPLAN_ALL ON çalıştırın. Sorguyu çalıştırdığınızda yürütme planının adımlarını görürsünüz, ancak sorgu yürütülemez ve hiçbir sonuç görmezsiniz. Ayarı KAPALI duruma getirene kadar SET seçeneği etkin kalır.
Gerçek Yürütme Planı
Bu plan türü tahmini planla aynıdır; ancak sorgunun yürütme bağlamını da içerir. Bu bağlam tahmini ve gerçek satır sayılarını, tüm yürütme uyarılarını, gerçek paralellik derecesini (kullanılan işlemci sayısı) ve yürütme sırasında kullanılan geçen ve CPU sürelerini içerir. Metin tabanlı gerçek planı görmek için sorguyu yürütmeden önce komutunu SET STATISTICS PROFILE ON çalıştırın. Sorgu yürütülür ve hem planı hem de sonuçları alırsınız.
Canlı Sorgu İstatistikleri
Bu plan görüntüleme seçeneği, tahmini ve gerçek planları, işleçler aracılığıyla yürütme ilerlemesini gösteren animasyonlu bir plan olarak birleştirir. Her saniye yenilenerek, işleçler üzerinden akan verilerin gerçek satır sayısını gösterir. Canlı Sorgu İstatistikleri'nin bir diğer avantajı da işleçten işlece iletimi göstermesidir ve bu, performans sorunlarını giderirken yararlı olabilir. Bu plan türü animasyonlu olduğundan yalnızca grafik plan olarak kullanılabilir.