Aracılığıyla paylaş


Düşük Query performans sorun giderme: Sabit Katlama ve ifade değerlendirme sırasında önem tahmin

SQL Server sorgu performansını artırmak için erken sabit bazı ifadeleri değerlendirir.Bu sabit Katlama olarak adlandırılır.Sabit olan birTransact-SQLhazır gibi3,'ABC','2005-12-31',1.0e3, or0x12345678.

Foldable ifadeleri

SQL Server Sabit ifade aşağıdaki türleriyle Katlama kullanır:

  • Aritmetik ifadeler gibi1+1, 5/3*2içeren yalnızca sabit.

  • Mantıksal ifadeler gibi1=1ve1>2 AND 3>4içeren yalnızca sabit.

  • yerleşik işlevler, değerlendirilir tarafından foldableSQL ServerCAST ve CONVERT.Genellikle, bir iç girişleri yalnızca bir işlev ve küme seçenekleri, dil ayarları, veritabanı seçenekleri ve şifreleme anahtarları gibi diğer bağlamsal bilgiler yok ise foldable işlevidir.Nondeterministic işlevleri foldable değildir.Belirli yerleşik bazı özel durumlar dışında foldable işlevlerdir.

Büyük nesne türleri için bir istisna yapılır.Çýktý türünü katlanabilir işleminin büyük nesne türü olup olmadığını ( metin , görüntünvarchar(max)varchar(max) veya varbinary(max) ), SQL Serverdeğil Katlama ifade.

Nonfoldable ifadeleri

Diğer ifade türleri foldable değildir.Özellikle, aşağıdaki türde ifadeler foldable değil:

  • Nonconstant ifade s gibi bir ifade sonuçlarını sütun değerini bağlıdır.

  • İfadeler, sonuçlar bir yerel değişken veya parametre gibi bağımlı@x.

  • Nondeterministic fonksiyonlar.

  • Kullanıcı tanımlı işlevler (her ikisi de Transact-SQLve CLR).

  • İfadeler, sonuçlar dil ayarlarına bağlıdır.

  • İfadeler, sonuçlar küme seçeneklere göre değişir.

  • İfadeler, sunucu yapılandırma seçeneklerini sonuçlarını bağlıdır.

Foldable ve Nonfoldable sabit deyimler ö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

PARAMETERIZATION veritabanı seçeneği yoksa küme ZORLAMAK için (varsayılan değer olan SIMPLE) Bu sorgu için daha sonra ifade117.00 + 1000.00değerlendirilen ve bunun sonucu olarak değiştirildi1117.00, sorgunun derlenmiş önce.Bu sabit Katlama yararları şunlardır:

  • Çalışma sırasında sürekli olarak değerlendirilecek ifade yok.

  • Sonra değerlendirilen ifadenin değerini sorgu iyileştirici sorgu bölümünün sonuç kümesinin boyutunu tahmin etmek için kullanılırTotalDue > 117.00 + 1000.00.

Öte yandan,, dbo.f olan bir kullanıcı tanımlı skaler fonksiyonunu, ifade dbo.f(100)değil Katlanmış, çünkü SQL Serverbelirli bile, kullanıcı tanımlı işlevler içeren ifadeler Katlama.

Derleme-saat ifade değerlendirme için önem düzeyi tahmin

Buna ek olarak, sabit olmayan bazı ifadeler Katlanmış ancak, bağımsız derleme sırasında bilinen saat bağımsız parametreleri veya sabitleri olup, en iyileştirme sırasında iyileştirici bir parçası olan bir sonuç kümesi boyutu (önem) estimator tarafından değerlendirilir.

En özellikle aşağıdaki yerleşik işlevler ve özel İşleçler değerlendirilme derleme saat tüm girişleri biliniyorsa: BÜYÜKHARF, KÜÇÜKHARF işlevi, RTRIM, DATEPART (yalnızca YY), GetDate, CAST ve CONVERT.

Aşağıdaki işleçler, derleme sırasında da değerlendirilir saat tüm girişleri biliniyorsa:

  • Aritmetik: +, -, *, /, unary -,

  • Mantıksal işleçleri: AND, OR, NOT

  • Karşılaştırma işleçleri: <,>,<=,>=,<>, LIKE, IS NULL, IS NOT NULL

Başka bir işlev veya operatörleri tarafından en iyi hale getirme sırasında önem düzeyi tahmini değerlendirilir.

Derlemesi-saat ifade değerlendirme örnekleri

Bunu göz önünde bulundurunTransact-SQLsaklı yordam:

USE AdventureWorks
GO
CREATE PROCEDURE MyProc( @d datetime )
AS
SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE OrderDate > @d+1

En iyi duruma getirilmesi SELECT deyiminde yordamı sırasında sonucun beklenen önem değerlendirmek iyileştirici çalışır küme koşul içinOrderDate > @d+1.İfade@d+1sabit konulmuş değil çünkü@dbir parametre.Ancak, en iyi duruma getirme saat parametresinin değeri verilir.Böylece, doğru bir şekilde yardımcı iyi Sorgu planını seçin sonuç kümesinin boyutunu tahmin etmek en iyi hale getirme.

Şimdi bir örnek dışında önceki bir benzer düşünün yerel bir değişken@d2değiştirir@d+1sorgu ve ifade değerlendirilen küme ifadesinin yerine sorgu.

USE AdventureWorks
GO
CREATE PROCEDURE MyProc2( @d datetime )
AS
BEGIN
DECLARE @d2 datetime
SET @d2 = @d+1
SELECT COUNT(*)
FROM Sales.SalesOrderHeader
WHERE OrderDate > @d2
END

SELECT deyimindeMyProc2SQL Server, değeri @d2değildir bilinen. getirilmiştir Nedenle, iyileştirici kullanır selectivity için bir varsayılan tahminiOrderDate > @d2, (Bu durumda yüzde 30),.

En iyi yöntemler: Planları derlemesi-saat ifade değerlendirme sabit Katlama ve en iyi sorgu oluşturuluyor için kullanma

En iyi sorgu planları oluşturmak emin olmak için sorgular, saklı yordamlar ve toplu işlemler sorgu iyileştirici sorgunuza, verilerin dağılımı ile ilgili istatistikleri temel koşulları selectivity doğru tahmin edebilirsiniz böylece tasarım en iyisidir.Aksi halde, iyileştirici bir varsayılan tahmini (örneğin, önceki örnekte yüzde 30) selectivity tahmin ettiğinizde kullanmanız gerekir.

En iyi hale getirme, önem estimator iyi tahminler sağlar emin olmak için önce AUTO_CREATE_STATISTICS ve AUTO_UPDATE_STATISTICS veritabanı küme seçenekleri (varsayılan ayar ON) olduğunu ya da, el ile İstatistikler bir sorguyu koşulunda başvurulan tüm sütunların üzerinde oluşturduğunuz emin olmalısınız.Koşullar, sorgularda tasarlarken, mümkün olduğunda daha sonra aşağıdakileri yapın:

  • Yerel değişken sorgularda kaçının.Bunun yerine, sorgu parametreleri, hazır ve ifadeler kullanın.

  • Sınır işleçleri ve işlevleri katıştırılmış altında listelenen bir parametre içeren bir sorguDerleme-saat ifade değerlendirme için önem düzeyi tahmin.

  • Bu sabit olduğundan emin olun-sorgu durumu yalnızca ifade edilir ya da foldable sabit-, ya da derleme zamanında değerlendirilebilir.

  • Bir sorguda kullanılan bir ifade için bir yerel değişken kullanmak varsa, sorguyu daha farklı bir kapsamda değerlendirirken göz önünde bulundurun.Örneğin, aşağıdakilerden birini gerçekleştirmek yararlı olabilir:

    • Değişkenin değerini değerlendirmek istediğiniz sorguyu içeren bir saklı yordam gönderirsiniz ve yordam parametresi yerel bir değişken yerine sorgu kullanamazsınız.

    • Kısmen yerel değişkenin değerine dayanarak bir sorgu içeren bir dize oluşturun ve sonra da dize dinamik SQL kullanarak yürütmek (EXEC veya sp_executesql ).

    • Sorgu parameterize ve kullanarak yürütmekSp_executesqlve parola parametresi olarak değişkenin değerini sorgu.