Opisywanie inteligentnego przetwarzania zapytań

Ukończone

W programach SQL Server 2017 i 2019 oraz w usłudze Azure SQL firma Microsoft wprowadziła wiele nowych funkcji na poziomach zgodności 140 i 150. Wiele z tych funkcji poprawia to, co były wcześniej anty-wzorce, takie jak używanie funkcji wartości skalarnej zdefiniowanej przez użytkownika i używanie zmiennych tabeli.

Te funkcje dzielą się na kilka rodzin funkcji:

Screenshot of Intelligent Query Processing architecture.

Inteligentne przetwarzanie zapytań obejmuje funkcje, które zwiększają wydajność istniejących obciążeń przy minimalnym wysiłku implementacji.

Aby obciążenia automatycznie kwalifikowały się do inteligentnego przetwarzania zapytań, zmień odpowiedni poziom zgodności bazy danych na 150. Na przykład:

ALTER DATABASE [WideWorldImportersDW] SET COMPATIBILITY_LEVEL = 150;

Adaptacyjne przetwarzanie zapytań

Funkcja adaptacyjnego przetwarzania zapytań zawiera wiele opcji, które sprawiają, że przetwarzanie zapytań jest bardziej dynamiczne na podstawie kontekstu wykonywania zapytania. Te opcje obejmują kilka funkcji, które zwiększają przetwarzanie zapytań.

  • Sprzężenia adaptacyjne — aparat bazy danych odwraca wybór sprzężenia między pętlami skrótu i zagnieżdżonych na podstawie liczby wierszy przechodzących do sprzężenia. Sprzężenia adaptacyjne działają obecnie tylko w trybie wykonywania wsadowego.

  • Przeplatane wykonywanie — obecnie ta funkcja obsługuje funkcje z wieloma instrukcjami o wartości tabeli (MSTVF). Przed programem SQL Server 2017 pliki MSTVFs używały stałego oszacowania wiersza jednego lub 100 wierszy w zależności od wersji programu SQL Server. To oszacowanie może prowadzić do nieoptymalnych planów zapytań, jeśli funkcja zwróciła o wiele więcej wierszy. Rzeczywista liczba wierszy jest generowana na podstawie msTVF, zanim reszta planu zostanie skompilowana z przeplatanym wykonaniem.

  • Opinia o udzielaniu pamięci — program SQL Server generuje przydział pamięci w początkowym planie zapytania na podstawie oszacowań liczby wierszy ze statystyk. Poważne niesymetryczność danych może prowadzić do nadmiernego lub niepełnego oszacowania liczby wierszy, co może spowodować nadmierne przydziały pamięci, które zmniejszają współbieżność lub niedostateczne granty, co może spowodować, że zapytanie rozla dane do bazy danych tempdb. W przypadku przekazywania opinii o udzielaniu pamięci program SQL Server wykrywa te warunki i zmniejsza lub zwiększa ilość pamięci przyznanej zapytaniu, aby uniknąć rozlania lub nadmiernej alokacji.

Wszystkie te funkcje są automatycznie włączone w trybie zgodności 150 i nie wymagają żadnych innych zmian w celu włączenia.

Kompilacja odroczona zmiennej tabeli

Podobnie jak msTVFs, zmienne tabeli w planach wykonywania programu SQL Server niosą stałe oszacowanie liczby wierszy jednego wiersza. Podobnie jak MSTVFs, to stałe oszacowanie doprowadziło do niskiej wydajności, gdy zmienna miała znacznie większą liczbę wierszy niż oczekiwano. W programie SQL Server 2019 zmienne tabeli są teraz analizowane i mają rzeczywistą liczbę wierszy. Kompilacja odroczona jest podobna do przeplatanego wykonywania msTVFs, z tą różnicą, że jest wykonywana podczas pierwszej kompilacji zapytania, a nie dynamicznie w ramach planu wykonywania.

Tryb wsadowy w magazynie wierszy

Tryb wykonywania wsadowego umożliwia przetwarzanie danych w partiach zamiast wierszy według wierszy. Zapytania, które generują znaczne koszty procesora CPU na potrzeby obliczeń i agregacji, zobaczą największą korzyść z tego modelu przetwarzania. Oddzielając indeksy przetwarzania wsadowego i magazynu kolumn, więcej obciążeń może korzystać z przetwarzania w trybie wsadowym.

Skalowanie funkcji zdefiniowanej przez użytkownika

W starszych wersjach programu SQL Server funkcje skalarne działały słabo z kilku powodów. Funkcje skalarne były wykonywane iteracyjnie, efektywnie przetwarzają jeden wiersz naraz. Nie mieli odpowiedniego oszacowania kosztów w planie wykonania i nie zezwalali na równoległość w planie zapytania. W przypadku tworzenia wbudowanych funkcji zdefiniowanych przez użytkownika te funkcje są przekształcane w podzapytania skalarne zamiast operatora funkcji zdefiniowanej przez użytkownika w planie wykonywania. Ta transformacja może prowadzić do znacznego wzrostu wydajności zapytań obejmujących wywołania funkcji skalarnych.

Przybliżona liczba unikatowych

Typowym wzorcem zapytań magazynu danych jest wykonanie odrębnej liczby zamówień lub użytkowników. Ten wzorzec zapytania może być kosztowny dla dużej tabeli. Przybliżona liczba unikatowych wprowadza znacznie szybsze podejście do zbierania odrębnej liczby przez grupowanie wierszy. Ta funkcja gwarantuje szybkość błędów wynoszącą 2% z interwałem ufności wynoszącym 97%.