Tahmini ve gerçek sorgu planlarını açıklama
Gerçek ve tahmini yürütme planları kafa karıştırıcı olabilir. Aradaki fark, gerçek planın tahmini planda yakalanmamış çalışma zamanı istatistiklerini içermesidir. Kullanılan işleçler ve yürütme sırası, neredeyse tüm durumlarda tahmini planla aynı olacaktır. Bir diğer önemli nokta da gerçek bir yürütme planını yakalamanın sorgunun yürütülmesini gerektirdiğidir. Bu işlem zaman alabilir veya mümkün olmayabilir. Örneğin, bir deyim yalnızca bir UPDATE kez çalıştırılabilir. Ancak sorgu sonuçlarını ve planı görmeniz gerekiyorsa, gerçek plan seçeneklerinden birini kullanmanız gerekir.
Gösterildiği gibi, tahmini sorgu planı kutusu tarafından belirtilen düğmeyi seçerek (veya Control+L klavye komutunu kullanarak) SSMS'de tahmini bir plan oluşturabilirsiniz. Gösterilen simgeyi seçip (veya Control+M klavye komutunu kullanarak) ve ardından sorguyu yürüterek gerçek planı oluşturabilirsiniz. İki seçenek düğmesi farklı çalışır. Tahmini Sorgu Planını Dahil Et düğmesi vurgulanan tüm sorgulara (veya hiçbir şey vurgulanmamışsa çalışma alanının tamamına) hemen yanıt verirken, Gerçek Sorgu Planını Dahil Et düğmesi sorgunun yürütülmesini gerektirir.
Hem sorgu yürütme hem de tahmini yürütme planı oluşturmanın yükü vardır, bu nedenle yürütme planlarını görüntüleme işleminin üretim ortamında dikkatli bir şekilde yapılması gerekir.
Genellikle, sorgunuzu yazarken tahmini yürütme planını kullanarak performans özelliklerini anlayabilir, eksik dizinleri tanımlayabilir veya sorgu anomalilerini algılayabilirsiniz. Gerçek yürütme planı, sorgunun çalışma zamanı performansını ve en önemlisi, sorgu iyileştiricisinin kullanılabilir verileri temel alarak en iyi duruma getirici seçimler yapmasına neden olan istatistiksel verilerdeki boşlukları anlamak için kullanılır.
Sorgu planını okuma
Yürütme planları, bir sorguyu karşılamak için gereken verileri alırken veritabanı altyapısının hangi görevleri gerçekleştireceğini gösterir. Planı ayrıntılı olarak ele alalım.
SELECT [stockItemName]
,[UnitPrice] * [QuantityPerOuter] AS CostPerOuterBox
,[QuantityonHand]
FROM [Warehouse].[StockItems] s
JOIN [Warehouse].[StockItemHoldings] sh ON s.StockItemID = sh.StockItemID
ORDER BY CostPerOuterBox;
Bu sorgu, StockItems tablosunu StockItemID sütunundaki değerlerin eşit olduğu StockItemHoldings tablosuna katıyor. Veritabanı altyapısının sorgunun geri kalanını işleyebilmesi için önce bu satırları tanımlaması gerekir.
Plandaki her simge, yürütme planını oluşturan çeşitli eylemlere ve kararlara karşılık gelen belirli bir işlemi temsil eder. SQL Server veritabanı altyapısı, yürütme planının parçası olabilecek 100'den fazla sorgu işlecine sahiptir. Her işleç simgesinin altında, sorgunun toplam maliyetine göre bir maliyet yüzdesi vardır. 0% maliyeti gösteren bir işlem bile bazı maliyetleri temsil eder. Aslında 0% yuvarlamadan kaynaklanır; grafik plan maliyetleri her zaman tam sayı olarak gösterilir ve gerçek yüzde 0,5'ten küçük bir değerdir%.
Yürütme planındaki yürütme akışı sağdan sola ve yukarıdan aşağıyadır, bu nedenle bu planda StockItemHoldings.PK_Warehouse_StockItemHoldings kümelenmiş dizinindeki Kümelenmiş Dizin Tarama işlemi sorgudaki ilk işlemdir. İşleçleri bağlayan satırların genişlikleri, sonraki işlecine doğru akan tahmini veri satırlarının sayısını temel alır. Kalın ok, büyük işleç-işleç aktarımının göstergesidir ve sorguyu ayarlama fırsatının göstergesi olabilir. Ayrıca farenizi bir işlecin üzerinde tutabilir ve Araç İpucu'nda ek bilgileri görebilirsiniz.
Araç ipucu, tahmini plan için maliyeti ve tahminleri vurgular ve gerçek bir plan için gerçek satırlarla ve maliyetlerle karşılaştırmaları içerir. Her işleç, araç ipucundan daha fazla ayrıntı sağlayan özelliklere de sahiptir. Belirli bir işleci sağ tıklatarak bağlam menüsünden Özellikler seçeneğini belirleyerek tam özellik listesini görebilirsiniz. Bu seçenek SQL Server Management Studio'da varsayılan olarak sağ tarafta olan ayrı bir Özellikler bölmesi açar. Özellikler bölmesi açıldıktan sonra, herhangi bir işleç seçildiğinde Özellikler listesi söz konusu işlecin ayrıntılarıyla doldurulur. Alternatif olarak, ana SQL Server Management Studio menüsünde Görünüm'ü seçip Özellikler'i seçerek Özellikler bölmesini açabilirsiniz.
Özellikler bölmesi ek bilgiler içerir ve çıkış listesini gösterir ve sonraki işlecine geçirilen sütunların ayrıntılarını gösterir. Bu sütunlar kümelenmiş dizin taramasıyla analiz edildiğinde sorgu performansını geliştirmek için kümelenmemiş dizin gerektiğini gösterebilir. Kümelenmiş dizin tarama işlemi tablonun tamamını okuduğundan, her tablodaki StockItemID sütunundaki bir kümelenmemiş dizin bu senaryoda daha verimli olabilir.
Basit sorgu profili oluşturma
İster SSMS ister Genişletilmiş Olaylar izleme altyapısını kullanarak gerçek yürütme planları oluşturduğunuzda, önemli ek yük oluşturabilir. Bu nedenle, bu işlem genellikle canlı site sorun giderme çalışmaları için ayrılmıştır. Bilinen gözlemci ek yükü, çalışan bir uygulamayı izleme maliyetidir. Bazı senaryolarda bu maliyet CPU kullanımının yalnızca birkaç yüzdesi olabilir, ancak gerçek yürütme planlarını yakalama gibi diğer durumlarda tek tek sorgu performansını önemli ölçüde yavaşlatabilir. SQL Server altyapısındaki eski profil oluşturma, sorgu bilgilerini yakalamak için en fazla 75% ek yük oluştururken, basit profil oluşturmanın en fazla 2%ek yükü vardır.
Basit profil oluşturmanın ilk sürümünde satır sayısı ve G/Ç kullanım bilgilerini (veritabanı altyapısı tarafından belirli bir sorguyu karşılamak için gerçekleştirilen mantıksal ve fiziksel okuma ve yazma sayısı) topladı. Ayrıca, sorgu planındaki her işleçten gelen verilerin incelenmesine izin vermek için query_thread_profile adlı yeni bir genişletilmiş olay tanıtıldı. Basit profil oluşturmanın ilk sürümünde, özelliğin kullanılması için izleme bayrağı 7412'nin genel olarak etkinleştirilmesi gerekir.
Basit profil oluşturma genel olarak etkinleştirilmediyse, ile sorgu ipucunu USE HINTQUERY_PLAN_PROFILE kullanarak sorgu düzeyinde basit profil oluşturmayı etkinleştirebilirsiniz. Bu ipucuna sahip bir sorgu yürütmeyi tamamladığında, gerçek bir yürütme planı sağlayan query_plan_profile genişletilmiş bir olay oluşturulur. Aşağıda bu ipucuna sahip bir sorgu örneği verilmişti:
SELECT [stockItemName]
,[UnitPrice] * [QuantityPerOuter] AS CostPerOuterBox
,[ QuantityonHand]
FROM [Warehouse].[StockItems] s
JOIN [Warehouse].[StockItems] sh ON s.StockItemID = sh.StockItemID
ORDER BY CostPerOuterBox
OPTION(USE HINT ('QUERY_PLAN_PROFILE'));
Son sorgu planları istatistikleri
Basit profil oluşturma hem SQL Server 2019'da hem de Azure SQL Veritabanı'nda ve yönetilen örnekte varsayılan olarak etkinleştirilir. Basit profil oluşturma, adlı LIGHTWEIGHT_QUERY_PROFILINGveritabanı kapsamlı bir yapılandırma seçeneği olarak da kullanılabilir. Veritabanı kapsamlı seçeneğiyle, birbirinden bağımsız olarak kullanıcı veritabanlarınızdan herhangi biri için özelliği devre dışı bırakabilirsiniz.
Ayrıca, adlı sys.dm_exec_query_plan_statsbir dinamik yönetim işlevi vardır ve bu işlev, belirli bir plan tanıtıcısı için bilinen son gerçek sorgu yürütme planını gösterebilir. İşlev aracılığıyla bilinen son gerçek sorgu planını görmek için 2451 sunucu genelinde izleme bayrağını etkinleştirebilirsiniz. Alternatif olarak, adlı LAST_QUERY_PLAN_STATSveritabanı kapsamlı yapılandırma seçeneğini kullanarak bu işlevi etkinleştirebilirsiniz.
Önbelleğe alınan tüm sorgular için son yürütme planını almak için bu işlevi diğer nesnelerle birleştirebilirsiniz:
SELECT *
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
CROSS APPLY sys.dm_exec_query_plan_stats(plan_handle) AS qps;
GO
Bu işlevsellik, sisteminizdeki herhangi bir sorgunun son yürütmesine ilişkin çalışma zamanı istatistiklerini en düşük ek yükle hızla belirlemenize olanak tanır. Aşağıdaki görüntüde planın nasıl alınacakları gösterilmektedir. Sonuçların ilk sütunu olacak yürütme planı XML'sini seçerseniz, aşağıdaki ikinci görüntüde gösterilen yürütme planını görüntüler.
Aşağıdaki görüntüde Columnstore Dizin Taraması özelliklerinden görebileceğiniz üzere, önbellekten alınan planda sorguda getirilen gerçek satır sayısı belirtilmiştir.