Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Sorgu İyileştiricisi, sorgu performansını geliştiren sorgu planları oluşturmak için istatistikleri kullanır. Çoğu sorgu için Sorgu İyileştiricisi zaten yüksek kaliteli bir sorgu planı için gerekli istatistikleri oluşturur; bazı durumlarda ek istatistikler oluşturmanız veya en iyi sonuçları elde etmek için sorgu tasarımını değiştirmeniz gerekir. Bu makalede istatistik kavramları ele alınmaktadır ve sorgu iyileştirme istatistiklerini etkili bir şekilde kullanmaya yönelik yönergeler sağlanmaktadır.
Bileşenler ve kavramlar
Statistics
Sorgu iyileştirme istatistikleri, tablonun veya dizine alınan görünümün bir veya daha fazla sütunundaki değerlerin dağılımı hakkında istatistiksel bilgiler içeren ikili büyük nesnelerdir (BLOB'lar). Sorgu İyileştiricisi, sorgu sonucundaki kardinaliteyi veya satır sayısını tahmin etmek için bu istatistikleri kullanır. Bu kardinalite tahminleri , Sorgu İyileştiricisi'nin yüksek kaliteli bir sorgu planı oluşturmasını sağlar. Örneğin, koşullarınıza bağlı olarak Sorgu İyileştiricisi, daha yoğun kaynak kullanan dizin tarama işleci yerine dizin arama işlecini seçmek için kardinalite tahminlerini kullanabilir ve bunu yapmak sorgu performansını iyileştirebilir.
Her istatistik nesnesi bir veya daha fazla tablo sütunu listesinde oluşturulur ve ilk sütundaki değerlerin dağılımını gösteren bir histogram içerir. Birden çok sütundaki istatistik nesneleri, sütunlar arasındaki değerlerin bağıntısı hakkındaki istatistiksel bilgileri de depolar. Bu bağıntı istatistikleri veya yoğunluklar, sütun değerlerinin ayrı satırlarının sayısından türetilir.
Histogram
Histogram, bir veri kümesindeki her ayrı değer için oluşum sıklığını ölçer. Sorgu İyileştiricisi, istatistik nesnesinin ilk anahtar sütunundaki sütun değerleri üzerinde bir histogram hesaplar, satırlarda istatistiksel örnekleme yaparak veya tablodaki veya görünümdeki tüm satırların tam taramasını yaparak sütun değerlerini seçer. Histogram örneklenmiş bir satır kümesinden oluşturulduysa, satır sayısı ve ayrı değer sayısı için depolanan toplamlar tahmindir ve tamsayı olması gerekmez.
Note
SQL Server'daki histogramlar yalnızca istatistik nesnesinin anahtar sütunları kümesindeki ilk sütun olan tek bir sütun için oluşturulur.
Histogramı oluşturmak için Sorgu İyileştiricisi sütun değerlerini sıralar, her bir ayrı sütun değeriyle eşleşen değerlerin sayısını hesaplar ve sonra sütun değerlerini en fazla 200 bitişik histogram adımında toplar. Her histogram adımında bir sütun değerleri aralığı ve ardından bir üst sınır sütun değeri bulunur. Aralık, sınır değerlerinin kendileri hariç olmak üzere, sınır değerleri arasında yer alan tüm olası sütun değerlerini içerir. Sıralanmış sütun değerlerinin en alt kısmı, ilk histogram adımının üst sınır değeridir.
Daha ayrıntılı olarak, SQL Server üç adımda sıralanmış sütun değerleri kümesinden histogram oluşturur:
- Histogram başlatma: İlk adımda, sıralanmış kümenin başında başlayan bir değer dizisi işlenir ve en fazla 200 range_high_key, equal_rows, range_rows ve distinct_range_rows değeri toplanır (range_rows ve distinct_range_rows bu adım boyunca her zaman sıfırdır). İlk adım, tüm girişler tükendiğinde veya 200 değer bulunduğunda sona erer.
- Demet birleştirme ile tarama: İstatistik anahtarının öndeki sütunundaki her ek değer, ikinci adımda sıralı düzende işlenir; her ardışık değer son aralığa eklenir veya sonunda yeni bir aralık oluşturulur (giriş değerleri sıralandığından bu mümkündür). Yeni bir aralık oluşturulursa, mevcut komşu aralıklardan bir çift tek bir aralığa dönüştürülür. Bilgi kaybını en aza indirmek için bu aralık çifti seçilir. Bu yöntem, sınır değerleri arasındaki farkı en üst düzeye çıkarırken histogramdaki adım sayısını en aza indirmek için maksimum fark algoritması kullanır. Daraltılmış aralıklar sonrası adım sayısı bu adım boyunca 200 olarak kalır.
- Histogram birleştirme: Üçüncü adımda, önemli miktarda bilgi kaybolmazsa daha fazla aralık daraltılabilir. Histogram adımlarının sayısı, 200'den az sınır noktasına sahip sütunlar için bile farklı değerlerin sayısından daha az olabilir. Bu nedenle, sütunda 200'den fazla benzersiz değer olsa bile histogramda 200'den az adım olabilir. Yalnızca benzersiz değerlerden oluşan bir sütun için birleştirilmiş histogramda en az üç adım vardır.
Note
Histogram tam tarama yerine bir örnek kullanılarak oluşturulmuşsa equal_rows, range_rows, distinct_range_rows ve average_range_rows değerleri tahmin edilir ve bu nedenle tamsayılar olması gerekmez.
Aşağıdaki diyagramda altı adımlı bir histogram gösterilmektedir. İlk üst sınır değerinin solundaki alan ilk adımdır.
Önceki örnekteki her histogram adımı için:
Kalın çizgi, üst sınır değerini (range_high_key) ve oluşma sayısını (equal_rows) temsil eder
range_high_key'nin düz alanı, sütun değerleri aralığını ve her sütun değerinin ortalama kaç kez gerçekleştiğini (average_range_rows) temsil eder. İlk histogram adımının average_range_rows her zaman 0'dır.
Noktalı çizgiler, aralıktaki benzersiz değerlerin toplam sayısını (distinct_range_rows) ve aralıktaki toplam değer sayısını (range_rows) tahmin etmek için kullanılan örneklenmiş değerleri temsil eder. Sorgu İyileştiricisi range_rows ve distinct_range_rows kullanarak average_range_rows hesaplar ve örneklenen değerleri depolamaz.
Yoğunluk vektöru
Yoğunluk , belirli bir sütundaki yineleme sayısı veya sütun birleşimi hakkında bilgidir ve 1/(ayrı değer sayısı) olarak hesaplanır. Sorgu İyileştiricisi, aynı tablodan veya dizine alınan görünümden birden çok sütun döndüren sorgular için kardinalite tahminlerini geliştirmek için yoğunlukları kullanır. Yoğunluk azaldıkça değerin seçiciliği artar. Örneğin, arabaları temsil eden bir tabloda, birçok araba aynı üreticiye sahiptir, ancak her arabanın benzersiz bir araç kimlik numarası (VIN) vardır. VIN üzerindeki bir dizin, üreticideki bir dizinden daha seçicidir, çünkü VIN üreticiden daha düşük yoğunluğa sahiptir.
Note
Sıklık, istatistik nesnesinin ilk anahtar sütunundaki her ayrı değerin oluşumuyla ilgili bilgilerdir ve olarak row count * densityhesaplanır. Benzersiz değerlere sahip sütunlarda en fazla 1 sıklığı bulunabilir.
Yoğunluk vektöru, istatistik nesnesindeki her sütun ön eki için bir yoğunluk içerir. Örneğin, bir istatistik nesnesinin anahtar sütunları CustomerIdItemId varsa ve Priceyoğunluk aşağıdaki sütun ön eklerinin her birinde hesaplanır.
| Sütun ön eki | Yoğunluk hesaplandı |
|---|---|
(CustomerId) |
için eşleşen değerlere sahip satırlar CustomerId |
(CustomerId, ItemId) |
CustomerId ve ItemId için eşleşen değerlere sahip satırlar |
(CustomerId, ItemId, Price) |
CustomerId, ItemId, ve Price için eşleşen değerlere sahip satırlar |
Filtrelenmiş istatistikler
Filtrelenmiş istatistikler, iyi tanımlanmış veri alt kümelerinden seçim yapılan sorgular için sorgu performansını geliştirebilir. Filtrelenmiş istatistikler, istatistiklere dahil edilen verilerin alt kümesini seçmek için bir filtre koşulu kullanır. İyi tasarlanmış filtrelenmiş istatistikler, tam tablo istatistikleriyle karşılaştırıldığında sorgu yürütme planını iyileştirebilir. Filtre koşulu hakkında daha fazla bilgi için bkz. CREATE STATISTICS. Filtrelenmiş istatistiklerin ne zaman oluşturulacağı hakkında daha fazla bilgi için, bu makalenin İstatistik oluşturma zamanları bölümüne bakın.
İstatistik seçenekleri
İstatistiklerin ne zaman ve nasıl oluşturulup güncelleştirildiğini etkileyen seçenekler vardır. Bu seçenekler yalnızca veritabanı düzeyinde yapılandırılabilir.
AUTO_CREATE_STATISTICS seçeneği
İstatistikleri otomatik oluştur seçeneği AUTO_CREATE_STATISTICS ON olduğunda, Sorgu İyileştiricisi sorgu planı için kardinalite tahminlerini geliştirmek için gerektiğinde sorgu koşulundaki tek tek sütunlar üzerinde istatistikler oluşturur. Bu tek sütunlu istatistikler, mevcut istatistik nesnesinde histogramı olmayan sütunlarda oluşturulur. seçeneği AUTO_CREATE_STATISTICS , dizinler için istatistiklerin oluşturulup oluşturulmayacağını belirlemez. Bu seçenek ayrıca filtrelenmiş istatistikler oluşturmaz. Tam tablo için tek sütunlu istatistikler için kesinlikle geçerlidir.
Sorgu İyileştiricisi AUTO_CREATE_STATISTICS seçeneğini kullanarak istatistikler oluşturduğunda, istatistik adı _WA başlar. Sorgu İyileştirici'nin bir sorgu koşulu sütunu için istatistik oluşturup oluşturmadığını belirlemek için aşağıdaki sorguyu kullanabilirsiniz.
SELECT OBJECT_NAME(s.object_id) AS object_name,
COL_NAME(sc.object_id, sc.column_id) AS column_name,
s.name AS statistics_name
FROM sys.stats AS s
INNER JOIN sys.stats_columns AS sc
ON s.stats_id = sc.stats_id
AND s.object_id = sc.object_id
WHERE s.name LIKE '_WA%'
ORDER BY s.name;
AUTO_UPDATE_STATISTICS seçeneği
otomatik güncelleştirme istatistikleri seçeneği AUTO_UPDATE_STATISTICS ON olduğunda, Sorgu İyileştiricisi istatistiklerin ne zaman güncel olabileceğini belirler ve sorgu tarafından kullanıldığında bunları güncelleştirir. Bu eylem istatistik yeniden derlemesi olarak da bilinir. Ekleme, güncelleştirme, silme veya birleştirme işlemlerinde yapılan değişiklikler tablodaki veya dizinli görünümdeki veri dağıtımını değiştirdikten sonra istatistikler güncel değildir. Sorgu İyileştiricisi, son istatistik güncelleştirmesi sonrasındaki satır değişikliği sayısını sayarak ve satır değişikliği sayısını bir eşikle karşılaştırarak istatistiklerin ne zaman güncel olabileceğini belirler. Eşik, tablodaki veya dizinli görünümdeki satır sayısı olarak tanımlanabilen tablo kardinalitesini temel alır.
Seçenek AUTO_UPDATE_STATISTICS KAPALI olsa da satır değişiklikleri temel alındığında istatistiklerin güncel değil olarak işaretlenmesi gerçekleşir.
AUTO_UPDATE_STATISTICS Seçenek KAPALI olduğunda istatistikler güncel değil olarak işaretlendiğinde bile güncelleştirilmez. Planlar güncel olmayan istatistik nesnelerini kullanmaya devam eder. KAPALI olarak ayarlanması AUTO_UPDATE_STATISTICS , yetersiz sorgu planlarına ve düşük sorgu performansına neden olabilir. SeçeneğiN AUTO_UPDATE STATISTICS ON olarak ayarlanması önerilir.
SQL Server 2014'e (12.x) kadar Veritabanı Altyapısı, istatistiklerin değerlendirildiği sırada tablodaki veya dizine alınmış görünümdeki satır sayısına göre bir yeniden derleme eşiği kullanır. Bir tablonun geçici veya kalıcı olmasına bağlı olarak eşik farklıdır.
Tablo türü Tablo kardinalitesi (n) Yeniden derleme eşiği (# değişiklik) Temporary n< 6 6 Temporary 6 <= n<= 500 500 Permanent n<= 500 500 Geçici veya kalıcı n> 500 500 + (0,20 * n) Örneğin tablonuzda 20 bin satır varsa hesaplama yapılır
500 + (0.2 * 20,000) = 4,500ve istatistikler 4.500 değişiklikte bir güncelleştirilir.SQL Server 2016'dan (13.x) başlayarak ve veritabanı uyumluluk düzeyi 130 ile Veritabanı Altyapısı, istatistiklerin değerlendirildiği zamandaki tablo kardinalitesine göre ayarlanan azalan, dinamik istatistik yeniden derleme eşiğini de kullanır. Bu değişiklikle, büyük tablolardaki istatistikler daha sık güncelleştirilir. Ancak, bir veritabanının uyumluluk düzeyi 130'un altındaysa SQL Server 2014 (12.x) eşikleri uygulanır.
Tablo türü Tablo kardinalitesi (n) Yeniden derleme eşiği (# değişiklik) Temporary n < 66 Temporary 6 <= n <= 500500 Permanent n <= 500500 Geçici veya kalıcı n > 500MIN ( 500 + (0.20 * n), SQRT(1,000 * n) )Örneğin, tablonuzda 2 milyon satır varsa, hesaplama
500 + (0.20 * 2,000,000) = 400,500veSQRT(1,000 * 2,000,000) = 44,721değerlerinin en küçüğü olur. Bu, istatistiklerin her 44.721 değişiklikte güncelleştirilmiş olduğu anlamına gelir.
Important
SQL Server 2008 R2(10.50.x) ile SQL Server 2014 (12.x) arasında veya VERITABANı uyumluluk düzeyi 120 ve daha düşük olan SQL Server 2016 (13.x) ve sonraki sürümlerde, SQL Server'ın azalan, dinamik istatistik güncelleştirme eşiği kullanması için izleme bayrağı 2371'i etkinleştirin.
Tüm senaryolar için önerilir ancak izleme bayrağı 2371'i etkinleştirmek isteğe bağlıdır. Ancak, SQL Server 2016 öncesi (13.x) ortamınızda izleme bayrağı 2371'i etkinleştirmek için aşağıdaki kılavuzu kullanabilirsiniz:
- SAP sistemindeyseniz bu izlemeyi etkinleştirin. Daha fazla bilgi için 2371 izleme bayrağı ile ilgili bu bloğa bakın.
- Gece çalışan göreve istatistikleri güncellemek için güvenmeniz gerekiyorsa ve geçerli otomatik güncelleştirme yeterince sık tetiklenmiyorsa, eşik değerini tablo kardinalitesine ayarlamak için izleme bayrağı 2371'i etkinleştirmeyi göz önünde bulundurun.
Sorgu İyileştiricisi, sorgu derlemeden önce ve önbelleğe alınmış bir sorgu planını yürütmeden önce güncel olmayan istatistikleri denetler. Sorguyu derlemeden önce, Sorgu İyileştiricisi hangi istatistiklerin güncel olmayabileceğini belirlemek için sorgu koşulundaki sütunları, tabloları ve dizine alınan görünümleri kullanır. Veritabanı Altyapısı, önbelleğe alınmış bir sorgu planını yürütmeden önce sorgu planının up-totarih istatistiklerine başvurduğunu doğrular.
AUTO_UPDATE_STATISTICS seçeneği dizinler için oluşturulan istatistik nesneleri, sorgu koşullarında tek sütunlar ve CREATE STATISTICS deyimiyle oluşturulan istatistikler için geçerlidir. Bu seçenek filtrelenmiş istatistikler için de geçerlidir.
Tabloda değiştirilen satır sayısını doğru bir şekilde izlemek ve istatistikleri el ile güncelleştirmek isteyip istemediğinize karar vermek için sys.dm_db_stats_properties kullanabilirsiniz.
AUTO_UPDATE_STATISTICS, bellek için iyileştirilmiş tablolar için her zaman KAPALI olur.
AUTO_UPDATE_STATISTICS_ASYNC
AUTO_UPDATE_STATISTICS_ASYNC zaman uyumsuz istatistik güncelleştirme seçeneği, Sorgu İyileştiricisi'nin zaman uyumlu veya zaman uyumsuz istatistik güncelleştirmeleri kullanıp kullanmadığını belirler. Varsayılan olarak zaman uyumsuz istatistik güncelleştirme seçeneği KAPALI'dır ve Sorgu İyileştiricisi, istatistikleri zaman uyumlu olarak güncelleştirir. AUTO_UPDATE_STATISTICS_ASYNC seçeneği dizinler için oluşturulan istatistik nesneleri, sorgu koşullarındaki tek sütunlar ve CREATE STATISTICS deyimiyle oluşturulan istatistikler için geçerlidir.
Note
SQL Server Management Studio'da zaman uyumsuz istatistik güncelleştirme seçeneğini ayarlamak için, Veritabanı Özellikleri penceresinin Seçenekler sayfasında hem Otomatik Güncelleştirme İstatistikleri hem de Otomatik Güncelleştirme İstatistikleri Zaman Uyumsuz seçeneklerininTrue olarak ayarlanması gerekir.
İstatistik güncelleştirmeleri zaman uyumlu (varsayılan) veya zaman uyumsuz olabilir.
Zaman uyumlu istatistik güncelleştirmeleriyle sorgular her zaman up-totarih istatistikleriyle derlenir ve yürütülür. İstatistikler güncel olmadığında, Sorgu İyileştiricisi sorguyu derlemeden ve yürütmeden önce güncelleştirilmiş istatistikleri bekler.
Zaman uyumsuz istatistik güncelleştirmeleriyle, mevcut istatistikler güncel olmasa bile sorgular mevcut istatistiklerle derlenir. Sorgu derlendiğinde istatistikler güncel değilse, Sorgu İyileştiricisi daha az uygun bir sorgu planı seçebilir. İstatistikler genellikle kısa süre sonra güncelleştirilir. İstatistik güncelleştirmeleri tamamlandıktan sonra derlenen sorgular, güncelleştirilmiş istatistiklerin kullanılmasından yararlanıyor.
Bir tabloyu kesme veya satırların büyük bir yüzdesinin toplu güncelleştirmesini gerçekleştirme gibi veri dağıtımını değiştiren işlemler gerçekleştirirken zaman uyumlu istatistikleri kullanmayı göz önünde bulundurun. İşlemi tamamladıktan sonra istatistikleri el ile güncelleştirmezseniz, zaman uyumlu istatistiklerin kullanılması, değiştirilen veriler üzerinde sorgular yürütülmeden önce istatistiklerin up-totarih olmasını sağlar.
Aşağıdaki senaryolarda daha öngörülebilir sorgu yanıt süreleri elde etmek için zaman uyumsuz istatistikler kullanmayı göz önünde bulundurun:
Uygulamanız sık sık aynı sorguyu, benzer sorguları veya benzer önbelleğe alınmış sorgu planlarını yürütür. Sorgu İyileştiricisi, up-totarih istatistiklerini beklemeden gelen sorguları yürütebildiğinden, sorgu yanıt süreleriniz zaman uyumsuz istatistik güncellemeleriyle zaman uyumlu istatistik güncellemelerine oranla daha öngörülebilir olabilir. Bu, bazı sorguları geciktirirken diğerlerini geciktirmemekten kaçınır.
Uygulamanız güncelleştirilmiş istatistikleri bekleyen bir veya daha fazla sorgudan kaynaklanan istemci isteği zaman aşımlarıyla karşılaşmış. Bazı durumlarda, senkron istatistikleri beklemek, sıkı zaman aşımı sürelerine sahip uygulamaların başarısız olmasına neden olabilir.
Note
Yerel geçici tablolarla ilgili istatistikler, AUTO_UPDATE_STATISTICS_ASYNC seçenek ne olursa olsun her zaman zaman zaman uyumlu olarak güncelleştirilir. Genel geçici tablolarla ilgili istatistikler, kullanıcı veritabanı için ayarlanan AUTO_UPDATE_STATISTICS_ASYNC seçeneğine göre zaman uyumlu veya zaman uyumsuz olarak güncelleştirilir.
Zaman uyumsuz istatistik güncelleştirmesi bir arka plan isteği tarafından gerçekleştirilir. İstek veritabanına güncelleştirilmiş istatistikler yazmaya hazır olduğunda, istatistik meta veri nesnesi üzerinde bir şema değişiklik kilidi almaya çalışır. Farklı bir oturum aynı nesne üzerinde zaten kilit tutuyorsa, şema değişiklik kilidi alınıncaya kadar zaman uyumsuz istatistik güncelleştirmesi engellenir. Benzer şekilde, bir sorguyu derlemek için istatistik meta veri nesnesinde şema kararlılığı (Sch-S) kilidi alması gereken oturumlar, şema değişikliği kilidini halihazırda tutan veya almayı bekleyen asenkron istatistik güncelleştirme arka plan oturumu tarafından engellenebilir. Bu nedenle, sık sık sorgu derlemeleri ve sık güncellenen istatistiklere sahip iş yükleri için asenkron istatistiklerin kullanılması, kilitlenme engellemesi nedeniyle eşzamanlılık sorunları olasılığını artırabilir.
Azure SQL Veritabanı'nda, Azure SQL Yönetilen Örneği'nde ve SQL Server 2022'de (16.x) başlayarak, ASYNC_STATS_UPDATE_WAIT_AT_LOW_PRIORITY veritabanı kapsamlı yapılandırmasını etkinleştirirseniz zaman uyumsuz istatistik güncelleştirmesini kullanarak olası eşzamanlılık sorunlarını önleyebilirsiniz. Bu yapılandırma etkinleştirildiğinde, arka plan isteği şema değişikliğini (Sch-M) kilitleyip güncelleştirilmiş istatistikleri ayrı bir düşük öncelikli kuyrukta kalıcı hale getirmek için bekler ve diğer isteklerin mevcut istatistiklerle sorgu derlemeye devam etmelerine olanak tanır. İstatistik meta verileri nesnesi üzerinde başka hiçbir oturum kilit tutmadıktan sonra, arka plan isteği şema değişikliği kilidini alır ve istatistikleri güncelleştirir. Arka plan isteğinin birkaç dakikalık bir zaman aşımı süresi içinde kilidi alamama olasılığı düşük olduğunda, zaman uyumsuz istatistik güncelleştirmesi durdurulacak ve başka bir otomatik istatistik güncelleştirmesi tetiklenene kadar veya istatistikler el ile güncelleştirilene kadar istatistikler güncelleştirilmez.
Note
ASYNC_STATS_UPDATE_WAIT_AT_LOW_PRIORITY veritabanı kapsamlı yapılandırma seçeneği Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve SQL Server 2022 (16.x) ile başlayan SQL Server'da kullanılabilir.
AUTO_DROP seçeneği
Şunlar için geçerlidir: Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve SQL Server 2022 (16.x) ile başlayarak
SQL Server'da SQL Server 2022'den (16.x) önce, istatistikler kullanıcı veritabanındaki bir kullanıcı veya üçüncü taraf aracı tarafından el ile oluşturulduysa, bu istatistik nesneleri isteyebileceğiniz şema değişikliklerini engelleyebilir veya bu değişiklikleri engelleyebilir.
SQL Server 2022 'den (16.x) başlayarak, otomatik bırakma seçeneği tüm yeni ve geçirilen veritabanlarında varsayılan olarak etkinleştirilir.
AUTO_DROP özelliği, bir modda istatistik nesnelerinin oluşturulmasına izin verir, böylece sonraki şema değişikliği istatistik nesnesi tarafından engellenmez, bunun yerine istatistikler gerektiği gibi bırakılır. Bu şekilde, otomatik silme etkin olan el ile oluşturulan istatistikler, otomatik oluşturulan istatistikler gibi davranır.
Azure SQL Veritabanı, Azure SQL Yönetilen Örneği ve SQL Server 2022 (16.x) ve sonraki sürümlerde otomatik olarak oluşturulan istatistikler her zaman AUTO_DROP ayarlanmış gibi davranır.
Note
Otomatik oluşturulan istatistiklerde otomatik bırakma özelliğini ayarlamaya veya kaldırmaya çalışmak hatalara neden olabilir. Otomatik oluşturulan istatistikler her zaman otomatik bırakma kullanır. Bazı yedeklemeler, geri yüklendiğinde istatistik nesnesinin bir sonraki güncelleştirilişine kadar (el ile veya otomatik olarak) bu özelliğin yanlış ayarlanmasını sağlayabilir. Ancak, otomatik oluşturulan istatistikler her zaman otomatik bırakma istatistikleri gibi davranır. Veritabanını önceki bir sürümden SQL Server 2022'ye (16.x) geri yüklerken, istatistiklerin otomatik olarak bırakılması özelliği için uygun meta verileri ayarlamak amacıyla sp_updatestats komutunun veritabanında çalıştırılması önerilir.
Örneğin, tabloda el ile bir istatistik nesnesi dbo.DatabaseLog oluşturmak için:
CREATE STATISTICS [mystats]
ON [dbo].[DatabaseLog]([DatabaseLogID], [PostTime], [DatabaseUser])
WITH AUTO_DROP = ON;
Örneğin, tablodaki dbo.DatabaseLog bir istatistik nesnesi otomatik bırakma ayarını güncelleştirmek için:
UPDATE STATISTICS [dbo].[DatabaseLog] ([mystats])
WITH AUTO_DROP = ON;
Mevcut istatistiklerde otomatik bırakma ayarını değerlendirmek için auto_drop içindeki sütunu sys.stats kullanın.
SELECT object_id,
[name],
auto_drop
FROM sys.stats;
Daha fazla bilgi için bkz. AUTO_DROP.
INCREMENTAL
için geçerlidir: SQL Server 2014 (12.x) ve sonraki sürümler.
CREATE STATISTICS'ın ARTıMLı seçeneği ON olduğunda, oluşturulan istatistikler bölüm istatistiklerine göredir. Kapalı olduğunda, istatistik ağacı kaldırılır ve SQL Server istatistikleri yeniden hesaplar. Varsayılan değer KAPALI'dır. Bu ayar veritabanı düzeyi INCREMENTAL özelliğini geçersiz kılar. Artımlı istatistikler oluşturma hakkında daha fazla bilgi için bkz. CREATE STATISTICS. Bölüm başına istatistikleri otomatik olarak oluşturma hakkında daha fazla bilgi için bkz. Veritabanı Özellikleri (Seçenekler Sayfası) ve ALTER DATABASE SET seçenekleri.
Büyük bir tabloya yeni bölümler eklendiğinde, istatistikler yeni bölümleri içerecek şekilde güncelleştirilmelidir. Ancak tablonun tamamını (FULLSCAN veya SAMPLE seçenekleri) taramak için gereken süre oldukça uzun olabilir. Ayrıca, yalnızca yeni bölümlere ilişkin istatistikler gerekebileceğinden tablonun tamamını taramak gerekli değildir. Artımlı seçenek, bölüm bazında istatistikleri oluşturur ve depolar ve güncelleştirildiğinde yalnızca yeni istatistik gerektiren bölümlere ilişkin istatistikleri yeniler
Bölüm başına istatistikler desteklenmiyorsa, seçenek yoksayılır ve bir uyarı oluşturulur. Artımlı istatistikler aşağıdaki istatistik türleri için desteklenmez:
- Temel tabloyla bölümle hizalanmamış dizinlerle oluşturulan istatistikler.
- Always On okunabilir ikincil veritabanlarında oluşturulan istatistikler.
- Salt okunur veritabanlarında oluşturulan istatistikler.
- Filtrelenmiş dizinlerde oluşturulan istatistikler.
- Görünümlerde oluşturulan istatistikler.
- İç tablolarda oluşturulan istatistikler.
- Uzamsal dizinler veya XML dizinleriyle oluşturulan istatistikler.
İstatistikler ne zaman oluşturulur?
Sorgu İyileştiricisi aşağıdaki yollarla zaten istatistikler oluşturur:
Sorgu İyileştiricisi, dizin oluşturulduğunda tablo veya görünümlerdeki dizinler için istatistikler oluşturur. Bu istatistikler dizinin anahtar sütunlarında oluşturulur. Dizin filtrelenmiş bir dizinse, Sorgu İyileştiricisi filtrelenmiş dizin için belirtilen satırların aynı alt kümesinde filtrelenmiş istatistikler oluşturur. Filtrelenmiş dizinler hakkında daha fazla bilgi için bkz. Filtrelenmiş dizinler oluşturma ve İNDİS OLUŞTURMA.
Note
SQL Server 2014 (12.x) ve sonraki sürümlerinde, bölümlenmiş dizin oluşturulduğunda veya yeniden oluşturulduğunda tablodaki tüm satırlar taranarak istatistikler oluşturulmaz. Bunun yerine, Sorgu İyileştiricisi istatistik oluşturmak için varsayılan örnekleme algoritmasını kullanır. Bölümlenmiş dizinlere sahip bir veritabanını yükselttikten sonra, bu dizinlerin histogram verilerinde bir fark fark edebilirsiniz. Davranıştaki bu değişiklik sorgu performansını etkilemeyebilir. Tablodaki tüm satırları tarayarak bölümlenmiş dizinlerle ilgili istatistikleri almak için
CREATE STATISTICSyan tümcesiyleUPDATE STATISTICSveyaFULLSCANkullanın.Sorgu İyileştiricisi, AUTO_CREATE_STATISTICS açıkken sorgu koşullarındaki tek sütunlar için istatistikler oluşturur.
Çoğu sorguda, istatistik oluşturmaya yönelik bu iki yöntem yüksek kaliteli bir sorgu planı sağlar; birkaç durumda CREATE STATISTICS deyimiyle ek istatistikler oluşturarak sorgu planlarını geliştirebilirsiniz. Bu ek istatistikler, Sorgu İyileştiricisi'nin dizinler veya tek sütunlar için istatistikler oluşturduğunda hesaba katmadığı istatistiksel bağıntıları yakalayabilir. Uygulamanızın tablo verilerinde, istatistik nesnesi olarak hesaplanması durumunda Sorgu İyileştiricisi'nin sorgu planlarını geliştirmesine olanak tanıyabilecek ek istatistiksel bağıntılar olabilir. Örneğin, veri satırlarının bir alt kümesinde filtrelenmiş istatistikler veya sorgu koşulu sütunlarında çok sütunlu istatistikler sorgu planını iyileştirebilir.
CREATE STATISTICS deyimiyle istatistik oluştururken, Sorgu İyileştiricisi'nin sorgu koşulu sütunları için düzenli olarak tek sütunlu istatistikler oluşturmaya devam etmesi için AUTO_CREATE_STATISTICS seçeneğini AÇıK tutmanızı öneririz. Sorgu koşulları hakkında daha fazla bilgi için bkz . Arama koşulu.
Aşağıdakilerden herhangi biri geçerli olduğunda CREATE STATISTICS deyimiyle istatistik oluşturmayı göz önünde bulundurun:
- Veritabanı Altyapısı Ayarlama Danışmanı istatistik oluşturmayı önerir.
- Sorgu koşulu, aynı dizinde henüz anahtar olmayan birden çok bağıntılı sütun içerir.
- Sorgu, verilerin bir alt kümesinden seçer.
- Sorguda eksik istatistikler var.
Note
OLTP ile ilgili In-Memory tablo ve istatistiklere özgü bilgiler için bkz. Memory-Optimized Tabloları için İstatistikler.
Sorgu Koşulu birden çok bağıntılı sütun içeriyor
Sorgu koşulu, çapraz sütun ilişkileri ve bağımlılıkları olan birden çok sütun içerdiğinde, birden çok sütundaki istatistikler sorgu planını iyileştirebilir. Birden çok sütundaki istatistikler, tek sütunlu istatistiklerde bulunmayan , yoğunluklar olarak adlandırılan çapraz sütun bağıntı istatistikleri içerir. Sorgu sonuçları birden çok sütun arasındaki veri ilişkilerine bağlı olduğunda yoğunluklar kardinalite tahminlerini iyileştirebilir.
Sütunlar zaten aynı dizindeyse, çok sütunlu istatistik nesnesi zaten var olur ve el ile oluşturulması gerekmez. Sütunlar henüz aynı dizinde değilse, sütunlarda bir dizin oluşturarak veya CREATE STATISTICS deyimini kullanarak çok sütunlu istatistikler oluşturabilirsiniz. Dizin tutmak için istatistik nesnesine göre daha fazla sistem kaynağı gerekir. Uygulama çok sütunlu dizin gerektirmiyorsa, dizin oluşturmadan istatistik nesnesini oluşturarak sistem kaynaklarını ekonomikleştirebilirsiniz.
Çok sütunlu istatistikler oluşturduğunuzda, istatistik nesnesi tanımındaki sütunların sırası kardinalite tahminleri yapmak için yoğunlukların etkinliğini etkiler. İstatistik nesnesi, istatistik nesnesi tanımındaki anahtar sütunların her ön ekinin yoğunluklarını depolar. Yoğunluklar hakkında daha fazla bilgi için bu sayfadaki Yoğunluk bölümüne bakın.
Kardinalite tahminlerinde yararlı olan yoğunluklar oluşturmak için sorgu koşulundaki sütunların istatistik nesnesi tanımındaki sütunların ön eklerinden biriyle eşleşmesi gerekir. Örneğin, aşağıdaki örnek LastName, MiddleName ve FirstName sütunlarında çok sütunlu bir istatistik nesnesi oluşturur.
USE AdventureWorks2022;
GO
IF EXISTS (SELECT name
FROM sys.stats
WHERE name = 'LastFirst'
AND object_ID = OBJECT_ID('Person.Person'))
DROP STATISTICS Person.Person.LastFirst;
GO
CREATE STATISTICS LastFirst
ON Person.Person(LastName, MiddleName, FirstName);
GO
Bu örnekte, istatistik nesnesi LastFirst şu sütun ön ekleri için yoğunluklara sahiptir: (LastName), (LastName, MiddleName)ve (LastName, MiddleName, FirstName).
(LastName, FirstName) için yoğunluk mevcut değil. Eğer sorgu LastName kullanmadan FirstName ve MiddleName kullanırsa, yoğunluk kardinalite tahminleri için mevcut değildir.
Sorgu Bir veri alt kümesinden seçer
Sorgu İyileştiricisi tek sütunlar ve dizinler için istatistikler oluşturduğunda, tüm satırlardaki değerlerin istatistiklerini oluşturur. Sorgular bir satır alt kümesinden seçim yaparken ve bu satır alt kümesi benzersiz bir veri dağıtımına sahip olduğunda, filtrelenmiş istatistikler sorgu planlarını iyileştirebilir. Filtre koşulu ifadesini tanımlamak için WHERE yan tümcesiyle CREATE STATISTICS deyimini kullanarak filtrelenmiş istatistikler oluşturabilirsiniz.
Örneğin, AdventureWorks2025 kullanıldığında, tablodaki her ürün tablodaki Production.Product dört kategoriden Production.ProductCategory birine aittir: Bikes, Components, Clothingve Accessories. Kategorilerin her biri ağırlık için farklı bir veri dağılımına sahiptir: bisiklet ağırlıkları 13,77 ile 30,0 arasında, bileşen ağırlıkları 2,12 ile 1050,00 arasında ve bazı NULL değerlerle birlikte, giyim ağırlıklarının tümü NULLve aksesuar ağırlıkları da NULLvardır.
Bikes Örnek olarak, tüm bisiklet ağırlıklarıyla ilgili filtrelenmiş istatistikler Sorgu İyileştiricisi'ne daha doğru istatistikler sağlar ve sorgu planı kalitesini, Ağırlık sütunundaki tam tablo istatistikleri veya var olmayan istatistiklerle karşılaştırıldığında iyileştirebilir. Bisiklet ağırlığı sütunu, filtrelenmiş istatistikler için iyi bir adaydır, ancak ağırlık aramalarının sayısı görece küçükse filtrelenmiş dizin için iyi bir aday olmayabilir. Filtrelenmiş dizinin sağladığı aramalar için performans kazancı, veritabanına filtrelenmiş dizin eklemeye yönelik ek bakım ve depolama maliyetinden daha yüksek olmayabilir.
Aşağıdaki deyim, BikeWeights için Bikestüm alt kategorilerde filtrelenmiş istatistikleri oluşturur. Filtrelenmiş ifade, tüm bisiklet alt kategorilerini karşılaştırma Production.ProductSubcategoryID IN (1,2,3) ile listeleyerek bisikletleri tanımlar. Koşul, tabloda depolandığından Bikes ve filtre ifadesindeki tüm sütunların Production.ProductCategory aynı tabloda olması gerektiğinden kategori adını kullanamıyor.
USE AdventureWorks2022;
GO
IF EXISTS ( SELECT name FROM sys.stats
WHERE name = 'BikeWeights'
AND object_ID = OBJECT_ID ('Production.Product'))
DROP STATISTICS Production.Product.BikeWeights;
GO
CREATE STATISTICS BikeWeights
ON Production.Product (Weight)
WHERE ProductSubcategoryID IN (1,2,3);
GO
Sorgu Optimizatörü, aşağıdaki sorgu için sorgu planını daha iyi hale getirmek amacıyla, BikeWeights'dan fazla ağırlığa sahip tüm bisikletleri seçen ve 25 filtrelenmiş istatistikleri kullanabilir.
SELECT P.Weight AS Weight,
S.Name AS BikeName
FROM Production.Product AS P
INNER JOIN Production.ProductSubcategory AS S
ON P.ProductSubcategoryID = S.ProductSubcategoryID
WHERE P.ProductSubcategoryID IN (1, 2, 3)
AND P.Weight > 25
ORDER BY P.Weight;
GO
Sorgu eksik istatistikleri tanımlar
Bir hata veya başka bir olay Sorgu İyileştiricisi'nin istatistik oluşturmasını engelliyorsa, Sorgu İyileştiricisi istatistik kullanmadan sorgu planını oluşturur. Sorgu İyileştiricisi istatistikleri eksik olarak işaretler ve sorgunun bir sonraki yürütülmesinde istatistikleri yeniden oluşturma girişiminde bulunur.
Sql Server Management Studio kullanılarak bir sorgunun yürütme planı grafik olarak görüntülendiğinde eksik istatistikler uyarı (kırmızı metinde tablo adı) olarak gösterilir. Ayrıca, SQL Server Profiler kullanarak Eksik Sütun İstatistikleri olay sınıfını izlemek istatistiklerin ne zaman eksik olduğunu gösterir. Daha fazla bilgi için bkz. Hatalar ve Uyarılar Olay Kategorisi (Veritabanı Altyapısı).
İstatistikler eksikse aşağıdaki adımları uygulayın:
- AUTO_CREATE_STATISTICS ve AUTO_UPDATE_STATISTICS AÇıK olduğunu doğrulayın.
- Veritabanının salt okunur olmadığını doğrulayın. Veritabanı salt okunursa, yeni bir istatistik nesnesi kaydedilemez.
- CREATE STATISTICS deyimini kullanarak eksik istatistikleri oluşturun.
Geçici istatistikler
Salt okunur bir veritabanında veya salt okunur anlık görüntüde istatistikler eksik veya eski olduğunda, Veritabanı Altyapısı içinde tempdbgeçici istatistikler oluşturur ve korur. Veritabanı Altyapısı geçici istatistikler oluşturduğunda, geçici istatistikleri kalıcı istatistiklerden ayırt etmek için istatistik adı _readonly_database_statistic soneki eklenir. sonek _readonly_database_statistic , Veritabanı Altyapısı tarafından oluşturulan istatistikler için ayrılmıştır. Geçici istatistikler için betikler bir okuma-yazma veritabanında oluşturulabilir ve yürütülebilir. Komut dosyası kullanıldığında, Management Studio istatistik adının son ekini _readonly_database_statistic yerine _readonly_database_statistic_scripted olarak değiştirir.
Yalnızca Veritabanı Altyapısı geçici istatistikler oluşturabilir ve güncelleştirebilir. Ancak, kalıcı istatistikler için kullandığınız araçları kullanarak geçici istatistikleri silebilir ve istatistik özelliklerini izleyebilirsiniz:
- DROP STATISTICS deyimini kullanarak geçici istatistikleri silin.
-
sys.stats ve sys.stats_columns katalog görünümlerini kullanarak istatistikleri izleyin. Sistem
sys.statskataloğu görünümü, hangi istatistiklerinis_temporarykalıcı ve hangilerinin geçici olduğunu belirtmek için sütunu içerir.
Geçici istatistikler içinde tempdbdepolandığından, Veritabanı Altyapısı'nın yeniden başlatılması tüm geçici istatistikleri kaldırır.
Tüm istatistiklerde olduğu gibi, geçici istatistiklerin oluşturulması ve güncelleştirilmesi için nesne üzerinde şema değişikliği (Sch-M) kilidi gerekir. Bu kilit, birincil çoğaltmadan işlemleri uygulayan ikincil çoğaltmalarda sistem yineleme işlemi de dahil olmak üzere diğer sorguları ve işlemleri engelleyebilir. Bu engelleme sorgu iş yüklerini veya veri yayılmasını etkiliyorsa, READABLE_SECONDARY_TEMPORARY_STATS_AUTO_CREATE ve READABLE_SECONDARY_TEMPORARY_STATS_AUTO_UPDATEveritabanı kapsamlı yapılandırmaları kullanarak geçici istatistiklerin otomatik olarak oluşturulma ve güncellenme özelliğini devre dışı bırakabilirsiniz.
İstatistikler ne zaman güncelleştirilecek?
Sorgu İyileştiricisi, istatistiklerin ne zaman güncel olabileceğini belirler ve sorgu planı için gerekli olduğunda bunları güncelleştirir. Bazı durumlarda, AUTO_UPDATE_STATISTICS özelliği etkin olduğundan daha sık istatistik güncelleyerek sorgu planını iyileştirebilir ve dolayısıyla sorgu performansını artırabilirsiniz.
UPDATE STATISTICS ifadesiyle veya sp_updatestats saklı yordamıyla istatistikleri güncelleştirebilirsiniz.
İstatistiklerin güncelleştirilmesi sorguların up-totarih istatistikleriyle derlenmesini sağlar. İstatistikleri herhangi bir işlem aracılığıyla güncelleştirmek sorgu planlarının otomatik olarak yeniden derlenmesine neden olabilir. Sorgu planlarını geliştirmek ve sorguları yeniden derlemek için gereken süre arasında bir performans dengelemesi olduğundan istatistikleri el ile çok sık güncelleştirmemenizi öneririz. Belirli takaslar uygulamanıza bağlıdır.
UPDATE STATISTICS veya sp_updatestats ile istatistikleri güncelleştirirken, Sorgu İyileştiricisi'nin istatistikleri düzenli olarak güncelleştirmesini sağlamak amacıyla AUTO_UPDATE_STATISTICS ayarını açık tutmanızı öneririz.
Sütun, dizin, tablo veya dizinlenmiş görünüm istatistiklerini güncelleştirme hakkında daha fazla bilgi için bkz. İSTATİSTİkLerİ GÜNCELLEŞTIRME.
Veritabanındaki tüm kullanıcı tanımlı ve iç tabloların istatistiklerini güncelleştirme hakkında bilgi için sp_updatestatssaklı yordama bakın.
Otomatik istatistik güncelleştirmelerinin eşikleri hakkında daha fazla bilgi için bkz. AUTO_UPDATE_STATISTICS Seçeneği.
AUTO_UPDATE_STATISTICS KAPALI olarak ayarlandığında, plan yeniden derlemesi diğer çeşitli nedenlerle yine de gerçekleşebilir, ancak güncel olmayan istatistik güncelleştirmeleri nedeniyle otomatik olarak gerçekleşmez.
AUTO_UPDATE_STATISTICS KAPALI olarak ayarlandığında, istatistik güncelleştirmeleri yalnızca bakım planları gibi diğer el ile zamanlanmış işlemler aracılığıyla gerçekleşir. Bu nedenle KAPALI olarak ayarlanması AUTO_UPDATE_STATISTICS , yetersiz sorgu planlarına ve düşük sorgu performansına neden olabilir.
Güncel olmayan istatistikleri algılama
İstatistiklerin en son ne zaman güncelleştirildiğini belirlemek için sys.dm_db_stats_properties veya STATS_DATE işlevlerini kullanın.
Aşağıdaki koşullar için istatistikleri güncelleştirmeyi göz önünde bulundurun:
- Sorgu yürütme süreleri yavaş.
- Ekleme işlemleri artan veya azalan anahtar sütunlarında gerçekleşir.
- Bakım işlemlerinden sonra.
İstatistikleri el ile güncelleştirme örnekleri için bkz . İSTATİSTİkLerİ GÜNCELLEŞTIRME.
Sorgu yürütme süreleri yavaş
Sorgu yanıt süreleri yavaşsa veya öngörülemezse, ek sorun giderme adımları gerçekleştirmeden önce sorguların up-totarih istatistiklerine sahip olduğundan emin olun.
Ekleme işlemleri artan veya azalan anahtar sütunlarında gerçekleşir
IDENTITY veya gerçek zamanlı zaman damgası sütunları gibi artan veya azalan anahtar sütunlarıyla ilgili istatistikler, Sorgu İyileştiricisi'nin gerçekleştirdiğinden daha sık istatistik güncelleştirmeleri gerektirebilir. Ekleme işlemleri artan veya azalan sütunlara yeni değerler ekler. Eklenen satır sayısı istatistik güncelleştirmesini tetikleyemeyecek kadar küçük olabilir. İstatistikler up-totarih değilse ve sorgular en son eklenen satırlardan birini seçiyorsa, geçerli istatistiklerin bu yeni değerler için kardinalite tahminleri yoktur. Bu, yanlış kardinalite tahminlerine ve yavaş sorgu performansına neden olabilir.
Örneğin, en son satış siparişi tarihlerinden birini seçen bir sorgu, istatistikler en son satış siparişi tarihleri için kardinalite tahminlerini içerecek şekilde güncelleştirilmezse yanlış kardinalite tahminlerine sahiptir.
Bakım işlemden sonra
Bir tabloyu kesme veya satırların büyük bir yüzdesinin toplu eklemesini gerçekleştirme gibi veri dağıtımını değiştiren bakım yordamları gerçekleştirdikten sonra istatistikleri güncelleştirmeyi göz önünde bulundurun. Bu, sorgular otomatik istatistik güncelleştirmelerini beklerken sorgu işlemede gelecekteki gecikmeleri önleyebilir.
Dizini yeniden derleme, birleştirme veya yeniden düzenleme gibi işlemler veri dağılımını değiştirmez. Bu nedenle ALTER INDEX REBUILD, DBCC DBREINDEX, DBCC INDEXDEFRAG veya ALTER INDEX REORGANIZE işlemlerini gerçekleştirdikten sonra istatistikleri güncelleştirmeniz gerekmez. Sorgu Optimizasyonu ALTER INDEX REBUILD veya DBCC DBREINDEX ile bir tablo veya görünümde dizini yeniden oluşturduğunuzda istatistikleri günceller, ancak bu istatistik güncellemesi dizini yeniden oluşturmanın bir yan ürünüdür. Sorgu İyileştiricisi, DBCC INDEXDEFRAG veya ALTER INDEX REORGANIZE işlemlerinden sonra istatistikleri güncellemez.
Tip
SQL Server 2016 (13.x) SP1 CU4'den başlayarak, örnekleme yüzdesini açıkça belirtmeyen sonraki istatistik güncelleştirmeleri için belirli bir örnekleme yüzdesini ayarlamak ve korumak için CREATE STATISTICS veya UPDATE STATISTICS PERSIST_SAMPLE_PERCENT seçeneğini kullanın.
Otomatik dizin ve istatistik yönetimi
Bir veya daha fazla veritabanı için dizin birleştirme ve istatistik güncelleştirmelerini otomatik olarak yönetmek için Uyarlamalı Dizin Birleştirme gibi akıllı çözümleri kullanın. Bu yordam, diğer parametrelerin yanında bir dizini parçalanma düzeyine göre yeniden derlemeyi veya yeniden düzenlemeyi ve istatistikleri doğrusal bir eşikle güncelleştirmeyi otomatik olarak seçer.
İstatistikleri etkili bir şekilde kullanan sorgular
Yerel değişkenler ve sorgu koşulundaki karmaşık ifadeler gibi bazı sorgu uygulamaları, en iyi olmayan sorgu planlarına yol açabilir. İstatistikleri etkili bir şekilde kullanmaya yönelik sorgu tasarım yönergelerini takip etmek, bunu önlemeye yardımcı olabilir. Sorgu koşulları hakkında daha fazla bilgi için bkz . Arama koşulu.
Sorgu koşullarında kullanılan ifadeler, değişkenler ve işlevler için kardinalite tahminlerini geliştirmek için istatistikleri etkili bir şekilde kullanan sorgu tasarım yönergeleri uygulayarak sorgu planlarını geliştirebilirsiniz. Sorgu İyileştiricisi bir ifadenin, değişkenin veya işlevin değerini bilmediğinde, histogramda hangi değeri arayabileceğini bilmez ve bu nedenle histogramdan en iyi kardinalite tahminini alamaz. Bunun yerine, Sorgu İyileştiricisi kardinalite tahminini histogramdaki örneklenen tüm satırlar için ayrı değer başına ortalama satır sayısına göre temel alır. Bu, yetersiz kardinalite tahminlerine yol açar ve sorgu performansını etkileyebilir. Histogramlar hakkında daha fazla bilgi için bu sayfadaki veya sys.dm_db_stats_histogramhistogram bölümüne bakın.
Aşağıdaki yönergelerde, kardinalite tahminlerini geliştirerek sorgu planlarını geliştirmek için sorguların nasıl yazıldığı açıklanmaktadır.
İfadeler için kardinalite tahminlerini geliştirme
İfadelerin kardinalite tahminlerini geliştirmek için şu yönergeleri izleyin:
- Mümkün olduğunda, içindeki sabitlerle ifadeleri basitleştirin. Sorgu İyileştiricisi, kardinalite tahminlerini belirlemeden önce sabitleri içeren tüm işlevleri ve ifadeleri değerlendirmez. Örneğin, ifadesini
ABS(-100)olarak100basitleştirin. - İfade birden çok değişken kullanıyorsa, ifade için hesaplanan bir sütun oluşturmayı ve ardından hesaplanan sütunda istatistikler veya dizin oluşturmayı göz önünde bulundurun. Örneğin, ifadesi
WHERE PRICE + Tax > 100için hesaplanan bir sütun oluşturursanız sorgu koşuluPrice + Taxdaha iyi bir kardinalite tahminine sahip olabilir.
Değişkenler ve işlevler için kardinalite tahminlerini geliştirme
Değişkenler ve işlevler için kardinalite tahminlerini geliştirmek için şu yönergeleri izleyin:
Sorgu koşulu yerel bir değişken kullanıyorsa, yerel değişken yerine parametre kullanmak için sorguyu yeniden yazmayı göz önünde bulundurun. Sorgu İyileştiricisi sorgu yürütme planını oluşturduğunda yerel değişkenin değeri bilinmez. Sorgu bir parametre kullandığında, Sorgu İyileştirici saklı yordama geçirilen ilk gerçek parametre değeri için kardinalite tahminini kullanır.
Çok deyimli tablo değerli işlevlerin (mstvf) sonuçlarını tutmak için standart bir tablo veya geçici tablo kullanmayı göz önünde bulundurun. Sorgu İyileştiricisi, çok deyimli tablo değerli işlevler için istatistik oluşturmaz. Bu yaklaşımla, Sorgu İyileştiricisi tablo sütunlarında istatistikler oluşturabilir ve bunları kullanarak daha iyi bir sorgu planı oluşturabilir.
Tablo değişkenlerinin yerine standart bir tablo veya geçici tablo kullanmayı göz önünde bulundurun. Sorgu İyileştiricisi tablo değişkenleri için istatistik oluşturmaz. Bu yaklaşımla, Sorgu İyileştiricisi tablo sütunlarında istatistikler oluşturabilir ve bunları kullanarak daha iyi bir sorgu planı oluşturabilir. Geçici bir tablo mu yoksa tablo değişkeni mi kullanılacağını belirlemede dezavantajlar vardır; Saklı yordamlarda kullanılan tablo değişkenleri, saklı yordamın geçici tablolara göre daha az yeniden derlenmesine neden olur. Uygulamaya bağlı olarak, tablo değişkeni yerine geçici bir tablo kullanmak performansı iyileştirmeyebilir.
Saklı yordam, geçirilen parametre kullanan bir sorgu içeriyorsa, sorguda kullanmadan önce saklı yordamdaki parametre değerini değiştirmekten kaçının. Sorgu için kardinalite tahminleri, güncelleştirilmiş değeri değil, geçirilen parametre değerini temel alır. Parametre değerini değiştirmekten kaçınmak için sorguyu yeniden yazarak iki saklı yordam kullanabilirsiniz.
Örneğin, aşağıdaki saklı yordam
Sales.GetRecentSalesolduğunda@date@dateparametresininNULLdeğerini değiştirir.USE AdventureWorks2022; GO IF OBJECT_ID('Sales.GetRecentSales', 'P') IS NOT NULL DROP PROCEDURE Sales.GetRecentSales; GO CREATE PROCEDURE Sales.GetRecentSales @date DATETIME AS BEGIN IF @date IS NULL SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader)); SELECT * FROM Sales.SalesOrderHeader AS h, Sales.SalesOrderDetail AS d WHERE h.SalesOrderID = d.SalesOrderID AND h.OrderDate > @date; END GOSaklı yordam
Sales.GetRecentSalesiçin yapılan ilk çağrıda,NULLparametresi için bir@dategeçirildiğinde, Sorgu İyileştirici, sorgu koşulu@date = NULLile çağrılmasa bile, kardinalite tahminini@date = NULLile saklı yordamı derler. Bu kardinalite tahmini, gerçek sorgu sonucundaki satır sayısından önemli ölçüde farklı olabilir. Sonuç olarak, Sorgu İyileştiricisi daha az optimal bir sorgu planını seçebilir. Bunu önlemeye yardımcı olmak için saklı prosedürü aşağıdaki şekilde iki prosedür olarak yeniden yazabilirsiniz.USE AdventureWorks2022; GO IF OBJECT_ID('Sales.GetNullRecentSales', 'P') IS NOT NULL DROP PROCEDURE Sales.GetNullRecentSales; GO CREATE PROCEDURE Sales.GetNullRecentSales @date DATETIME AS BEGIN IF @date IS NULL SET @date = DATEADD(MONTH, -3, (SELECT MAX(ORDERDATE) FROM Sales.SalesOrderHeader)); EXECUTE Sales.GetNonNullRecentSales @date; END GO IF OBJECT_ID('Sales.GetNonNullRecentSales', 'P') IS NOT NULL DROP PROCEDURE Sales.GetNonNullRecentSales; GO CREATE PROCEDURE Sales.GetNonNullRecentSales @date DATETIME AS BEGIN SELECT * FROM Sales.SalesOrderHeader AS h, Sales.SalesOrderDetail AS d WHERE h.SalesOrderID = d.SalesOrderID AND h.OrderDate > @date; END GO
Sorgu ipuçlarıyla kardinalite tahminlerini geliştirme
Yerel değişkenler için kardinalite tahminlerini geliştirmek amacıyla OPTIMIZE FOR <value> veya OPTIMIZE FOR UNKNOWN sorgu ipuçlarını RECOMPILE ile kullanabilirsiniz. Daha fazla bilgi için bkz.sorgu ipuçları
Bazı uygulamalar için sorgunun her yürütülişinde yeniden derlenmesi çok fazla zaman alabilir.
OPTIMIZE FOR sorgu ipucu, RECOMPILE seçeneğini kullanmasanız bile yardımcı olabilir. Örneğin, belirli bir OPTIMIZE FOR tarihi belirtmek için saklı yordama Sales.GetRecentSales bir seçenek ekleyebilirsiniz. Aşağıdaki örnek OPTIMIZE FOR yordamına Sales.GetRecentSales seçeneğini ekler.
USE AdventureWorks2022;
GO
IF OBJECT_ID('Sales.GetRecentSales', 'P') IS NOT NULL
DROP PROCEDURE Sales.GetRecentSales;
GO
CREATE PROCEDURE Sales.GetRecentSales
@date DATETIME
AS
BEGIN
IF @date IS NULL
SET @date = DATEADD(MONTH, -3,
(SELECT MAX(ORDERDATE)
FROM Sales.SalesOrderHeader));
SELECT *
FROM Sales.SalesOrderHeader AS h, Sales.SalesOrderDetail AS d
WHERE h.SalesOrderID = d.SalesOrderID AND h.OrderDate > @date
OPTION (OPTIMIZE FOR (@date = '2004-05-01 00:00:00.000'));
END
GO
Plan kılavuzlarıyla kardinalite tahminlerini iyileştirme
Bazı uygulamalarda, sorguyu değiştiremediğiniz veya RECOMPILE sorgu ipucu çok fazla yeniden derlemeye neden olabileceğinden sorgu tasarımı yönergeleri geçerli olmayabilir. Uygulama satıcısıyla uygulama değişikliklerini araştırırken sorgunun davranışını denetlemek için USE PLAN gibi diğer ipuçlarını belirtmek için plan kılavuzlarını kullanabilirsiniz. Plan kılavuzları hakkında daha fazla bilgi için bkz. Plan Kılavuzları.
Azure SQL Veritabanı'nda plan kılavuzları yerine planları zorlamak için Sorgu Deposu ipuçlarını göz önünde bulundurun. Daha fazla bilgi için bkz. Sorgu Deposu ipuçları.
İlgili içerik
- Memory-Optimized Tabloları için istatistikler
- İSTATİSTİK OLUŞTUR (Transact-SQL)
- İSTATİSTİKLERİ GÜNCELLE (Transact-SQL)
- sp_updatestats (Transact-SQL)
- DBCC SHOW_STATISTICS (Transact-SQL)
- ALTER DATABASE seçeneklerini (Transact-SQL) ayarla
- DROP STATISTICS (Transact-SQL)
- İNDEKS OLUŞTUR (Transact-SQL)
- alter index (Transact-SQL)
- Filtrelenmiş dizinler oluşturma
- STATS_DATE (Transact-SQL)
- sys.dm_db_stats_properties (Transact-SQL)
- sys.dm_db_stats_histogram (Transact-SQL)
- sys.stats
- sys.stats_columns (Transact-SQL)
- Uyarlamalı Dizin Parçalama