Jak zmienić wartość domyślną dla całego systemu MAXRECURSION
?
Domyślnie jest to 100, ale muszę go zwiększyć do około 1000.
Nie mogę korzystać ze wskazówek dotyczących zapytań, ponieważ korzystam z programu, który pobiera moje zapytanie i wykonuje je dla mnie i niestety nie mogę obejść tego ograniczenia.
Mam jednak uprawnienia administratora do instancji serwera. Przeszukiwałem aspekty serwera, ale nie widzę tam nic związanego z opcjami zapytania lub rekurencją. Zakładam, że musi być miejsce, w którym mogę zaktualizować domyślne ustawienia systemowe.
Jakieś pomysły?
sql-server
configuration
recursive
carl.anderson
źródło
źródło
Odpowiedzi:
Jeśli twoje zapytania mają wspólny kształt, możesz być w stanie dodać wymaganą wskazówkę dotyczącą maksrekursji za pomocą jednego lub więcej przewodników planu.
Ich umiejętność może być sprytna. Jeśli dodasz do pytania określone szczegóły zapytania, możemy być w stanie to dla Ciebie rozwiązać. Zazwyczaj prześledzisz kod SQL faktycznie uderzający w serwer lub uzyskasz sparametryzowany formularz za pomocą wbudowanej procedury sys.sp_get_query_template , a następnie utworzysz szablon SZABLON i / lub OBJECT / SQL.
Więcej informacji znajduje się w dokumentacji:
Przewodniki po planach będą wymagały ponownej walidacji za każdym razem, gdy zmienia się kod aplikacji oraz gdy SQL Server jest łatany lub aktualizowany. To powinno być po prostu częścią twojego normalnego cyklu testowania.
Należy pamiętać, że sprawdzanie poprawności przewodnika planu przy użyciu sys.fn_validate_plan_guide może niepoprawnie zgłosić awarię, jeśli instrukcja prowadzona odwołuje się do tabeli tymczasowej. Zobacz to pytanie:
Sprawdzanie poprawności przewodnika planu za pomocą fn_validate_plan_guide daje fałszywe wyniki dodatnie
The Plan Przewodnik Udane i Plan Guide Nieudane Profiler i rozszerzony wydarzenia klasy mogą być również wykorzystywane do monitorowania aplikacji przewodnik planu.
Connect został wycofany przed sugestią ulepszenia produktu Zezwalaj na wartości maksymalne MAXRECURSION inne niż 100 dla widoków i implementacji UDF przez Steve'a Kassa . Jeśli chcesz teraz podjąć współpracę z Microsoftem, zapoznaj się z opcjami pomocy i opinii programu SQL Server .
źródło
Jeśli musisz bezwzględnie użyć funkcji (jak sugerujesz, ograniczenia narzędzia ETL), możesz określić
OPTION
jako część funkcji o wielu tabelach, np. Coś takiego:Działa to również dla mnie, gdy jest zawinięty w widok, jak sugerujesz, że twoje narzędzia ETL. Nie ma sposobu, aby zmienić ten system, ale ponieważ rekurencja może być nieefektywna, jest to prawdopodobnie dobra rzecz. Nie można określić wskazówki dotyczącej zapytania (za pomocą
OPTION
) w treści wbudowanej funkcji o wartości tabeli, jak w przykładzie.Zastanów się nad zmianą procesu, aby przejść hierarchię tylko raz, gdy otrzymasz odcinki i zapisz dane wyjściowe w tabeli relacyjnej. Możesz użyć do tego celu zapisanego proc, aby nie napotkać tego ograniczenia.
Wydaje mi się również, że w twoim kodzie może być błąd: jeśli twoje CTE dołącza do personId i powtarza się w eventId, eventId 101 prezentowałby się dwa razy, jak sądzę, jako duplikat. Być może źle zinterpretowałem twój kod, daj mi znać, co myślisz.
HTH
źródło
Inspirację czerpałem z tego tematu .
Oto, co zrobiłem, aby rozwiązać problem.
Następnie wywołuję tę funkcję w następujący sposób:
W ten sposób moja logika CTE nie musi się powtarzać i nie płacę nic więcej pod względem wydajności. To uciążliwe, że trzeba to robić w ten sposób, ale mogę z tym żyć.
źródło
where
Klauzula po elipsy zapobiega zbyt wielu rekursji dzieje przy użyciu parametru funkcji jako ograniczenia. Sądzę jednak, że po definicji CTE powinno znajdować się stwierdzenie . Dodam to.EventID=1
(i 101, 201, ... 901). Ale oryginalne zapytanie (jeśli uruchomione z MAXRECURSION = 100000000) może nigdy nie odwiedzić wiersza zEventID=101
(i 201, .., 901). Tak więc dwa zapytania (oryginalny i twoje rozwiązanie) mogą zwracać różne wyniki (brak wiersza z 101 w pierwszym, tak w drugim)! Lub może odwiedzić 101, ale przed krokiem 100, więc twoje rozwiązanie