Wie ändere ich den systemweiten Standardwert von MAXRECURSION
?
Standardmäßig ist es 100, aber ich muss es auf ungefähr 1000 erhöhen.
Ich kann keine Abfragehinweise verwenden, da ich ein Programm verwende, das meine Abfrage aufnimmt und für mich ausführt, und ich kann diese Einschränkung leider nicht umgehen.
Ich habe jedoch Administratorrechte für die Serverinstanz. Ich habe mich in den Server-Facetten umgesehen, sehe dort jedoch nichts in Bezug auf Abfrageoptionen oder Rekursion. Ich gehe davon aus , dass es irgendwo einen Ort geben muss, an dem ich den systemweiten Standard aktualisieren kann.
Irgendwelche Ideen?
sql-server
configuration
recursive
carl.anderson
quelle
quelle
Antworten:
Wenn Ihre Abfragen eine gemeinsame Form haben, können Sie möglicherweise den erforderlichen Hinweis zur maximalen Rekursion mithilfe einer oder mehrerer Planhilfslinien hinzufügen.
Es kann ein Händchen sein, sie richtig zu machen. Wenn Sie Ihrer Frage bestimmte Abfragedetails hinzufügen, können wir dies möglicherweise für Sie klären. In der Regel verfolgen Sie die SQL, die tatsächlich auf den Server trifft, oder rufen mithilfe der integrierten Prozedur sys.sp_get_query_template ein parametrisiertes Formular ab und erstellen dann eine TEMPLATE- und / oder OBJECT / SQL-Plananleitung.
Weitere Informationen finden Sie in der Dokumentation:
Planhandbücher müssen erneut validiert werden, wenn sich der Anwendungscode ändert und wenn SQL Server gepatcht oder aktualisiert wird. Dies sollte nur ein Teil Ihres normalen Testzyklus sein.
Beachten Sie, dass die Planleitfadenvalidierung mit sys.fn_validate_plan_guide möglicherweise fälschlicherweise einen Fehler meldet, wenn die geführte Anweisung auf eine temporäre Tabelle verweist. Siehe diese Frage:
Die Validierung des Planleitfadens mit fn_validate_plan_guide führt zu falsch positiven Ergebnissen
Die Klassen Plan Guide Successful und Plan Guide Unsuccessful Profiler und Extended Events können auch zum Überwachen von Plan Guide-Anwendungen verwendet werden.
Connect wurde eingestellt, bevor der Vorschlag zur Produktverbesserung andere MAXRECURSION-Grenzwerte als 100 für Ansichten und UDFs von Steve Kass zulassen implementiert wurde. Wenn Sie es jetzt mit Microsoft aufnehmen möchten, lesen Sie die Optionen in der SQL Server-Hilfe und im Feedback .
quelle
Wenn Sie unbedingt eine Funktion verwenden müssen (eine Einschränkung Ihres ETL-Tools, wie Sie implizieren), können Sie diese
OPTION
als Teil einer Funktion mit Tabellenwerten mit mehreren Anweisungen angeben , z.Dies funktionierte auch für mich, wenn ich in eine Ansicht eingebunden wurde, wie Sie es von Ihren ETL-Tools vorschlagen. Es gibt keine Möglichkeit, dies systemweit zu ändern, aber da Rekursion ineffizient sein kann, ist dies wahrscheinlich eine gute Sache. Sie können keinen Abfragehinweis (using
OPTION
) im Hauptteil einer Inline-Tabellenwertfunktion angeben , wie in Ihrem Beispiel.Ändern Sie Ihren Prozess so, dass die Hierarchie nur einmal durchlaufen wird, wenn Sie Ihre Episoden erhalten und die Ausgabe in einer relationalen Tabelle speichern. Sie könnten dazu einen gespeicherten Prozess verwenden, damit diese Einschränkung nicht auftritt.
Ich denke auch, dass es einen Fehler in Ihrem Code geben könnte: Wenn Ihr CTE bei personId beitritt und bei eventId rekursiv ist, würde die eventId 101 meiner Meinung nach zweimal als Duplikat angezeigt. Möglicherweise habe ich Ihren Code falsch interpretiert. Lassen Sie mich wissen, was Sie denken.
HTH
quelle
Ich habe mich von diesem Thema inspirieren lassen .
Folgendes habe ich getan, um das Problem zu lösen.
Dann rufe ich diese Funktion folgendermaßen auf:
Auf diese Weise muss keine meiner CTE-Logik wiederholt werden und ich zahle nichts extra in Bezug auf die Leistung. Es ist ein Ärgernis, dass es so gemacht werden muss, aber ich kann damit leben.
quelle
where
Klausel nach den Auslassungspunkten verhindert, dass zu viele Rekursionen auftreten, indem der Funktionsparameter als Einschränkung verwendet wird. Ich denke, es sollte jedoch eine Aussage nach der CTE-Definition geben. Ich werde das hinzufügen.EventID=1
(und 101,201, ... 901) auf. Die ursprüngliche Abfrage (wenn sie mit MAXRECURSION = 100000000 ausgeführt wird) besucht die Zeile jedoch möglicherweise nie mitEventID=101
(und 201, .., 901). Die beiden Abfragen (Original und Ihre Lösung) können also unterschiedliche Ergebnisse liefern (keine Zeile mit 101 in der ersten, ja in der zweiten)! Oder es besucht die 101, aber vor Schritt 100, sodass Ihre Lösung die Zeile zweimal in die Ergebnisse