Udostępnij za pośrednictwem


Troubleshooting Poor Query Performance: Cardinality Estimation

optymalizator kwerendy w SQL Server działa na podstawie kosztów. Oznacza to, że go zaznaczy planów kwerend, które mają najniższy szacowany koszt wykonać przetwarzania.optymalizator kwerendy określa koszt wykonania planu kwerend, na podstawie dwóch czynników głównego:

  • Całkowita liczba wierszy przetwarzane na każdym poziomie planu kwerend, określane jako relacja planu.

  • Model ceny nabycia algorytmu ustawieniem operatory używane w kwerendzie.

Współczynnik pierwszej, liczebność, jest używany jako parametru wejściowego współczynnika drugi model ceny nabycia.Dlatego relacja ulepszone prowadzi do lepszego szacowanych kosztów, a z kolei planów szybsze wykonywanie.

SQL Server szacuje cardinalities przede wszystkim z histogramy tworzonych podczas indeksy lub statystyki są tworzone, ręcznie lub automatycznie.Czasami SQL Server także używa informacji ograniczenia i logicznych ponownego kwerendy, aby określić liczebność.

W następujących sytuacjach SQL Server Nie można dokładnie obliczyć cardinalities. Powoduje to, że obliczenia niedokładne kosztów, które mogą być przyczyną planów kwerend suboptimal.Unikanie następujące konstrukcje kwerendy może poprawić wydajność kwerendy.Czasami możliwe są alternatywne kwerendy formuł lub innych środków i są one wskazane.

  • Kwerendy zawierające predykaty korzystające z operatorów porównania między różne kolumny o tej samej tabela.

  • Kwerendy zawierające predykaty korzystające z operatorów i jeden z następujących czynności są spełnione:

    • Istnieją nie statystyk w kolumnach związanych po obu stronach podmiotów gospodarczych.

    • Rozkład wartości w statystykach nie jest jednolity, ale kwerendy ma bardzo selektywnego wartość.Taka sytuacja może być zwłaszcza wtedy, gdy podmiot gospodarczy jest inny niż operator równości (=).

    • Predykat używa nie równe (! =) operator porównania i logicznych operatora NOT.

  • Kwerendy korzystające z SQL Server funkcje wbudowane lub wartości wartość skalarna, zdefiniowane przez użytkownika funkcja, której argument nie ma stała wartości.

  • Kwerendy, które obejmują przyłączanie się do kolumn do arytmetyczne lub ciąg operatorów łączenie.

  • Kwerendy, które porównać zmienne, których wartości nie są znane, gdy kwerenda jest skompilowany i zoptymalizowany.

Następujące środki można spróbować zwiększyć wydajność na te typy kwerend:

  • Tworzenie indeksów przydatne lub statystyki na kolumny, które uczestniczą w kwerendzie.Aby uzyskać więcej informacji zobacz Projektowanie indeksów i Using Statistics to Improve Query Performance.

  • Należy wziąć pod uwagę przy użyciu kolumny obliczane i poprawiania kwerendy, jeżeli kwerenda korzysta z porównania lub operatory arytmetyczne do porównywania lub łączenie dwóch lub większej liczby kolumn.Na przykład poniższa kwerenda porównuje wartości w dwóch kolumnach:

    SELECT * FROM MyTable
    WHERE MyTable.Col1 > MyTable.Col2
    

    Wydajność może zostać podniesiona, gdy dodajesz kolumna obliczana Col3 to Moja_tabela Wskaźnik oblicza różnicę pomiędzy Kol1 and Kol2 (Kol1 minus Kol2).Następnie od nowa napisać kwerendę:

    SELECT * FROM MyTable
    WHERE Col3 > 0
    

    Wydajność prawdopodobnie poprawi więcej przypadku tworzenia indeksu MyTable.Col3.