Metody znajdowania nowych flag śledzenia w programie SQL Server

38

Istnieje wiele flag śledzenia. Niektóre są dobrze udokumentowane, niektóre nie, a inne znalazły drogę do domyślnego stanu zachowania w wersji 2016. Oprócz oficjalnych kanałów wsparcia, pracowników Microsoft itp., Jakie są sposoby na znalezienie nowych flag śledzenia?

Przeczytałem kilka ostatnich postów Aarona Bertranda tu i tutaj , ale nie zauważyłem nic o nowych flagach śledzenia.

Skopiowałem plik danych i dziennika mssqlsystemresource do nowej lokalizacji i załączyłem go jak zwykłą bazę danych, aby przejrzeć tabele systemowe i widoki, ale niczego nie zauważyłem od razu. Zastanawiałem się, czy nie wziąć listy znanych flag śledzenia i przeszukiwać numery, których nie ma na tej liście, aby sprawdzić, na które zezwala DBCC TRACEON, ale najpierw chciałem zadać pytanie.

Zakładając, że polecenie DBCC, aby je włączyć, musi się zalogować za pomocą jakiegoś zasobu, aby upewnić się, że flaga śledzenia jest poprawna, do kogo sięga? Czy istnieje plik .dll lub inny plik systemowy zawierający listę?

Wiem, że pytanie rzuca szeroką siatkę, ale to, co pobudziło to czytanie o Trace Flag o konkretnym zamierzonym zachowaniu wraz z nową funkcją w 2016 roku, która nie miała opisanego efektu. Początkowo myślałem, że być może liczby zostały transponowane, na przykład 7129 na 7219. Miałem nadzieję, że uzyskam listę prawidłowych flag śledzenia w zakresie, powiedzmy 7000-7999, w poszukiwaniu permutacji. Testowanie ich wszystkich, zarówno pod kątem flag DBCC TRACEON, jak i parametrów uruchamiania, byłoby dość uciążliwe w połączeniu z testowaniem wyników pod kątem zachowania funkcji.

Erik Darling
źródło

Odpowiedzi:

42

Nie ma nic, co możesz zrobić, aby znaleźć listę, oprócz pytania lub odebrania ich z postów / slajdów / itp. Lista istnieje tylko w kodzie, w pliku nagłówkowym, w którym poprawne numery flag śledzenia są mapowane na nazwy w dużej enumie w kodzie C ++, a następnie nazwy są używane w pozostałej części kodu.

Jak powiedział Aaron, możesz włączyć dowolny numer flagi śledzenia, a jeśli nic nie robi lub nie korzystasz z funkcji, której dotyczy flaga śledzenia, nie zauważysz żadnej różnicy w zachowaniu.

DBCC TRACEON nic nie sprawdza - ponieważ nie ma listy wykonawczej, które liczby są prawidłowe, czy nie - po prostu włącza numer flagi śledzenia na mapie bitowej tego, jakie flagi są ustawione dla tego połączenia / globalnie.

Problem z sprawdzaniem poprawności polega na tym, że ujawniają, które flagi śledzenia są prawidłowe, umożliwiając ich wykrycie. W ten sposób „ważna lista” jest skutecznie zaciemniana, czego chce zespół SQL.

Odnośnie sugestii Kin w komentarzu, który powinien mieć SQL Server select * from sys.available_trace_flags- Tak i nie. Istnieje wiele flag śledzenia, które są bardzo szkodliwe dla wydajności i są niezbędne tylko do debugowania problemów pod kierunkiem pomocy technicznej, ale SQL Server może wyświetlać flagi „bezpieczne”.

Paul S. Randal
źródło
2
Jedna drobna poprawka - DBCC TRACEON rzeczywiście coś sprawdza. Ta lista pokazuje kod, który zapętla flagi śledzenia zaczynające się od 1. Wszystkie obecne wersje SQL Server się wybiją i zgłoszą
Brent
41

Jakie są sposoby na znalezienie nowych flag śledzenia?

W większości sprowadza się to do posiadania czasu i zasobów emocjonalnych, które można przeznaczyć na ich poszukiwanie.

Oczywiście można napisać skrypt, który będzie przechodził przez możliwe numery flag śledzenia i analizował efekty, ale nie zawsze jest to owocne. Jest wiele przyczyn tego, ale powszechne frustracje obejmują fakt, że niektóre flagi śledzenia działają tylko w połączeniu z innymi, niektóre działają tylko -Tprzy uruchomieniu, lub gdy są używane z DBCC TRACEON, niektóre tylko z OPTION (QUERYTRACEON). Niektóre wymagają nieudokumentowanych poleceń lub rozszerzeń poleceń lub też określonej funkcji, aby można je było włączyć. Niektóre dają efekty tylko wtedy, gdy wiesz, gdzie ich szukać. I tak dalej i ... bardzo ... tak dalej.

To powiedziawszy, być może najbardziej skuteczną techniką jest krok po kroku wykonanie określonego zapytania lub polecenia z dołączonym debuggerem lub innym narzędziem do profilowania, porównując ścieżki podjęte z włączonymi i wyłączonymi flagami śledzenia. Jeśli to zabiera dużo czasu, to dlatego, że tak jest.

Dla mnie coś musi być potencjalnie bardzo interesujące lub dotyczyć rzeczywistego problemu bez lepszego rozwiązania, aby nawet pomyśleć o tym. Przydaje się również, jeśli przeszedłeś ten proces setki lub tysiące razy wcześniej, aby uzyskać ogólne poczucie tego, czego szukasz, jaki zakres flag śledzenia jest najbardziej skuteczny, a która część bazy kodu będzie interesujące.

Ustawienie punktu przerwania CSessionTraceFlags::CheckSessionTraceInternali sprawdzenie wartości edxrejestru (aby sprawdzić, która flaga śledzenia jest sprawdzana) może być przydatne w prostych przypadkach, ale interesujące przypadki nie są często proste - i nie wszystkie flagi śledzenia są sprawdzane w punkcie, w którym wpływa na wybraną ścieżkę kodu.

Istnieje raczej niewielka lista oficjalnych flag śledzenia . Są to flagi, które zostały w pełni przetestowane i są (i będą) obsługiwane przez CSS i, ostatecznie, twórców produktu. Są to również flagi z dość powszechnym przypadkiem użycia, który warto udokumentować.

Każda inna flaga śledzenia, którą znajdziesz, jest ciekawostką, która może mieć nieoczekiwane efekty w różnych sytuacjach (różne kompilacje, jednostki SKU, ustawienia zabezpieczeń, różne funkcje ... cokolwiek innego, o czym możesz lub nie możesz pomyśleć). Będą one „wspierane” tylko przez osobę, która o nich pisała, jeśli w ogóle.

Istnieje kilka nieoficjalnych list, najlepsza z nich to A Topical Collection of SQL Server Flags autorstwa Aarona Morelli (obecnie w wersji 6, kwiecień 2016).

Wszystko to powiedziawszy, Microsoft CSS ma (ostatecznie) dostęp do wszystkich flag śledzenia, więc mogą być w stanie doradzić Ci w każdym napotkanym, nawet jeśli nie ma ich na oficjalnej liście. Mogą oczywiście nic nie mówić i może to wiązać się z opłatą; Naprawdę nie wiem, sam nigdy nie poszedłem tą drogą.

Paul White mówi GoFundMonica
źródło