Zayıf sorgu performans sorun giderme: Sabit Katlama ve ifade değerlendirme sırasında önem düzeyi tahmin
SQL Server sorgu performansını artırmak için erken sabit bazı ifadeleri değerlendirir.Bu sabit Katlama olarak adlandırılır.A sabit is a Transact-SQL literal, such as 3, 'ABC', '2005-12-31', 1.0e3, or 0x12345678.
Foldable ifadeleri
SQL Server aşağıdaki türde ifadeler sabit Katlama kullanır:
Aritmetik ifadeleri gibi 1+1, 5/3*2, içeren yalnızca sabitler.
Mantıksal deyimler gibi 1=1 ve 1>2 AND 3>4, içeren yalnızca sabitler.
Foldable tarafından kabul edilen yerleşik işlevleri SQL Servercast ve convert.Genellikle, bir iç, girişlerinin yalnızca bir işlev ve değil diğer bağlamsal bilgiler, set seçenekleri, dil ayarları, veritabanı seçeneklerini ve şifreleme anahtarları gibi ise foldable işlevidir.Belirleyici olmayan işlevler foldable.Yerleşik işlevler Deterministic foldable bazı istisnalar.
Büyük nesne türleri için bir istisna yapılır.Çıktı türü katlanabilir işleminin büyük nesne türü olup olmadığını (text, image, nvarchar(max), varchar(max), veya varbinary(max)), sonra SQL Server değil katlayın ifade.
Nonfoldable ifadeleri
Diğer tüm ifade türleri foldable değil.Özellikle, aşağıdaki türde ifadeler foldable şunlardır:
Nonconstant ifadeler gibi bir ifade, sonuç sütun değerine bağlı.
İfadeler, sonuçlar gibi yerel bir değişken veya parametre üzerinde bağımlı @x.
Belirleyici olmayan fonksiyonlar.
Kullanıcı tanımlı işlevler (her ikisi de Transact-SQL ve clr).
İfadeler, sonuçlar dil ayarlarına bağlıdır.
İfadeler, sonuçlar set seçeneklere göre değişir.
İfadeler, sonuçlar sunucu yapılandırma seçeneklere göre değişir.
Foldable ve Nonfoldable sabit ifade örnekleri
Aşağıdaki sorgu göz önünde bulundurun:
SELECT *
FROM Sales.SalesOrderHeader s JOIN sales.SalesOrderDetail d
ON s.SalesOrderID = d.SalesOrderID
WHERE TotalDue > 117.00 + 1000.00
PARAMETERİZASYONUNU veritabanı seçeneği ise küme ZORLANMASI için bu sorgu için (varsayılan, basit) sonra ifade 117.00 + 1000.00 değerlendirilir ve sonucu, başvuruların 1117.00, sorgunun derlenmiş önce.Bu sabit Katlama yararları şunlardır:
Çalışma sırasında sürekli olarak değerlendirilecek ifade yok saat.
Bunu değerlendirilir sonra ifadenin değeri sorgu en iyi duruma getiricisi tarafından boyutunu tahmin etmek için kullanılan sonuç küme sorgu bölümünün TotalDue > 117.00 + 1000.00.
Diğer taraftan, dbo.f skaler kullanıcı tanımlı bir işlev, iş ifade dbo.f(100) değil katlanır, çünkü SQL Server Katlama ifadedeterministic olsalar bile, kullanıcı tanımlı işlevler içeren s.
Önem düzeyi tahmini için derleme zamanı ifade değerlendirme
Buna ek olarak, sabit bazı ifadeler katlanır ama bağımsız değişkenler, sabitler, veya parametreleri olup olmadığını, bağımsız derleme saat olduğu bilinen değerlendirilir en iyileştirme sırasında iyileştirici bir parçası olan sonuç küme boyutu (kardinalite) estimator tarafından.
Özellikle, aşağıdaki yerleşik işlevler ve özel işleçleri sırasında değerlendirilmesini derleme saat tüm girişleri biliniyorsa: ÜST, alt, RTRIM, datepart (yalnızca yy), GetDate, cast ve convert.
Aşağıdaki işleçler de at değerlendirilir derleme saat tüm girişleri biliniyorsa:
Aritmetik işleçleri: +,-, *, /, tekli-,
Mantıksal işleçler: VE, VEYA, DEĞİL
Karşılaştırma işleçleri: <, >, <= >=, <>, LIKE, null, null değil
Diğer işlevler ve işleçler sırasında kardinalite tahmin en iyi duruma getiricisi tarafından değerlendirilir.
Derleme zamanı ifade değerlendirme örnekleri
Bunu göz önünde Transact-SQL saklı yordam:
USE AdventureWorks2008R2;
GO
CREATE PROCEDURE MyProc( @d datetime )
AS
SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE OrderDate > @d+1;
select en iyi duruma getirilmesi sırasında deyim beklenen kardinalite düzeyini sonuç kümeni koşul için değerlendirmek en iyi duruma getiricisi yordamda çalışır OrderDate > @d+1.ifade @d+1 değil sabit-katlanır, çünkü @d bir parametre.Ancak, en iyi duruma getirme saat parametresinin değeri verilir.Böylece, doğru boyutunu tahmin etmek en iyi duruma getiricisi sonuç küme, yardımcı olan onu iyi sorgu planını seçin.
Şimdi bir örnek dışında önceki bir benzer düşünün bir yerel değişken @d2 yerini @d+1 Sorgulama ve deyim de değerlendirildi deyiminde bir KÜMESİ yerine sorgu.
USE AdventureWorks2008R2;
GO
CREATE PROCEDURE MyProc2( @d datetime )
AS
BEGIN
DECLARE @d2 datetime
SET @d2 = @d+1
SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE OrderDate > @d2
END;
Zaman SELECT deyim içinde MyProc2 en iyi SQL Serverdeğeri, @d2 olduğu bilinen.Bu nedenle, en iyi duruma getiricisi varsayılan tahmin için meydana kullanır OrderDate > @d2, (Bu durum yüzde 30'u).
En iyi uygulamalar: En iyi bir sorgu oluşturmak için sabit Katlama ve derleme zamanı ifade değerlendirme kullanma planları
En iyi sorgu planları oluşturmak emin olmak için bu tasarım sorguları, depolanmış yordamları ve toplu işlemleri için en iyi şekilde sorgu iyileştiricisi Sorgunuzdaki veri dağıtım ile ilgili istatistikleri temel koşullardan meydana doğru olarak tahmin edebilirsiniz.Aksi halde, en iyi duruma getiricisi varsayılan tahmin (örneğin, önceki örnekte yüzde 30) meydana tahmin ettiğinizde kullanmanız gerekir.
kardinalite estimator optimizer'ın iyi tahminler sağlar emin olmak için öncelikle AUTO_CREATE_STATISTICS ve AUTO_UPDATE_STATISTICS veritabanı seçeneklerini ayarlama (varsayılan ayar) olduğunu veya el ile İstatistikler sorgu koşulunda başvurulan tüm sütunların üzerinde oluşturduğunuz emin olmanız gerekir.Daha sonra koşulları sorgularınızda tasarlarken, mümkün olduğunda aşağıdakileri yapın:
Sorguları yerel değişkenlerin kullanımını önlemek.Bunun yerine, Parametreler, harfleri veya ifadeler kullanabilirsiniz.
İşleçlerin kullanımını sınırlamak ve altında olanlar için bir parametre içeren bir sorgu katıştırılmış işlevleri listelenen Compile-Time Expression Evaluation for Cardinality Estimation.
Sorgunuz koşul ifadelerde yalnızca sabit ya da emin olun foldable sabiti-, derleme sırasında değerlendirilir saat.
Bir sorguda kullanılan bir deyim değerlendirmek için yerel bir değişken kullanmanız gerekiyorsa, farklı bir değerlendirme göz önünde kapsam sorgu daha.Örneğin, aşağıdakilerden birini gerçekleştirmek yararlı olabilir:
Değerlendirmek istediğiniz sorguyu içeren bir saklı yordam değişken değeri geçmesine ve yordam parametresi yerel değişken yerine sorgu kullanımı vardır.
Kısmen yerel değişkenin değerine dayalı bir sorgu içeren bir dize oluşturun ve sonra dize dinamik sql kullanarak yürütmek (exec veya sp_executesql).
Sorgu stratejisinin ve kullanarak yürütmek sp_executesqlve değişkenin değeri bir parametresi olarak sorgusu.
Ayrıca bkz.