Udostępnij za pośrednictwem


Troubleshooting Poor Query Performance: Constant Folding and Expression Evaluation During Cardinality Estimation

SQL Server niektóre wyrażenia stała przed terminem ma poprawić wydajność kwerendy.To jest zwany stałym składanie.Stała to Transact-SQL literał, np. 3, 'ABC', '2005-12-31', 1.0e3, lub 0x12345678.

Foldable wyrażenia

SQL Server używa stałych składanie w z następujących typów wyrażeń:

  • Wyrażenia arytmetyczne, takie jak 1+1, 5/3*2, które zawierają tylko stałe.

  • Wyrażenia logiczne, takie jak 1=1 i 1>2 AND 3>4, które zawierają tylko stałe.

  • funkcje wbudowane, które są traktowane jako foldable przez SQL Server, w tym CAST i CONVERT. Ogólnie rzecz biorąc jest funkcja wewnętrzna jest foldable, jeśli jest funkcją tylko jego składniki, a nie innych informacji kontekstowych, takich jak opcje zestaw, ustawień języka, opcji bazy danych i klucze szyfrowanie.Funkcje nondeterministic nie są foldable.Deterministyczny funkcje wbudowane są foldable z kilkoma wyjątkami.

Wyjątek jest wykonywana w przypadku dużych obiektów.Jeśli typem danych wyjściowych składane procesu (typ do dużego obiektutekst, obraz, nvarchar(max), varchar(max), or varbinary(max)), then SQL Server nie karta składana jak wyrażenie.

Wyrażenia Nonfoldable

Wszystkie inne typy wyrażenie nie są foldable.W szczególności następujące rodzaje wyrażenia nie są foldable:

  • Nonconstant wyrażenie, takich jak wyrażenie, którego wynikiem jest zależny od wartości kolumna.

  • Wyrażenia, którego wyniki zależą lokalną zmienną lub parametr, takich jak @x.

  • Funkcje nondeterministic.

  • Funkcje zdefiniowane przez użytkownika (w obu Transact-SQL i CLR).

  • Wyrażenia, którego wyniki zależą od ustawień języka.

  • Wyrażenia, którego wyniki zależą od opcji zestaw.

  • Wyrażenia, którego wyniki zależą od opcji konfiguracja serwera.

Przykłady wyrażeń stała Foldable i Nonfoldable

Rozważmy następującą kwerendę:

SELECT *
FROM Sales.SalesOrderHeader s JOIN sales.SalesOrderDetail d 
ON s.SalesOrderID = d.SalesOrderID
WHERE TotalDue > 117.00 + 1000.00

Jeśli opcja parametry bazy danych nie jest zestaw do WYMUSZONE dla tej kwerendy (wartość domyślna to SIMPLE), następnie wyrażenie 117.00 + 1000.00 jest obliczane i zastępuje jego wynikiem 1117.00, zanim kwerenda jest skompilowany. Korzyści wynikające z tej stała składanie należą:

  • Wyrażenie nie ma być oceniane wielokrotnie przy uruchomieniu czas.

  • Wartość wyrażenie po sprawdzana jest zgodność jest używany przez optymalizator kwerendy, aby oszacować rozmiar zestaw wyników części kwerendy TotalDue > 117.00 + 1000.00.

Z drugiej strony Jeśli dbo.f jest wartość skalarna funkcja zdefiniowanej przez użytkownika wyrażenie dbo.f(100) jest nie składany, ponieważ SQL Server nie złóż wyrażeń, które mogą obejmować funkcje zdefiniowane przez użytkownika, nawet wtedy, gdy są one deterministyczny.

Ocena wyrażenie czas kompilacji dla Kardynalność Szacowanie

Ponadto niektóre wyrażenia, które nie są stała złożony, ale których argumenty są znane czas kompilacji, czy argumenty są parametry lub stała, są obliczane według estymatora rozmiar zestaw wyników (Kardynalność), który jest częścią Optymalizator podczas optymalizacji.

W szczególności następujących funkcje wbudowane i specjalne operatory są obliczane czas kompilacji, jeśli wiadomo, że wszystkie ich dane wejściowe: UPPER, LOWER, RTRIM, (tylko RR) w parametrze DATEPART, GetDate, LANE i CONVERT.

Następujące operatory sprawdzane są również czas kompilacji, jeśli wiadomo, że wszystkie ich dane wejściowe:

  • Operatory arytmetyczne: +, -, *, /, unary -,

  • Operatory logiczne: AND, OR, NOT

  • Operatory porównania: <, >, <=, >=, <>, LIKE, IS NULL, IS NOT NULL

Nie inne funkcje lub operatory są obliczane podczas szacowania jest przez optymalizator.

Przykłady oceny wyrażenie czas kompilacja

Należy to wziąć pod uwagę Transact-SQL procedura przechowywana:

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

Podczas optymalizacji instrukcja SELECT w procedurze Optymalizator próbuje oceny relacja oczekiwanych wyników dla warunku OrderDate > @d+1. Wyrażenie @d+1 nie jest składany stała, ponieważ @d jest parametrem. Jednak w momencie optymalizacji, wartość parametru jest znany.Dzięki temu Optymalizator dokładnie oszacować rozmiar zestaw wyników, co ułatwia jej umożliwia wybranie planu dobre kwerendy.

Teraz warto przykład podobny do poprzedniego, z wyjątkiem tych, zmienna lokalna @d2 zastępuje @d+1 w kwerendzie i wyrażenie jest oceniane w instrukcja zestaw zamiast w kwerendzie.

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

Jeśli w instrukcja SELECT MyProc2 zoptymalizowane w SQL Server, wartość @d2 nie jest znany. W związku z tym optymalizator używa szacowanego domyślne selektywność OrderDate > @d2, (w tym przypadek 30 procent).

Najważniejsze wskazówki: Przy użyciu stała składania i ocena wyrażenie czas kompilacja dla generowania kwerend optymalne plany

Aby wygenerować kwerendę optymalne plany, najlepszym rozwiązaniem jest zaprojektowanie kwerend, procedur przechowywanych i instancji w taki sposób, aby optymalizator kwerendy można dokładnie oszacować selektywności warunki określone w kwerendzie, oparty na danych statystycznych dotyczących dystrybucją danych.W przeciwnym razie Optymalizator muszą używać szacowania domyślny podczas oceny szacunkowej selektywność (na przykład 30 procent w poprzednim przykładzie).

Aby upewnić się, że estymatora relacja z Optymalizator zapewnia dobrą oszacowań, należy najpierw upewnić że opcji zestaw AUTO_CREATE_STATISTICS i AUTO_UPDATE_STATISTICS bazy danych są ON (ustawienie domyślne), lub że utworzono ręcznie statystyk na wszystkie kolumny w warunku kwerendy.Następnie Projektując warunki w kwerendach, wykonaj następujące czynności, jeśli możliwe jest:

  • Należy unikać stosowania zmiennych lokalnych w kwerendach.Zamiast tego należy użyć parametrów, literały lub wyrażenia w kwerendzie.

  • Ogranicz używanie operatory i funkcje osadzone w kwerendę, która zawiera parametr znajdujących się na liście w obszarze Ocena wyrażenie czas kompilacji dla Kardynalność Szacowanie.

  • Upewnij się, że ta stała — tylko wyrażeń w warunkach kwerendy mogą mieć stałą foldable, lub może być oceniane przy kompilacji czas.

  • Jeśli trzeba użyć zmiennej lokalnej do oceny wyrażenie w kwerendzie, należy rozważyć oceny go w innym zakresie niż kwerendy.Na przykład może być przydatne wykonać jedną z następujących czynności:

    • Przekazać wartość zmiennej do procedura przechowywana, która zawiera kwerendy, które mają być użyte w obliczeniach, a mają zastosowanie kwerendy parametr procedury zamiast zmiennej lokalnej.

    • Konstruowanie ciąg, który zawiera kwerendę częściowo oparte na wartości zmiennej lokalnej, a następnie wykonać ciągu przy użyciu języka SQL dynamiczne (EXEC lub sp_executesql).

    • Parameterize kwerendy i ją wykonać za pomocą sp_executesql, a wartość zmiennej jako parametr przekazywany do kwerendy.