Sind Hinweise wirklich für jede Sql-Anweisung erforderlich? Wir haben einen Datenbankadministrator, der sehr pingelig ist und uns bittet, für jede Select- und Update-Anweisung in unseren gespeicherten Prozessen Hinweise zu setzen. Ist das wirklich notwendig?
Antworten
Zu viele Anzeigen?Normalerweise nicht. Sie überall anzubringen, klingt nach Overkill.
Le site Dokumentation sagt
Da der SQL Server-Abfrageoptimierer normalerweise den besten Ausführungsplan für eine Abfrage auswählt, empfehlen wir, join_hint, query_hint und table_hint nur als letzten Ausweg von erfahrenen Entwicklern und Datenbankadministratoren zu verwenden
Ihr DBA ist falsch .
Desde MS :
Da der SQL Server-Abfrageoptimierer normalerweise den besten Ausführungsplan Plan für eine Abfrage auswählt, empfehlen wir, dass Verknüpfungshinweis , Abfragehinweis und Tabellenhinweis nur als letztes Mittel verwendet werden von erfahrenen Entwicklern und Datenbankadministratoren.
Normalerweise ist das einfach rückwärts gerichtet. Je nach Ihrer Situation kann es jedoch wünschenswert sein.
Wir haben zum Beispiel eine Datenbank (eigentlich eine Reihe von Datenbanken auf einem Server), deren Daten alle ein nächtlicher Snapshot-Dump eines Mainframe-Systems sind, der für Berichte und andere Zwecke verwendet wird. Abgesehen von dem Batch-Prozess, der die Datenbanken jede Nacht neu erstellt, nichts auf dieses System zu schreiben. In diesem Zusammenhang ist das Standardsperrschema nicht angemessen, und die Politik zwischen unserer Gruppe und der IT-Gruppe, die alle unsere Server verwaltet, hindert uns daran, es zu ändern. Also: So gut wie alle Abfragen an diese Datenbanken haben die with (nolock)
Hinweise.
Ich kann mir vorstellen, dass es andere Situationen gibt, in denen Sie Berichtsdatenbanken haben, auf die nicht geschrieben wird, oder vielleicht das Gegenteil: eine Archivierungs- oder Protokollierungsdatenbank, die nur selten gelesen wird. Der Punkt ist, dass es gelegentlich vorkommen kann, dass eine spezialisierte Datenbank eingerichtet wird, für die das Standardsperrschema nicht passt und die Sie nicht ändern können. Dann brauchen Sie eine Fülle von Pinatas... Ich meine Hinweise.
Aber das ist die Ausnahme, die die Regel bestätigt. Im Allgemeinen ist der Datenbankoptimierer schlauer als Sie, wenn es um Dinge wie Sperren geht.
Hängt davon ab - der Abfrageoptimierer trifft ziemlich gute Entscheidungen über die Absicht. Welche Hinweise verlangen Ihre DBAs? @Ned ist ein wenig verwirrt - ein Hinweis sagt dem Optimierer ausdrücklich, dass er keinen Pfad herausfinden soll, sondern stattdessen Ihre Optimierung verwenden soll.
Wenn man vorschreibt, dass man immer oder nie Hinweise verwenden sollte, dann ist das eine gewisse Ignoranz gegenüber den Problemen, die durch Hinweise gelöst werden sollen. Es gibt einige Fälle, in denen sich Hinweise als kritisch erwiesen haben:
- NOLOCK, um explizit Lesesperren von Domänennachschlagetabellen zu entfernen, die innerhalb einer Transaktion abgefragt werden.
- Festnageln eines Abfrageplans auf einen bestimmten Index aufgrund von Statistik-"Drift" während umfangreicher Aktualisierungen (in diesem Fall kehrte der Plan zu einer Tabellensuche in einer Tabelle mit 10 Mio. Zeilen zurück, anstatt den geclusterten Index zu verwenden)
Ich musste noch nie Join-Hinweise verwenden.