İstatistikler sorgu performansını artırmak için kullanma

sorgu iyileştiricisi İstatistikler sorgu performansını artırmak sorgu planları oluşturmak için kullanır.Sorguların çoğu için sorgu iyileştiricisi zaten yüksek kaliteli sorgu planı; ilgili gerekli istatistikleri oluşturur birkaç durumlarda, en iyi sonuçlar elde etmek için sorgu tasarımını değiştirmek veya ek istatistikler oluşturmak gerekir.

Bu konu aşağıdaki kavramları açıklanır ve kullanma yönergeleri etkili bir şekilde en iyi duruma getirme istatistiklerini sorgula:

  • Sorgu en iyi duruma getirme istatistikleri nelerdir?

  • Veritabanı çapında istatistikleri seçenekleri kullanarak

  • İstatistikleri oluşturma zamanını belirleme

  • İstatistikleri güncelleştirme zamanını belirleme

  • İstatistikleri verimli kullanan sorguları tasarlama

Sorgu planı ve nasıl sorgu performansı ilişkili olduğu hakkında daha fazla bilgi için bkz: Bir sorgu çözümleme.

Sorgu en iyi duruma getirme istatistikleri nelerdir?

Sorgu en iyi duruma getirme için istatistikleri, bir tablo veya dizinli görünüm, bir veya daha fazla sütundaki değerlerin dağılımı hakkındaki istatistiksel bilgileri içeren nesneleridir.sorgu iyileştiricisi Tahmin etmek için bu istatistikleri kullanır kardinalite, veya sorgu sonuç satır sayısı.Bu kardinalite tahminleri yüksek kaliteli sorgu planı oluşturmak sorgu iyileştiricisi etkinleştirin.Örneğin, sorgu iyileştiricisi dizini arama operatörü daha yoğun kaynak dizin tarama işleç yerine ve böylece seçmek için kardinalite düzeyi tahminleri kullan sorgu performansı arttırabilir.

Bir veya daha fazla tablo listesi üzerinde her istatistikleri nesnesi oluşturulur sütuns ilk değerleri dağıtımını görüntüleyen bir çubuk grafik içerir ve sütun.Birden çok sütun istatistikleri nesnelerde değerleri sütunlar arasında korelasyon hakkındaki istatistiksel bilgileri de depolar.Bu korelasyon istatistikleri veya yoğunluğunu, sütun değerlerinin ayrı satır sayısından türetilmiş.İstatistik nesneler hakkında daha fazla bilgi için bkz: dbcc SHOW_STATISTICS (Transact-sql).

Filtre uygulanmış istatistikleri

Filtre uygulanmış istatistikleri iyi tanımlanmış veri kümelerine seçtiğiniz sorguları için sorgu performansını artırabilirsiniz.Filtre uygulanmış istatistikleri filtre yüklemi İstatistiklere dahil verilerin alt küme küme kümesini seçmek için kullanın.Filtre uygulanmış istatistikleri iyi tasarlanmış tam tablo istatistikleri ile karşılaştırıldığında sorgu yürütme planı geliştirebilirsiniz.Süzgeç karşılaştırma hakkında daha fazla bilgi için bkz: İSTATİSTİKLER (Transact-sql) oluştur.Filtre uygulanmış istatistikleri oluşturma hakkında daha fazla bilgi için bkz: Belirlerken istatistikler oluşturmak için Bu bölümde.Blog girdisi bir incelemesi için bkz: Kullanarak filtre uygulanmış istatistikleri bölümlenmiş tabloları ile, sqlcat, Web sitesi.

Veritabanı çapında istatistikleri seçenekleri kullanarak

Aşağıdaki veritabanı çapında istatistikleri seçenekleri ne anlamak ve olduklarını doğrulamak için önemlidir küme uygun bir şekilde:

  • AUTO_CREATE_STATISTICS

  • AUTO_UPDATE_STATISTICS

  • AUTO_UPDATE_STATISTICS_ASYNC

AUTO_CREATE_STATISTICS seçeneğini kullanarak

Otomatik istatistik seçeneği, AUTO_CREATE_STATISTICS, oluşturduğunuzda, yanıyor sorgu iyileştiricisi gerektiği gibi sorgu planı için kardinalite tahminleri artırmak için sorgu yüklemi tek tek sütunlarda istatistikleri oluşturur.Bu tek -sütun üzerinde oluşturulmuş İstatistikleri sütunzaten bir histogram varolan istatistikleri nesnesi olmayan s.

Belirlemek için aşağıdaki sorguyu kullanabilirsiniz sorgu iyileştiricisi sorgu doðrulama bir sütun için İstatistikler oluşturdu.Katalog Görünümleri sorgular sys.stats ve sys.stats_columns veritabanı nesnesi adı, sütun adı ve tüm sütunları olan istatistik adını döndürmek içintek sütunlu istatistikleri. sorgu iyileştiricisi istatistiklerini bir sonucu olarak AUTO_CREATE_STATISTICS seçeneği kullanılarak tek bir sütun oluşturur, istatistikleri adı ile başlar _WA.

USE AdventureWorks;
GO
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 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_CREATE_STATISTICS seçeneği için dizin oluşturulmuş istatistikleri olup olmadığını belirleyin.Bu seçenek, filtre uygulanmış istatistikleri de oluşturmaz.Kesinlikle tek - geçerlisütun tam tablo için istatistikler.

AUTO_UPDATE_STATISTICS seçeneğini kullanarak

AUTO_UPDATE_STATISTICS, otomatik güncelleştirme istatistikleri seçeneği açıkken sorgu iyileştiricisi istatistikleri ne zaman güncelliğini yitirmiş olabilir ve bir sorgu tarafından kullanıldığında bunları güncelleştirmeleri belirler.İstatistikleri olur dışarı-in-tarih sonra Ekle, entarih, silmek veya birleştirme işlemlerini değiştir veri dağılımı tablo veya dizinli görünüm.sorgu iyileştiricisi Ne zaman istatistikleri veri değişiklikleri sayısı son istatistikleri güncelleştirme beri sayım ve karşılaştırma için bir eşik değişiklikleri sayısı güncelliğini yitirmiş olabilir belirler.Eşik tablo veya dizinli görünüm satır sayısını temel alır.

sorgu iyileştiricisi İçin güncel olmayan istatistiklerin bir sorgu derleme öncesi ve önbelleğe alınan sorgu planı yürütmeden önce denetler.Bir sorgu derleme önce sorgu iyileştiricisi sütunlar, tablolar ve dizin oluşturulmuş görünümler sorgu yüklemi hangi istatistikleri güncelliğini yitirmiş olabilir belirlemek için kullanır.Önbelleğe alınan sorgu planı yürütmeden önce Veritabanı Altyapısı sorgu planını oluşturan başvuru doğrular-için-tarih istatistikleri.

AUTO_UPDATE_STATISTICS seçenek dizinler, sorgu yüklemler tek sütun için oluşturulan istatistikleri nesneler için geçerlidir ve oluşturulmuş istatistikleri create STATISTICS deyim.Bu seçenek, filtre uygulanmış istatistikleri için de geçerlidir.

AUTO_CREATE_STATISTICS ve AUTO_UPDATE_STATISTICS seçenekleri ayarlama

Otomatik istatistik seçeneği, AUTO_CREATE_STATISTICS, oluşturmak ve otomatik güncelleştirme istatistikleri seçeneği, AUTO_UPDATE_STATISTICS, üzerinde varsayılan olarak ve çoğu kullanıcı veritabanları için varsayılan kullanmanızı öneririz.Aşağıdaki select kullanabilirsiniz deyim tüm kullanıcı veritabanları için bu seçenekler geçerli değerlerini görüntülemek için:

SELECT name AS "Name", 
    is_auto_create_stats_on AS "Auto Create Stats",
    is_auto_update_stats_on AS "Auto Update Stats",
    is_read_only AS "Read Only" 
FROM sys.databases
WHERE database_ID > 4;
GO

Aşağıdaki örnek AUTO_CREATE_STATISTICS ve AUTO_UPDATE_STATISTICS açık için ayarlar AdventureWorks2008R2 Veritabanı:

USE AdventureWorks2008R2;
GO
ALTER DATABASE AdventureWorks2008R2
    SET AUTO_CREATE_STATISTICS ON;
ALTER DATABASE AdventureWorks2008R2
    SET AUTO_UPDATE_STATISTICS ON;
GO

Bu istatistikleri seçenekleri küme hakkında daha fazla bilgi için bkz: alter database set seçenekleri (Transact-sql).

Devre dışı bırakma ve AUTO_UPDATE_STATISTICS yeniden devreye bazı istatistikleri

AUTO_UPDATE_STATISTICS açık olduğunda, veritabanı çapında istatistikleri güncelleştirme davranışı geçersiz kılabilirsiniz ve küme tek tek tablo, dizin ya da sütun, uygulamanızın gerektirdiği gibi kapalı otomatik istatistik güncelleştirir.AUTO_UPDATE_STATISTICS açık olduğunda, devre dışı bırakabilir ve bir tablo, dizin veya sütun için otomatik istatistik güncelleştirmeleri aşağıdaki şekillerde yeniden etkinleştirin:

  • Use sp_autostats sistem saklı yordamı.Bu devre dışı bırakın veya bir tablo ya da dizin istatistikleri güncelleştirmeleri yeniden etkinleştirin.

  • norecompute seçeneğiyle belirtin update STATISTICS deyim.Yeniden etkinleştirmek için istatistikleri güncelleştirmeleri norecompute seçeneği olmadan update STATISTICS yeniden çalıştırın.

  • norecompute seçeneğiyle belirtin create STATISTICS deyim.İstatistikleri güncelleştirmeleri yeniden etkinleştirmek için istatistikleri ile kaldırma Bırakın İSTATİSTİKLERİ ve create STATISTICS norecompute seçeneği olmadan çalıştırın.

  • STATISTICS_NORECOMPUTE seçeneği ile belirtmek create INDEX deyim.İstatistikleri güncelleştirmeleri yeniden etkinleştirmek için çalıştırabilirsiniz alter INDEX ile STATISTICS_NORECOMPUTE = off.

AUTO_UPDATE_STATISTICS kapalıyken, yapamazsınız küme otomatik güncelleştirmeler üzerinde bir tek tek tablo, dizin veya sütun.Otomatik istatistik güncelleştirme yeniden devreye AUTO_UPDATE_STATISTICS seçeneği ile belirtilen davranışı geri yükler.AUTO_UPDATE_STATISTICS seçeneği kapalıysa, istatistikleri güncelleştirmeleri yapılmaz.

Zaman uyumlu veya zaman uyumsuz istatistikleri güncelleştirmeleri kullanma

İstatistikleri güncelleştirmeleri olabilir ya da zaman uyumlu (varsayılan) veya zaman uyumsuz.Eşzamanlı istatistikleri güncelleştirme ile her zaman sorgu derleyin ve yürütmek ile güncel istatistikleri; İstatistikler güncel değil, sorgu iyileştiricisi güncelleştirilmiş istatistikleri derlemek ve sorguyu yürütmeden önce bekler.Kadar zaman uyumsuz istatistikleri iletarihs, sorgu derleme ile var olan istatistikler dışında var olan istatistikler olsa bile-,-tarih; sorgu iyileştiricisi Sorgu derlediğinde istatistikleri güncel değil ise hassasiyetli sorgu planı seçebilir.Zaman uyumsuz güncelleştirmeler tamamlandıktan sonra derleme sorguları için güncelleştirilmiş istatistikleri kullanmasını yararlı olacaktır.

Veritabanı çapında zaman uyumsuz istatistikleri güncelleştirme seçeneği, AUTO_UPDATE_STATISTICS_ASYNC, sorgu iyileştiricisi zaman uyumlu veya zaman uyumsuz istatistikleri güncelleştirmeleri kullanıp kullanmayacağını belirler.Varsayılan olarak, zaman uyumsuz istatistikleri güncelleştirme seçeneği kapalıdır ve sorgu iyileştiricisi istatistiklerini eşzamanlı olarak güncelleştirir.AUTO_UPDATE_STATISTICS_ASYNC seçenek dizinler, sorgu yüklemler tek sütun için oluşturulan istatistikleri nesneler için geçerlidir ve oluşturulmuş istatistikleri create STATISTICS deyim.

Tüm veritabanları için otomatik güncelleştirme zaman uyumsuz seçeneği görüntülemek için aşağıdaki komutu kullanabilirsiniz:

SELECT name AS "Name", 
    is_auto_update_stats_async_on AS "Asynchronous Update" 
FROM sys.databases;
GO

Aşağıdaki senaryo için zaman uyumlu istatistikleri kullanmayı düşünün:

  • Dağılımı tablo kesilmesi veya satır büyük bir yüzdesi, bir toplu güncelleştirme yapılıyor gibi veri değiştirme işlemleri gerçekleştirdiğiniz.Yukarı,tarih de eşzamanlı istatistikleri kullanarak operaton Tamamlanıyor İstatistikler sağlayacak sonra istatistikleri-için-tarih önce değiştirilen veri sorguları yürütme.

Aşağıdaki senaryolar için daha öngörülebilir sorgu yanıt süreleri elde etmek için zaman uyumsuz istatistikleri kullanmayı düşünün:

  • Uygulamanız, sık sık aynı sorgu, benzer sorgular veya benzer önbelleğe alınan sorgu planlarını yürütür.Sorgu yanıt zamanlarınızı eşzamanlı ile zaman uyumsuz istatistikleri güncelleştirmeleri daha fazla öngörülebilir olabilir çünkü istatistiklerini güncelleştirir sorgu iyileştiricisi gelen güncel istatistikleri için beklemeden güncelleþtirebilir.Bu, bazı sorgular ve diğerlerini ertelenmesine neden engeller.Benzer sorguları bulma hakkında daha fazla bilgi için bkz: Bulma ve benzer sorgular sorgu ve sorgu kullanarak ayarlama karmaları Plan.

  • Uygulamanızın istemci isteği saat aşımı'sayısı için güncelleştirilmiş istatistikleri bekleyen bir veya birkaç sorgu nedeni ile karşılaştı.Bazı durumlarda, agresif saat aşımı başarısız sayısı ile uygulamaları eşzamanlı istatistikleri beklemek neden olabilir.

İstatistikleri oluşturma zamanını belirleme

sorgu iyileştiricisi Zaten istatistikleri aşağıdaki gibi oluşturur:

  1. sorgu iyileştiricisi Dizin oluşturulduğunda, tablo veya görünümlerin üzerinde dizinler için istatistikleri oluşturur.Bu istatistikler, dizin anahtar sütunları üzerinde oluşturulur.Filtre uygulanmış bir dizin dizin ise sorgu iyileştiricisi aynı alt küme küme filtre uygulanmış dizin için belirtilen satır filtre uygulanmış istatistikleri oluşturur.Filtre uygulanmış dizinler hakkında daha fazla bilgi için bkz: Filtre uygulanmış dizin tasarım yönergeleri ve CREATE INDEX (Transact-SQL).

  2. sorgu iyileştiricisi AUTO_CREATE_STATISTICS açık olduğunda tek bir sütun için İstatistikler sorgu Doðrulamalarda oluşturur.

Sorguların çoğu için istatistikler oluşturmak için bu iki yöntem, yüksek kaliteli sorgu planı emin olun; birkaç durumlarda, sorgu planları ile ek istatistik oluşturarak artırabilir create STATISTICS deyim.Bu ek İstatistikler istatistiksel bağıntıları yakalayabilir, sorgu iyileştiricisi dizinler veya tek bir sütun için İstatistikler oluşturduğunda için hesaba katmaz.Uygulamanızın ek istatistiksel bağıntıları, hesaplanan bir istatistik nesnesi, sorgu planları geliştirmek sorgu iyileştiricisi çıkmasına Tablo verisi olabilir.Örneğin, filtre uygulanmış istatistikleri veri satırların alt küme küme küme kümesini veya sorgu doðrulama sütunlar üzerinde sütunlu istatistikleri sorgu planını iyileştirebilir.

İstatistik istatistik oluşturma deyim ile oluştururken, böylece düzenli olarak tek - oluşturmak sorgu iyileştiricisi devam AUTO_CREATE_STATISTICS seçenek tutma öneririzsütun sorgu yüklemi istatistiklerini sütuns.Sorgu yüklemler hakkında daha fazla bilgi için bkz: Arama koşulu (Transact-sql).

İle create STATISTICS İstatistikler oluşturmayı düşünün deyim ne zaman aşağıdakilerden herhangi birini uygular:

  • The Veritabanı Altyapısı Tuning Advisor suggests creating statistics.

  • Sorgu yüklemi zaten aynı dizinde olmayan birden çok ilişkili sütun içerir.

  • Verilerin alt küme küme küme kümesini sorgu seçer.

  • Sorgu istatistikleri eksik vardır.

Veritabanı Altyapısı Ayarlama Danışmanı istatistikleri oluşturma önerir.

The Veritabanı Altyapısı Tuning Advisor is a a tool that analyzes the performance effects of workloads on one or more databases.(Dizinler oluşturmak için önerilen) performansı artırmak için öneriler sunar ve sorgu en iyi duruma getirme istatistikleri oluşturmak için create STATISTICS kullanarak önerebilir.Bu öneri izlemeniz gerekir.Hakkında daha fazla bilgi için Veritabanı Altyapısı Tuning Advisor, bkz: Fiziksel veritabanı tasarımını ayarlama.

Sorgu yüklemi birden çok ilişkili sütunlar

Bir sorgu yüklemi sütun arası ilişkiler ve bağımlılıkları sahip birden fazla sütun içeriyorsa, birden çok sütun istatistikleri sorgu planını iyileştirebilir.Birden çok sütun istatistikleri içeren sütun çapraz korelasyon istatistikleri adı verilen, yoğunluğunu, olmayan tek sütunlu istatistikleri kullanılabilir.Yoğunluğunu kardinalite tahminleri artırmak ne zaman sorgu sonuçlar birden çok sütun arasında veri ilişkileri bağlıdır.

Sütunları aynı dizin içinde iseniz, sütunlu istatistikleri nesne zaten var ve el ile oluşturmak gerekli değildir.Sütunları zaten aynı dizin içinde ise, sütunlu istatistikleri sütunlar üzerinde dizin oluşturma veya İSTATİSTİKLERİ oluşturma deyim kullanarak oluşturabilirsiniz.Bir dizin istatistikleri nesne daha korumak için daha fazla sistem kaynağı gerekir.Uygulama sütunlu dizin gerektirmiyorsa, dizin oluşturmadan istatistikleri nesne oluşturarak sistem kaynaklarının economize.

Sütunlu istatistikleri oluştururken kardinalite tahminleri yapmak için yoğunluğunu verimliliğini istatistikleri nesne tanımı'nda sütunların sırasını etkiler.İstatistikler nesnesinde anahtar sütunlarının her önek için yoğunluğunu istatistikleri nesnesi tanımında depolar.Yoğunluğunu hakkında daha fazla bilgi için bkz: dbcc SHOW_STATISTICS (Transact-sql).

Yönelik kardinalite tahminleri faydalı yoğunluğunu oluşturmak için sorgu yüklemi sütunlarda istatistikleri nesne tanımı sütunlarda önekleri biriyle eşleşmesi gerekir.Örneğin, aşağıdaki sütunların sütunlu istatistikleri nesne oluşturur LastName, MiddleName, ve FirstName.

USE AdventureWorks2008R2;
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, İstatistikler nesnesinde LastFirst aşağıdaki sütun önekler için yoğunluğunu vardır: (LastName), (LastName, MiddleName), and (LastName, MiddleName, FirstName).Yoğunluk kullanılamaz (LastName, FirstName).Sorgu kullanıyorsa, LastName ve FirstName kullanmadan MiddleName, yoğunluğu için kardinalite tahminleri.

Veri alt sorgu seçer

sorgu iyileştiricisi istatistiklerini tek sütun ve dizin oluşturduğunda, istatistik değerleri için tüm satırları oluşturur.Satırların alt küme küme küme kümesini sorguları seçin ve alt küme küme satır kümesi benzersiz veri dağıtım filtre uygulanmış istatistikleri sorgu planları artırabilir.Filtre uygulanmış istatistikleri filtre yüklemi tanımlamak için where yan tümce tümce tümce ile İSTATİSTİKLERİ oluşturma deyim kullanarak oluşturabileceğiniz deyim.

Örneğin, AdventureWorks2008R2, her üründe Production.Product içinde dört kategoriden birine ait olduğu tablo Production.ProductCategory tablosu: Bisikletler, bileşenleri, elbise ve Donatılar.Kategorilerin her biri bir ağırlık için farklı veri dağıtım vardır: bir bisiklet ağırlıkları aralık 13.77 30.0, bir bileşen ağırlıkları aralık 2.12 bazı null değerleri ile 1050.00 tüm null ve aksesuar ağırlıklarını da boş elbise ağırlıkları var.

Bisikletler, örnek olarak kullanarak, tüm bisiklet ağırlıklarının filtre uygulanmış istatistikleri için daha doğru İstatistikler sağlayacak sorgu iyileştiricisi üzerinde tam tablo istatistikleri veya varolmayan istatistikleri ile karşılaştırıldığında sorgu planı kalitesini iyileştirebilir ve Weight sütun.Görece küçük bir ağırlık arama sayısı ise bisiklet ağırlığı filtre uygulanmış istatistikleri için iyi bir adaydır ancak filtre uygulanmış bir dizin için iyi bir adaydır sütun.Performans kazanç, filtre uygulanmış bir dizin ek bakım ve filtre uygulanmış dizin veritabanına eklemek için depolama maliyeti basmaktadır sağlar aramalar için.

Aşağıdaki deyim oluşturur BikeWeights filtre uygulanmış istatistikleri tüm alt kategorileri için bisiklet.Filtre uygulanmış yüklemi ifade Bisikletler karşılaştırma ile bisiklet alt kategorilerin tüm numaralandırma tanımlar Production.ProductSubcategoryID IN (1,2,3).İçinde saklandığı yüklemi Bisikletleri kategori adını kullanamazsınız, çünkü Production.ProductCategory Tablo ve tüm sütunlara filtre ifade aynı tablo içinde olmalı.

USE AdventureWorks2008R2;
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 iyileştiricisi Kullanabilmek için BikeWeights filtre daha küçük yazılara Bisikletleri tüm seçer aşağıdaki sorgu için sorgu planı geliştirmek için istatistikleri'den 25.

SELECT P.Weight AS Weight, S.Name AS BikeName
FROM Production.Product AS P
    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 istatistikleri eksik vardır.

Bir hata veya başka bir olay sorgu iyileştiricisi istatistiklerini oluşturmasını engeller, sorgu en iyi duruma getiricisi istatistikleri kullanmadan sorgu planı oluşturur.sorgu iyileştiricisi İşaretleri İstatistikler sorgu saat eksik ve sonraki istatistikleri yeniden oluşturmak için girişimi olarak gerçekleştirilir.

Eksik istatistikleri uyarıları hata olarak gösterilir (tablo adı kırmızı metin) kullanarak bir sorgu yürütme planında grafiksel olarak görüntülendiğinde, SQL Server Management Studio.Daha fazla bilgi için bkz: Grafik yürütme görüntüleme (SQL Server Management Studio'yu) planları.Buna ek olarak, izleme Missing Column Statistics kullanarak olay sınıfı SQL Server Profiler İstatistikleri ne zaman eksik olduğunu gösterir.Daha fazla bilgi için bkz: Hata ve uyarılarını olay kategorisi (veritabanı altyapısı).

İstatistik eksikse, aşağıdaki adımları uygulayın:

  • AUTO_CREATE_STATISTICS ve AUTO_UPDATE_STATISTICS üzerinde olduğundan emin olun.

  • Veritabanının salt okunur olmadığından emin olun.Veritabanı salt okunur ise, sorgu iyileştiricisi istatistiklerini kaydedemiyor.

  • Eksik istatistikleri İSTATİSTİKLERİ oluşturma deyim kullanarak oluşturun.

İstatistikleri güncelleştirme zamanını belirleme

sorgu iyileştiricisi İstatistikleri ne zaman güncelliğini yitirmiş olabilir ve bir sorgu planı için gerektiğinde bunları güncelleştirmeleri belirler.Bazı durumlarda sorgu planı geliştirmek ve bu nedenle daha fazla istatistik sık AUTO_UPDATE_STATISTICS açık olduğunda ortaya çok güncelleştirerek sorgu performansını artırmak.güncelleştirme istatistikleri deyim ile İstatistikleri güncellemek veya saklı yordam sp_updatestats.

İstatistikleri güncelleştirme sağlar sorgu ile derlemek kurmak-için-tarih istatistikleri.Ancak, istatistikleri güncelleştirme sorguları yeniden derlemek neden olur.Olduğundan performans kullanýcýnýzýn sorgu planları geliştirme arasında istatistikleri çok sık güncelleme değil öneririz ve saat sorguları yeniden derlemek için alır.Belirli Artıları ve eksileri, uygulamaya göre değişir.

İstatistikleri ile güncelleştirirken güncelleştirme istatistikleri veya sp_updatestats, on olarak ayarlayabilir, böylece sorgu en iyi duruma getiricisi için düzenli olarak devam AUTO_UPDATE_STATISTICS tutma öneririz güncelleştirme istatistikleri.Nasıl hakkında daha fazla bilgi için güncelleştirme istatistikleri bir sütun, bir dizin, bir tablo veya dizinli görünüm üzerinde görmek update STATISTICS (Transact-sql).Nasıl hakkında bilgi için güncelleştirme istatistikleri saklı yordamı tüm kullanıcı tanımlı ve iç tablolar için veritabanı, bakın sp_updatestats (Transact-sql).Örneğin aşağıdaki çağrı komutu sp_updatestats Update tüm istatistikleri için veritabanı.

EXEC sp_updatestats

İstatistiklerin en son güncelleştirildiği belirlemek için stats_date işlev.

Güncelleştirme istatistikleri aşağıdaki koşullar için göz önünde bulundurun:

  • Sorgu yürütme süreleri yavaştır.

  • Artan veya azalan anahtar sütunları ekleme işlemleri oluşur.

  • Bakım işlemleri sonra.

Sorgu yürütme süreleriyle yavaş

Sorgu yanıt süreleri yavaş veya öngörülemeyen, sorguları sağlamak-için-tarih ek sorun giderme adımları gerçekleştirmeden önce istatistikleri.Yavaş Çalışan Sorgularda sorun giderme hakkında daha fazla bilgi için bkz: Yavaş çalışan sorgularda çözümleme için Denetim listesi.

Artan veya azalan anahtar sütunları ekleme işlemleri ortaya

KİMLİK veya gerçek zamanlı saat damgası sütunları gibi anahtar sütunları azalan veya artan üzerinde İstatistikleri'den daha sık istatistikleri güncelleştirmeleri gerekebilir sorgu iyileştiricisi gerçekleştirir.INSERT işlemleri, artan veya azalan sütun için yeni değerler ekleyin.Eklenen satır sayısı istatistikleri güncelleştirme tetiklemek için çok küçük olabilir.İstatistik yukarı değilseniz-için-tarih ve seçme sorguları alınan en son eklenen satır, geçerli istatistiklerini bu yeni değerler için kardinalite tahminleri sahip olacaktır.Bu yanlış kardinalite tahminleri ve sorgu performansının yavaşlamasına neden olabilir.

Örneğin, en son satış sipariş tarihleri için kardinalite tahminleri dahil etmek için istatistikleri güncelleştirilmez, en son satış sipariş tarihleri seçer bir sorgu yanlış kardinalite tahminleri olacaktır.

Sonra bakım işlemleri

Dağılımı tablo kesilmesi veya bir satır büyük bir yüzdesini, bulk INSERT işleminden gibi veri değiştirme bakım yordamlarını gerçekleştirdikten sonra istatistiklerini güncelleştirmeyi unutmayın.Bu sorguları için otomatik istatistik güncelleştirmeleri beklerken sorguyu işlemeyi gelecekteki gecikmeler önleyebilirsiniz.

Yeniden oluşturma gibi işlemleri birleştirmek veya bir dizin yeniden düzenleme değiştirme veri dağıtım.Bu nedenle, gerek yok güncelleştirme istatistikleri sonra alter dizin yeniden oluşturma, dbcc VERİTABANINIZDAN, dbcc INDEXDEFRAG veya alter dizin yeniden düzenleme işlemlerini gerçekleştirme.sorgu iyileştiricisi Ancak; bir tablo veya Görünüm alter dizin yeniden oluşturma veya dbcc DBREINDEX üzerindeki bir dizini yeniden oluşturduğunuzda istatistiklerini güncelleştirir. Bu istatistikleri güncelleştirme dizin yeniden oluşturmayı, bir byproduct olur.Sorgu en iyi duruma getiricisi yok güncelleştirme istatistikleri dbcc INDEXDEFRAG veya alter dizin yeniden düzenleme işlemleri sonra.

Tasarlama etkin bir şekilde bu kullanım istatistiklerini sorgular

Yerel değişken ve karmaşık sorgu yüklemi ifadelerde gibi belirli sorgu uygulamaları hassasiyetli sorgu planları için yol açabilir.İstatistikleri verimli bir şekilde kullanmak için sorguyu Tasarım yönergeleri izleyerek bunu önlemek için yardımcı olabilir.Sorgu yüklemler hakkında daha fazla bilgi için bkz: Arama koşulu (Transact-sql).

Sorgu planları geliştirmek için istatistikleri verimli kullanan sorgu Tasarım yönergeleri uygulayarak geliştirmek kardinalite tahminleri ifadeler, değişkenler ve sorgu Doðrulamalarda kullanılan işlevler.sorgu iyileştiricisi bir ifadenin, değişken, değeri biliyorsanız veya işlev, hangi değeri histogram içinde arama için bilmeniz ve bu nedenle en iyi kardinalite tahmini histogram alamıyor.Bunun yerine, sorgu iyileştiricisi kardinalite tahmini ortalama örneklenen satırları çubuk grafik için farklı değer başına satır sayısı dayandırır.Bu hassasiyetli kardinalite tahminleri için müşteri adayları ve sorgu performansı zarar verebilirsiniz.

Aşağıdaki yönergeler, sorgular sorgu planları kardinalite tahminleri geliştirerek artırmak için yazma anlatılmaktadır.

İfadeler için önem düzeyi tahminleri artırma

İfadeler için kardinalite tahminleri artırmak için aşağıdaki yönergeleri izleyin:

  • Mümkün olduğunda, içlerindeki sabitleri ifadelerle basitleştirin.sorgu iyileştiricisi tüm işlevler ve sabitler için kardinalite tahminleri belirlenmesi öncesinde içeren deyimleri değerlendirmek.Örneğin, abs ifade basitleştirmek (-100) to 100.

  • İfade birden fazla değişken kullanılıyorsa, hesaplanan bir sütun için ifade oluşturmayı göz önünde bulundurun ve hesaplanan sütun üzerinde istatistikleri veya bir dizin oluşturun.Örneğin, sorgu yüklemi WHERE PRICE + Tax > 100 oluşturursanız, daha iyi bir kardinalite tahmini olabilir bir hesaplanan sütun ifade için Price + Tax.

Değişkenleri ve işlevleri için önem düzeyi tahminleri artırma

Değişkenleri ve işlevleri için kardinalite tahminleri artırmak için aşağıdaki yönergeleri izleyin:

  • Sorgu yüklemi yerel bir değişken kullanılıyorsa, yerel değişken yerine bir parametre kullanmak için sorguyu yeniden yazmayı düşünün.Yerel bir değişken değeri ne zaman adı verilir sorgu iyileştiricisi sorgu yürütme planı oluşturur.Sorgu parametresi, sorgu en iyi duruma getiricisi kardinalite tahmini için geçen ilk gerçek parametre değeri için kullanır saklı yordam.

  • Multi-deyim tablo değerli işlevler sonuçlar barındırmak için bir standart tablo veya geçici tablo kullanmayı düşünün.sorgu iyileştiricisi istatistiklerini multi-deyim tablo değerli işlevler için oluşturmaz.Bu yaklaşım ile sorgu iyileştiricisi istatistikleri tablo sütunları oluşturabilir ve bunları daha iyi bir sorgu planı oluşturmak için kullanın.Multi-deyim tablo değerli işlevler hakkında daha fazla bilgi için bkz: Tür işlev.

  • Standart tablo veya geçici tablo tablo değişkenleri yerine kullanmayı düşünün.sorgu iyileştiricisi istatistiklerini tablo değişkenlerini oluşturmaz.Bu yaklaşım ile sorgu iyileştiricisi istatistikleri tablo sütunları oluşturabilir ve bunları daha iyi bir sorgu planı oluşturmak için kullanın.geçici tablo veya tablo değişkeni kullanılıp kullanılmayacağını belirleme Artıları ve eksileri vardır; Tablo değişkenlerini geçici tablolar'den daha az yeniden derlemelerinde saklı yordam saklı yordamlar neden kullanılır.Uygulamaya bağlı bir tablo değişkeni yerine geçici tablo kullanarak performansı değil.

  • Bir saklı yordam içinde geçirilen parametre kullanan bir sorgu içeriyorsa, sorgusunda kullanmadan önce saklı yordam içindeki parametre değerini değiştirme kaçının.Sorgu için kardinalite tahminleri aktarılan parametre değeri ve güncelleştirilmiş değere dayanır.Parametre değerinin değişmesini engellemek için iki saklı yordamları kullanmak için sorguyu yeniden yazabilirsiniz.

    Örneğin, aşağıdaki saklı yordam Sales.GetRecentSales parametresinin değerini değiştirir @date , @date is NULL.

    USE AdventureWorks2008R2;
    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 h, Sales.SalesOrderDetail d
        WHERE h.SalesOrderID = d.SalesOrderID
        AND h.OrderDate > @date
    END
    GO
    

    İlk için saklı yordam çağrısı Sales.GetRecentSales null geçirmeden @date parametresi sorgu iyileştiricisi saklı yordam için kardinalite tahmini ile derlenir @date = NULL sorgu yüklemi ile adlı değil olsa olsa @date = NULL.Bu kardinalite tahmini gerçek sorgu sonuç satır sayısını önemli ölçüde farklı olabilir.Sonuç olarak, sorgu iyileştiricisi hassasiyetli sorgu planı seçebilirsiniz.Bundan kaçınmak için saklı yordam iki yordam aşağıdaki gibi yeniden yazabilirsiniz:

    USE AdventureWorks2008R2;
    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))
        EXEC 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 h, Sales.SalesOrderDetail d
        WHERE h.SalesOrderID = d.SalesOrderID
        AND h.OrderDate > @date
    END
    GO
    

Sorgu ipuçları ile önem düzeyi tahminleri artırma

Yerel değişkenler için kardinalite tahminleri artırmak için veya bilinmeyen için en iyi duruma getirme en iyi duruma GETİRMEK için sorgu ipuçları ile yeniden kullanabilirsiniz.Daha fazla bilgi için bkz: Sorgu ipuçları (Transact-sql).

Bazı uygulamalar için sorguyu yeniden derlenerek çalıştırıldığı her saat çok fazla saat alabilir.En iyi duruma GETİRİCİSİ için sorgu ipucu yeniden seçeneği kullanmasanız bile yardımcı olabilir.Örneğin, saklı yordam için en iyi duruma GETİRİCİSİ için seçenek ekleyebilirsiniz Sales.GetRecentSales yapmak için belirli bir tarih.Aşağıdaki örnek en iyi duruma GETİRMEK için seçenek ekler Sales.GetRecentSales yordam.

USE AdventureWorks2008R2;
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 h, Sales.SalesOrderDetail 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ı ile önem düzeyi tahminleri artırma

Bazı uygulamalar, sorgu Tasarım yönergeleri kullanarak yeniden sorgu ipucu olabilir veya sorguyu değiştiremezsiniz çünkü uygulamak neden çok fazla recompiles.KULLANAN uygulama değişiklikleri uygulama satıcısıyla birlikte araştırmaya devam ederken sorgu davranışını denetlemek için planı gibi diğer ipuçları belirtmek için plan kılavuzları kullanabilirsiniz.Plan kılavuzları hakkında daha fazla bilgi için bkz: Plan kılavuzları kullanarak sorgular dağıtılan uygulamalar içinde en iyi duruma getirme.