Po krótkich poszukiwaniach nie udało mi się znaleźć konkretnego i satysfakcjonującego źródła z dokumentacji Microsoft, aby odpowiedzieć na to pytanie. Istnieje wiele dobrych opisów i definicji adhoc / ad-hoc / ad hoc stron trzecich, ale myślę, że ze względu na specyfikę tego pytania jedno blisko źródła jest idealne.
Przechodząc obok ogólnych (ale wciąż dokładnych) definicji, takich jak ten post SO (dzięki SqlWorldWide), jeśli spojrzymy na to, co mówi dokumentacja na ten temat, zgadza się z tym, co wspomniałeś o definicji opartej na liczbie wykonań Myślę, że możemy uznać to za fakt.
Artykuł na temat optymalizacji przepływów pracy ad hoc mówi:
Gdy ta opcja jest ustawiona na 1, aparat bazy danych przechowuje mały skrót skompilowanego planu w pamięci podręcznej planu, gdy partia jest kompilowana po raz pierwszy, zamiast pełnego skompilowanego planu. Pomaga to zmniejszyć presję pamięci, uniemożliwiając zapełnienie pamięci podręcznej planu skompilowanymi planami, które nie są ponownie używane. Skompilowany skrót planu pozwala aparatowi bazy danych rozpoznać, że ta partia ad hoc została wcześniej skompilowana, ale zapisała tylko skompilowany skrót planu, więc gdy ta partia zostanie ponownie wywołana (skompilowana lub wykonana), aparat bazy danych skompiluje partię ... i dodaje pełny skompilowany plan do pamięci podręcznej planu.
Wygląda więc na to, że opcja konfiguracji serwera zapytań ad hoc wykorzystuje również definicję pojedynczego wykonania jako definicję ad hoc. Jeśli zapytanie będzie nadal wykonywane i wygeneruje ten sam plan, nie będzie już tak traktowane.
Artykuł na temat najlepszych praktyk dla sklepu z zapytaniami również się z tym zgadza,
Porównaj liczbę odrębnych wartości skrótu zapytania z całkowitą liczbą wpisów w sys.query_store_query. Jeśli stosunek jest bliski 1, obciążenie ad-hoc generuje różne zapytania.
Dotyczy to oczywiście zapytań, które nie są jeszcze używane jako procedury składowane, parametryzowane itp., Ponieważ można je rozpoznać i odpowiednio potraktować od razu.
Na podstawie tego wszystkiego możemy powiedzieć, że zapytanie jest traktowane jako ad hoc, jeśli:
- Nie jest sparametryzowany
- To nie jest programowo przechowywane w bazie danych (przechowywane proc, funkcja, wyzwalacz itp.)
- To samo zapytanie jest wykonywane tylko raz LUB To samo zapytanie jest wykonywane wielokrotnie, ale generuje inny plan zapytań dla każdego kolejnego wykonania.