Czy można dać optymalizatorowi więcej czasu lub więcej potrzebnego czasu?

18

Biorąc pod uwagę, że optymalizator nie może poświęcić tyle czasu, ile potrzebuje (musi zminimalizować czas wykonania i nie przyczyniać się do niego), aby zbadać wszystkie możliwe plany wykonania, które czasami zostaje odcięty.

Zastanawiałem się, czy można to przesłonić, aby cały czas zapewnić optymalizatorowi potrzeby (lub pewną liczbę milisekund).

Nie potrzebuję tego (bankomat), ale mogę sobie wyobrazić scenariusz, w którym złożone zapytanie jest wykonywane w ciasnej pętli, a Ty chcesz opracować optymalny plan i buforować go wcześniej.

Oczywiście, że masz ciasną pętlę, powinieneś przepisać zapytanie, aby odeszło, ale trzymaj się mnie.

Jest to raczej pytanie z ciekawości, a także sprawdzenie, czy czasami istnieje różnica między optymalizacją zwartą a pełną.

Okazuje się, że można dać optymalizatorowi więcej czasu za pomocą flagi śledzenia 2301. Nie jest to dokładnie to, o co prosiłem, ale się zbliża.

Najlepsze informacje, jakie znalazłem na ten temat, znajdują się w Rozszerzeniach modelowania procesorów zapytań w SQL Server 2005 SP1 autorstwa Iana Jose.

Ostrożnie używaj tej flagi śledzenia! Ale może być przydatny przy opracowywaniu lepszych planów. Zobacz też:

Myślałem o zapytaniach z dużą liczbą złączeń, w których przestrzeń rozwiązania dla kolejności łączenia eksploduje wykładniczo. Heurystyka, której używa SQL Server, jest całkiem dobra, ale zastanawiałem się, czy optymalizator zaproponowałby inną kolejność, gdyby miał więcej czasu (w zakresie sekund lub nawet minut).

Buckley
źródło

Odpowiedzi:

16

Obok flagi śledzenia 2301 znajduje się 8780, która naprawdę sprawia, że ​​optymalizator „pracuje ciężej”, ponieważ daje mu tylko więcej czasu (nie jest nieograniczony, jak opisano szczegółowo tutaj (rosyjski) i mniej szczegółowo tutaj ), aby wykonać swoje zadanie.

Szczegółowy opis w języku angielskim oryginalnego autora artykułu rosyjskiego. w tym własne ostrzeżenie autora:

nie zaleca się nigdy używać go w produkcji .

Łączenie tych dwóch i stosowanie ich (bardzo wybiórczo poprzez podpowiedź do zapytania OPCJA (QUERYTRACEON 2301, QUERYTRACEON 8780) do zapytania o 4-poziomowe zagnieżdżone wbudowane TVF (gdzie tylko ten na dole wykonałby jakąkolwiek prawdziwą pracę, a górne poziomy korelowałyby wyniki za pośrednictwem podkwerend EXISTS) zaowocowało ładnym połączeniem MERGE JOIN i kilkoma LAZY SPOOLami, które skróciły czas wykonania o połowę.

ENOTTY
źródło
4

Nie możesz

Możesz sprawić, że twoje zapytania będą „przyjazne dla optymalizatora”, rozumiejąc, jak to działa (złożona bestia, nie trzeba tego znać na wylot). Sugeruję, że jeśli masz coś tak krytycznego czasowo, to napraw zapytanie, zamiast zmieniać sposób działania programu SQL Server.

Na przykład chcesz wiedzieć, kiedy zapytanie zaczyna skalować mniej wydajnie niż O (n), gdy zmienia się wielkość danych + rozkład danych: zapewnienie więcej czasu optymalizatorowi nie dodaje tutaj żadnej wartości.

gbn
źródło