İstatistikler

Sorgu iyileştirici istatistiklerini sorgu performansını artırmak sorgu planları oluşturmak için kullanır. Sorguların çoğu için sorgu en iyi duruma getiricisi zaten kaliteli sorgu planı için gerekli istatistikleri oluşturur; Bazı durumlarda, ek istatistikler oluşturmak veya en iyi sonuçlar için sorgu tasarımını değiştirmek gerekiyor. Bu konuda istatistik kavramları açıklanır ve sorgu performansı istatistikleri verimli kullanma yönergeleri sağlar.

Bu Konuda

  • Bileşenleri ve kavramlar

  • İstatistik oluşturma

  • Istatistikleri güncelleştirmek ne zaman

  • Bu kullanım istatistikleri etkili sorgular

Bileşenleri ve kavramlar

  • İstatistikler
    İstatistikler Sorgu en iyi duruma getirme, bir tablo veya dizin oluşturulmuş görünüm bir veya daha fazla sütundaki değerlerin dağılımı hakkındaki istatistiksel bilgileri içeren nesneleri vardır. Query optimizer tahmin etmek için bu istatistikleri kullanır önem, ya da sorgu sonucu içinde satır sayısı. Bunlar önem düzeyi tahminleri yüksek kaliteli sorgu planı oluşturmak query optimizer etkinleştirin. Örneğin, query optimizer-ebil kullanma önem düzeyi dizin daha yoğun kaynak dizin tarama işleci yerine ve bu sayede işleç Ara seçim tahminleri sorgu performansını artırmak.

    Her istatistikleri nesne üzerinde bir veya daha fazla tablo sütunu listesi oluşturulur ve ilk sütunundaki değerleri dağıtım görüntüleme çubuk grafik içerir. Birden çok sütun nesnelerde istatistikleri de değerleri sütunlar arasında korelasyon hakkındaki istatistiksel bilgileri depolar. Bu korelasyon istatistikleri veya yoğunlukları, sütun değerlerini ayrı satır sayısını türetilmiştir. İstatistik nesneler hakkında daha fazla bilgi için bkz: dbcc SHOW_STATISTICS (Transact-sql).

  • Filtre uygulanmış istatistikleri
    Filtre uygulanmış istatistikleri veri iyi tanımlanmış alt kümeleri seçtiğiniz sorguları için sorgu performansı artırabilir. Filtre uygulanmış istatistikleri, istatistiklere dahil edilen veri alt kümesini seçmek için bir filtre yüklemi kullanın. İyi tasarlanmış filtre uygulanmış istatistikleri sorgu yürütme planı tam tablo istatistikleri ile karşılaştırıldığında artırabilirsiniz. Filtre yüklemi hakkında daha fazla bilgi için bkz: İstatistikler (Transact-sql) oluştur. Filtre uygulanmış istatistikleri oluşturma hakkında daha fazla bilgi için bkz: için Create STATISTICS ne zaman bu konu bölümünde. Bir örnek çalışma için bkz: blog girişi Kullanarak filtre uygulanmış istatistikleri bölümlenmiş tablolar ile, sqlcat Web sitesinde.

  • İstatistikleri seçenekleri
    Ne zaman ve istatistikleri nasıl oluşturulduğunu ve updated etkiler ayarlayabileceğiniz üç seçenek vardır. Bu seçenekler yalnızca veritabanı düzeyinde ayarlanır.

    • AUTO_CREATE_STATISTICS seçeneği
      Otomatik istatistik seçeneği oluşturduğunuzda AUTO_CREATE_STATISTICS, 's, sorgu en iyi duruma getiricisi sorgu yüklemi, gerektiğinde sorgu planı için önem düzeyi tahminleri artırmak tek tek sütunlarda istatistikleri oluşturur. Bu tek sütunlu istatistikleri, zaten bir histogram varolan istatistikleri nesnesi olmayan sütunlar üzerinde oluşturulur. Dizinler için oluşturulmuş ister istatistikleri AUTO_CREATE_STATISTICS seçeneği belirlemez. Bu seçenek, filtre uygulanmış istatistikleri de oluşturmaz. O kesinlikle tek sütunlu istatistikleri tüm tablo için geçerlidir.

      Sorgu en iyi duruma getiricisi istatistikleri AUTO_CREATE_STATISTICS seçeneği kullanılarak sonucu oluşturduğunda, istatistikleri adı ile başlayan _WA. Aşağıdaki sorgu, sorgu en iyi duruma getiricisi sorgu koşul sütunu istatistikleri yarattı, belirlemek için 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 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
      AUTO_UPDATE_STATISTICS, otomatik güncelleştirme istatistikleri seçeneği açık olduğunda, sorgu en iyi duruma getiricisi istatistikleri ne zaman güncel olmayabilir ve bir sorgu tarafından kullanıldıkları zaman onları güncelleştirir belirler. Ekleme, güncelleştirme, silme veya birleştirme işlemleri tablo veya dizin oluşturulmuş görünüm veri dağıtım değiştirdikten sonra istatistikleri güncel olur. Query optimizer, ne zaman istatistikleri beri son istatistikleri güncelleştirme veri değişiklikleri sayılması ve eşik değişiklikleri sayısını karşılaştırarak güncel olmayabilir belirler. Eşik tablo veya dizin oluşturulmuş görünüm satır sayısını temel alır.

      Sorgu en iyi duruma getiricisi sorgu derleme öncesi ve önbelleğe alınan sorgu planı yürütmeden önce güncel istatistikleri denetler. Bir sorgu derlemeden önce query optimizer hangi istatistikleri güncel olmayabilir belirlemek için sorgu yüklemi dizin oluşturulmuş görünümler, tablolar ve sütunlar kullanır. Önbelleğe alınan sorgu planı yürütmeden önce Veritabanı Altyapısısorgu planı güncel istatistik başvurduğu doğrular.

      AUTO_UPDATE_STATISTICS seçeneği için dizinler tek-sütunları sorgu yüklemler, oluşturulan istatistikleri nesneler için geçerlidir ve ile oluşturulmuş istatistikleri create STATISTICS deyimi. Bu seçenek ayrıca, filtre uygulanmış istatistikleri için de geçerlidir.

    • AUTO_UPDATE_STATISTICS_ASYNC
      Zaman uyumsuz istatistikleri güncelleştirme seçeneği, AUTO_UPDATE_STATISTICS_ASYNC, query optimizer 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ştirici istatistiklerini eşzamanlı olarak güncelleştirir. AUTO_UPDATE_STATISTICS_ASYNC seçeneği için dizinler sorgu yüklemler tek sütunları oluşturulan istatistikleri nesneler için geçerlidir ve ile oluşturulmuş istatistikleri create STATISTICS deyimi.

      İstatistikleri güncelleştirmek-ebilmek var olmak ikisinden biri senkron (varsayılan) veya zaman uyumsuz. Eşzamanlı istatistikleri güncelleştirmeleri, sorguları daima derleyin ve güncel istatistikleri ile yürütmek; İstatistikler güncel olduğunda, query optimizer güncelleştirilmiş istatistikleri derlemek ve sorguyu yürütmeden önce bekler. Varolan istatistikler güncel olsa bile zaman uyumsuz istatistikleri güncelleştirme ile sorguları ile mevcut İstatistikler derlemek; Sorgu derlediğinde Eğer istatistikleri güncel sorgu en iyi duruma getiricisi suboptimal sorgu planı seçebilirsiniz. Güncelleştirilmiş istatistikleri kullanarak zaman uyumsuz güncelleştirmeler tamamladıktan sonra derlemek sorguları yararlanacaktır.

      Dağılımı Tablo kesilmesi veya satırları büyük bir yüzdesi bir toplu güncelleştirme gerçekleştirme gibi veri değiştirme işlemleri gerçekleştirdiğinizde eşzamanlı istatistikleri kullanmayı düşünün. İşlemi tamamladıktan sonra İstatistikler güncelleştirmezseniz, eşzamanlı istatistikleri kullanarak değiştirilen verileri sorgular çalıştırmadan önce istatistikleri güncel sağlayacaktır.

      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ın sık sık aynı sorgu, benzer sorgular veya benzer önbelleğe alınan sorgu planlarını yürütür. Sorgu yanıt süreleri, daha öngörülebilir eşzamanlı istatistikleri güncelleştirmeleri ile zaman uyumsuz istatistikleri güncelleştirmeleri olabilir, çünkü query optimizer gelen sorguları için güncel istatistikleri beklemeden yürütebilirsiniz. Bu, bazı sorgular ve diğerlerini geciktirerek engeller. Benzer sorguları bulma hakkında daha fazla bilgi için bkz: Finding and Tuning Similar Queries by Using Query and Query Plan Hashes.

      • Uygulamanızın istemci isteği zaman aşımlarını güncelleştirilmiş istatistikleri için bekleyen bir veya birkaç sorgu nedeniyle yaşadı. Bazı durumlarda, eşzamanlı istatistikleri için bekleyen uygulamalar agresif zaman aşımlarını ile başarısız olmasına neden olabilir.

Başa Dön bağlantısıyla kullanılan ok simgesiBaşa dön

İstatistik oluşturma

Sorgu en iyi duruma getiricisi istatistikleri aşağıdaki şekillerde zaten oluşturur:

  1. Dizin oluşturulduğunda query optimizer tablo veya görünümlerin üzerinde dizinler için istatistikleri oluşturur. Bu istatistikler, dizin anahtar sütunları oluşturulur. Dizin filtre uygulanmış bir dizindir, query optimizer aynı alt filtre uygulanmış dizin için belirtilen satır filtre uygulanmış istatistikleri oluşturur. Filtre uygulanmış dizinler hakkında daha fazla bilgi için Filtre uygulanmış dizinler oluşturmave Index (Transact-sql) oluştur.

  2. AUTO_CREATE_STATISTICS açık olduğunda sorgu iyileştirici istatistiklerini tek sütun sorgu yüklemler oluşturur.

Sorguların çoğu için yüksek kaliteli sorgu planı için istatistikler oluşturmak için bu iki yöntem sağlamak; Bazı durumlarda, ek istatistikleri ile oluşturarak sorgu planları artırabilir create STATISTICS deyimi. Bu ek istatistikler dizinler veya tek bir sütun için İstatistikler oluşturduğunda, sorgu en iyi duruma getiricisi için hesaba katmaz istatistiksel korelasyonlar yakalayabilirsiniz. Uygulamanızın ek istatistik korelasyonlar, eğer bir istatistik nesnesine hesaplanan sorgu planları geliştirmek query optimizer veren tablo verileri olabilir. Örneğin, filtre uygulanmış istatistikleri veri satırlar alt kümesini veya sorgu koşul sütunlar üzerinde sütunlu istatistikleri sorgu planı yükseltebilir.

İstatistikleri STATISTICS create deyimi ile oluştururken, böylece düzenli olarak sorgu koşul sütunları tek sütunlu istatistikleri oluşturmak query optimizer devam AUTO_CREATE_STATISTICS seçeneği tutmak öneririz. Sorgu yüklemler hakkında daha fazla bilgi için bkz: Arama koşulu (Transact-sql).

Aşağıdakilerden herhangi birini uygulanmadığında istatistikleri STATISTICS create deyimi ile oluşturmayı düşünün:

  • Veritabanı Altyapısıİstatistikleri oluşturma önerir Danışmanı.

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

  • Sorgu alt veri seçer.

  • Sorgu istatistikleri eksik vardır.

Sütunları sorgu yüklemi çoklu korelasyon

Sorgu yüklemi çapraz-sütun ilişkileri ve bağımlılıkları sahip birden fazla sütun içeriyorsa, birden çok sütun istatistikleri sorgu planı geliştirmek. Birden çok sütun istatistikleri içeren sütun çapraz korelasyon istatistikleri, denilen yoğunlukları, tek sütunlu istatistikleri kullanılabilir değildir. Sorgu sonuçları arasında birden çok sütun veri ilişkileri güvenebilirsiniz zaman yoğunlukları önem düzeyi tahminleri artırabilir.

Sütunları aynı dizini varsa, sütunlu istatistikleri nesnesi zaten ve el ile oluşturmak gerekli değildir. Sütunları aynı dizinde değilseniz, sütunlu istatistikleri sütunlar üzerinde dizin oluşturma veya STATISTICS create deyimi kullanarak oluşturabilirsiniz. Bir dizin istatistikleri nesne daha korumak için daha fazla sistem kaynağı gerektirir. Uygulama sütunlu dizin gerektirmiyorsa, dizin oluşturmadan istatistikleri nesne oluşturarak sistem kaynaklarını tasarruf.

Sütunlu istatistikleri oluştururken, yoğunlukları için önem düzeyi tahminleri yapma etkinliği istatistikleri nesnesi tanımında sütunların sırasını etkiler. Istatistikleri nesnenin yoğunlukları anahtar sütunlarının her önek için istatistikleri nesnesi tanımında depolar. Yoğunlukları hakkında daha fazla bilgi için bkz: dbcc SHOW_STATISTICS (Transact-sql).

İçin önem düzeyi tahminleri yararlı yoğunlukları oluşturmak için sorgu yüklemi sütunları 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 AdventureWorks2012;
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, istatistikleri nesne LastFirstyoğunlukları aşağıdaki sütun önekler için vardır: (LastName), (LastName, MiddleName), ve (LastName, MiddleName, FirstName). Yoğunluğu için kullanılamaz (LastName, FirstName). Sorgu kullanıyorsa, LastNameve FirstNameolmadan MiddleName, yoğunluğu için önem düzeyi tahminleri yok.

Alt veri sayfasından sorgu seçer

Sorgu iyileştirici istatistiklerini tek sütun ve dizin oluşturduğunda, tüm satırlar için değerleri istatistikleri oluşturur. Satırlar alt kümesini sorguları'nı seçin ve bu satırlar alt kümesini benzersiz veri dağıtımı varsa filtre uygulanmış istatistikleri sorgu planları artırabilir. Filtre uygulanmış istatistikleri filtre Koşul ifadesi tanımlamak için where yan tümcesi ile STATISTICS create deyimi kullanarak oluşturabilirsiniz.

Örneğin, AdventureWorks2012, her ürün Production.Producttablonun ait dört kategoride birine Production.ProductCategorytablo: Motosiklet, bileşenleri, giyim ve Aksesuar. Her kategori, ağırlık için farklı veri dağılımı: Bisiklet ağırlıkları aralığındadır 13.77 30,0, bileşen ağırlıkları 1050.00 bazı null değerleri ile 2.12 aralığı, giyim ağırlıkları tüm boş ve Aksesuar ağırlıkları da boş.

Motosiklet örnek olarak kullanarak, filtre uygulanmış istatistikleri tüm bisiklet ağırlıkları daha doğru istatistikler sorgu en iyi duruma getiricisi için sağlayacak ve Tarih tam tablo istatistiklerini veya varolmayan istatistikleri ile karşılaştırıldığında sorgu planı kalitesini iyileştirebilir Weightsütun. Ağırlık arama sayısı nispeten küçük ise motor ağırlığı filtre uygulanmış istatistikleri için iyi bir aday ama ille bir filtre uygulanmış dizin için iyi bir aday sütundur. Performans kazanç değil baskın ek bakım ve depolama maliyeti bir filtre uygulanmış dizin veritabanına eklemek için bir filtre uygulanmış dizin sağlayan aramaları için.

Aşağıdaki deyimi oluşturur BikeWeightsİstatistik alt kategorilerin tüm motosiklet için filtre. Tüm bisiklet alt kategorileri ile karşılaştırma numaralandırma tarafından Bisikletleri süzülmüş doğrulama deyimi tanımlar Production.ProductSubcategoryID IN (1,2,3). Yüklemi motosiklet kategori adını kullanamazsınız, çünkü saklandığı Production.ProductCategorytablo ve süzgeç ifadesinde tüm sütunlar aynı tabloda olması gerekir.

USE AdventureWorks2012;
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

Query optimizer-ebilmek kullanma BikeWeightsdaha fazla ağırlık motosikletlerin seçer aşağıdaki sorguyu sorgu planı geliştirmek için istatistikleri filtre daha 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 tanımlar

Hata veya diğer olay sorgu iyileştirici istatistiklerini oluşturmasını engeller, sorgu en iyi duruma getiricisi sorgu planı istatistikleri kullanmadan oluşturur. Sorgu iyileştirici istatistiklerini eksik olarak işaretler ve İstatistikler Sorgu yürütüldükten sonraki yeniden dener.

Eksik istatistikleri belirttiği gibi uyarılar (tablo adı kırmızı metin) bir sorgu yürütme planı kullanarak grafik görüntülendiğinde SQL Server Management Studio. Daha fazla bilgi için, bkz. Graphically Displaying the Execution Plan Using SQL Server Management Studio. Ayrıca, izleme Missing Column Statistics kullanarak olay sınıfı SQL Server Profilerİstatistikleri eksik olduğunda 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ştirici istatistiklerini kaydedemezsiniz.

  • Eksik istatistikleri STATISTICS create deyimi kullanarak oluşturun.

Ne zaman bir veritabanı salt okunur veya salt okunur anlık istatistik eksik ya da bayat, Veritabanı Altyapısıoluşturur ve geçici istatistiklere tutar tempdb. Ne zaman Veritabanı Altyapısıgeçici istatistikleri oluşturur istatistikleri adı soneki eklenir _readonly_database_statisticgeçici istatistikleri kalıcı istatistiklerinden ayırt etmek için. Sonek _readonly_database_statistictarafından oluşturulan istatistikleri için ayrılmış SQL Server. Geçici istatistikleri için komut dosyası oluşturulabilir ve okuma-yazma veritabanı çoğaltılabilir. Komut dosyası zaman, Management Studioİstatistikleri adı soneki değiştirir _readonly_database_statistic için _readonly_database_statistic_scripted.

Sadece SQL Serveroluşturmak ve güncelleştirmek geçici istatistikleri. Ancak, geçici İstatistikleri Sil ve kalıcı istatistikleri için kullandığınız aynı araçları kullanarak İstatistikler özelliklerini izlemek:

  • Geçici İstatistikleri Sil kullanarak İstatistikler (Transact-sql) bırakdeyimi.

  • İzleme istatistiklerini kullanarak verir.Istatistik ve sys.stats_columns katalog görünümler. sys_stats içeren is_temporary hangi istatistikleri kalıcı belirtmek için sütun ve geçici vardır.

Çünkü geçici istatistiklerini depolanan tempdb, yeniden SQL Serverhizmet neden yok tüm geçici istatistikleri.

Başa Dön bağlantısıyla kullanılan ok simgesiBaşa dön

Istatistikleri güncelleştirmek ne zaman

Sorgu en iyi duruma getiricisi istatistikleri ne zaman güncel olmayabilir ve bir sorgu planı için gerektiğinde onları güncelleştirir belirler. Bazı durumlarda sorgu planı geliştirmek ve bu nedenle daha sık AUTO_UPDATE_STATISTICS açık olduğunda ortaya daha güncelleştirme istatistikleri tarafından sorgu performansını artırmak. update STATISTICS deyimi veya depolanmış yordam ile istatistikleri güncelleştirme sp_updatestats.

İstatistikleri güncelleştirmek sorguların güncel istatistiklerle derlenmesini garantiler. Ancak istatistikleri güncelleştirmek sorguların yeniden derlenmesine neden olur. Sorgu planlarını iyileştirmekle sorguları yeniden derlemenin aldığı süre arasında bir karşılıklı denge olduğundan istatistikleri çok sık güncelleştirmemenizi öneririz. Özgül dengeler uygulamanıza bağlıdır.

İstatistikleri Güncelleştir istatistikleri ile güncelleştirirken veya sp_updatestats, AUTO_UPDATE_STATISTICS on olarak ayarlayabilir, böylece sorgu en iyi duruma getiricisi istatistikleri düzenli olarak güncelleştirme devam ediyor tutarak öneririz. Bir sütun, bir dizin, bir tablo veya dizin oluşturulmuş görünüm istatistikleri güncelleştirme hakkında daha fazla bilgi için bkz: UPDATE STATISTICS (Transact-SQL). Tüm kullanıcı tanımlı ve iç tablolar veritabanı istatistikleri güncelleştirme hakkında daha fazla bilgi için bkz: saklı yordam sp_updatestats (Transact-sql).

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

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

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

  • Ekleme işlemleri anahtar sütunları azalan veya artan oluşur.

  • Bakım işlemleri sonra.

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

Sorgu yanıt süreleri yavaş veya öngörülemeyen, ek sorun giderme adımları gerçekleştirmeden önce sorgular güncel istatistik olduğundan emin olun. Yavaş çalışan sorgularda sorun giderme hakkında daha fazla bilgi için bkz: Checklist for Analyzing Slow-Running Queries.

Artan veya azalan anahtar sütunlar ekleme işlemleri meydana

KİMLİK ya da gerçek zamanlı zaman damgası sütun, anahtar sütunları azalan veya artan istatistikleri query optimizer gerçekleştirdiği çok daha sık istatistikleri güncelleştirmeleri gerekebilir. Ekleme işlemleri, azalan veya sütunlar için yeni değerler ekler. Eklenen satır sayısı istatistikleri güncelleştirme tetiklemek için çok küçük olabilir. İstatistikler güncel değildir ve en son eklenen satırların sorgular seçerseniz, geçerli istatistiklerini bu yeni değerler için önem düzeyi tahminleri yoktur. Bu yanlış önem düzeyi tahminleri ve yavaş sorgu performansı neden olabilir.

Örneğin, en son satış sipariş tarihleri seçer sorgu yanlış önem düzeyi tahminleri olacak en son satış sipariş tarihleri için önem düzeyi tahminleri dahil istatistikleri güncelleştirilmez.

Sonra bakım işlemleri

Güncelleştirme istatistikleri Tablo kesilmesi veya bulk INSERT satır büyük bir yüzdesi, performans gibi veri dağılımını değiştirmek bakım yordamlarını gerçekleştirdikten sonra düşünün. Bu sorguları otomatik istatistik güncelleştirme için beklerken sorgu işleme gelecekteki gecikmeler önleyebilirsiniz.

Yeniden oluşturma gibi işlemleri birleştirmek veya bir dizin yeniden düzenleme, veri dağıtım değiştirmeyin. Bu nedenle, alter DIZINI YENIDEN, dbcc VERİTABANINIZDAN, dbcc INDEXDEFRAG veya alter dizin yeniden düzenleme işlemlerini gerçekleştirdikten sonra istatistikleri güncelleştirme gerekmez. Bir tablo veya Görünüm alter DIZINI YENIDEN veya dbcc DBREINDEX, dizin yeniden oluşturma sorgu iyileştirici istatistiklerini ancak güncelleştirir; Bu istatistikleri güncelleştirme dizin yeniden oluşturmayı ve bir yan ürün olduğu. Sorgu iyileştirici istatistiklerini dbcc INDEXDEFRAG ya da alter dizin yeniden düzenleme işlemleri sonra güncelleştirmez.

Başa Dön bağlantısıyla kullanılan ok simgesiBaşa dön

İstatistik etkili kullanan sorguları

Yerel değişkenler ve sorgu yüklemi karmaşık ifadeleri gibi belirli sorgu uygulamaları suboptimal sorgu planları için yol açabilir. İstatistikleri verimli bir şekilde kullanmak için sorgu 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'nın etkili kullanan sorgu Tasarım yönergeleri uygulayarak iyileştirebileceğinizi önem düzeyi tahminleri ifadeler, değişkenler ve sorgu yüklemler kullanılan işlevler. Sorgu iyileştirici bir ifade, değişken veya işlevin değerini bilmiyor hangi değeri histogram aramasında bilmiyor ve bu nedenle en iyi önem düzeyi tahmin histogram alamıyor. Bunun yerine, query optimizer tüm histogram örneklenen satırları ayrı değer başına satır ortalama sayısı önem düzeyi tahmini dayandırır. Bu suboptimal önem düzeyi tahminleri için yol ve sorgu performansı zarar veremez.

Aşağıdaki yönergeler, sorgular sorgu planları önem düzeyi tahminleri geliştirerek artırmak için yazma açıklar.

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

İfadeler için önem düzeyi tahminleri artırmak için aşağıdaki yönergeleri izleyin:

  • Mümkün olduğunda, onları sabitleri ifadelerle basitleştirin. Query optimizer, tüm işlev ve belirlenmesinde önem düzeyi tahminleri sabitlerini içeren deyimleri değerlendirmek değil. Örneğin, abs İfadeyi sadeleştirmek (-100) to 100.

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

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

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

  • Yerel bir değişken sorgu yüklemi kullanır, sorgu parametresi yerine yerel bir değişken kullanmanız için yeniden düşünün. Sorgu en iyi duruma getiricisi sorgu yürütme planı oluştururken, yerel bir değişken değeri bilinmiyor. Parametre sorgusu, sorgu en iyi duruma getiricisi saklı yordama geçirilen ilk gerçek parametre değeri için önem düzeyi tahmini kullanır.

  • Multi-statement tablo değerli işlevler sonuçları tutmak için standart tablo veya geçici tablo kullanmayı düşünün. Sorgu iyileştirici istatistiklerini multi-statement tablo değerli işlevler oluşturmaz. Bu yaklaşım ile query optimizer istatistikleri tablo sütunlar oluşturabilir ve onları daha iyi bir sorgu planı oluşturmak için kullanın. Multi-statement tablo değerli işlevler hakkında daha fazla bilgi için bkz: Types of Functions.

  • Standart tablo veya geçici tablo tablo değişkenleri yerine kullanmayı düşünün. Sorgu iyileştirici istatistiklerini tablo değişkenlerini oluşturmaz. Bu yaklaşım ile query optimizer istatistikleri tablo sütunlar oluşturabilir ve onları daha iyi bir sorgu planı oluşturmak için kullanın. Geçici bir tablo veya tablo değişkeni kullanılacağını belirlemede bir bileşim vardır; Tablo değişkenlerini, daha az sayıda derlemelerinde saklı yordam daha geçici tablolar için saklı yordamlar neden kullanılır. Uygulamaya bağlı bir tablo değişkeni yerine geçici bir tablo kullanarak performansı değil.

  • Bir saklı yordam bir geçirilen parametre kullanan bir sorgu içeriyorsa, sorgu kullanmadan önce saklı yordam içindeki parametre değeri değiştirmekten kaçının. Sorgu için önem düzeyi tahminleri geçti de parametre değeri ve güncelleştirilmiş değere dayanır. Parametre değeri değiştirme önlemek için iki saklı yordamları kullanmak için sorguyu yeniden yazabilirsiniz.

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

    USE AdventureWorks2012;
    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
    

    Saklı yordam için ilk çağrı Sales.GetRecentSalesnull geçirmeden @dateparametresi, query optimizer saklı yordam için önem düzeyi tahmini ile derleyip @date = NULLdüz-se bile sorgu yüklemi ile olarak değil @date = NULL. Bu önem düzeyi tahmini satır gerçek sorgu sonuç sayısını önemli ölçüde farklı olabilir. Sonuç olarak, sorgu en iyi duruma getiricisi suboptimal sorgu planı seçebilirsiniz. Bunu önlemek için saklı yordam iki yordam yazabilirsiniz gibidir:

    USE AdventureWorks2012;
    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 önem düzeyi tahminleri artırmak için en iyi duruma getirmek için ya da bilinmeyen optimize etmek için sorgu ipuçları RECOMPILE ile kullanabilirsiniz. Daha fazla bilgi için, bkz. Sorgu ipuçları (Transact-sql).

Bazı uygulamalarda, sorguyu yeniden yürütülür her zaman çok fazla zaman alabilir. En iyi duruma GETİRİCİSİ için sorgu ipucu RECOMPILE seçeneği kullanmasanız bile yardımcı olabilir. Örneğin, sen-ebil eklemek bir doktoru seçeneği için saklı yordam Sales.GetRecentSalesbelirli bir Tarih belirtmek için. Aşağıdaki örnek, en iyi duruma getirmek için seçeneği ekler Sales.GetRecentSalesyordam.

USE AdventureWorks2012;
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 için sorgu Tasarım Kılavuzu RECOMPILE sorgu ipucu kullanma olabilir veya sorguyu değiştiremezsiniz çünkü uygulanmayabilir neden çok fazla recompiles. Uygulama değişiklikleri uygulamanın satıcısıyla soruşturma sırasında sorguyu davranışını denetlemek için use 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ı.

Başa Dön bağlantısıyla kullanılan ok simgesiBaşa dön

Ayrıca bkz.

Başvuru

İstatistikler (Transact-sql) oluştur

UPDATE STATISTICS (Transact-SQL)

sp_updatestats (Transact-sql)

dbcc SHOW_STATISTICS (Transact-sql)

alter database set seçenekleri (Transact-sql)

İstatistikler (Transact-sql) bırak

Index (Transact-sql) oluştur

ALTER INDEX (Transact-SQL)

Kavramlar

Filtre uygulanmış dizinler oluşturma