Abfragen ohne ausreichenden Plan gefunden


20

Ich habe eine SQL Server 2012-Datenbank. Ich habe Wert Reason for early termination of statement optimizationfür einige Fragen bemerkt und alle haben gegeben Good Enough Plan Found. Jetzt sind meine Fragen:

  1. Was sind die möglichen Arten von "Grund für die vorzeitige Beendigung der Anweisungsoptimierung". Ich habe in msdn danach gesucht, aber keine vollständige Liste der Werte erhalten.
  2. Gibt es eine DMV oder ein erweitertes Ereignis, um alle Abfragen aufzulisten, für die die Optimierung aus anderen Gründen als dem Good Enough Plan Found abgebrochen wurde? Ich bezog mich auf zwei Artikel, in denen nicht die vollständige Liste der Möglichkeiten aufgeführt ist. [Außerdem geben sie mir unterschiedliche Ergebnisse in meiner Datenbank].

Bildbeschreibung hier eingeben


Antworten:


20
  • Speicherlimit überschritten

    Das Optimierungsprogramm musste aufgrund des Speicherdrucks aufhören, nach besseren Planungsalternativen zu suchen. Der Grund dafür sollte untersucht und korrigiert werden, und anschließend sollte erneut versucht werden, die Abfrage zu kompilieren. Der zurückgegebene Plan ist möglicherweise nicht derjenige, den das Optimierungsprogramm ausgewählt hätte, wenn die Bedingung für geringen Arbeitsspeicher nicht gegeben wäre.

  • Auszeit

    Dieser Grund wird sehr missverstanden .

    Das Abfrageoptimierungsprogramm versucht, schnell einen vernünftigen Plan zu finden . Es wird keine umfassende Suche durchgeführt, um den bestmöglichen Plan zu finden. Durch das Design wird vermieden, dass mehr Zeit als nötig für die Optimierung aufgewendet wird. Eine dieser Funktionen, mit denen dies sichergestellt wird, ist die Zeitüberschreitung (kein Zeitmaß).

    Das Optimierungsprogramm legt selbst ein Explorationsbudget fest, das auf der Komplexität der logischen Abfrage, Kardinalitätsschätzungen und den geschätzten Kosten des bisher gefundenen günstigsten Plans (falls vorhanden) basiert. Komplexere Abfragen mit höherer Kardinalität erhalten ein höheres Budget.

    Wird dieses Budget in einer seiner Suchphasen überschritten, endet die Phase. Dies ist Teil des Designs und des normalen Betriebs des Optimierers. Abfragen, die mehr Optimierungsaufwand erfordern, werden ausgeführt. diejenigen, die nicht, nicht.

    Stellen Sie sich "Auszeit" als "Gut genug Plan gefunden" vor.

  • Gut genug Plan gefunden

    Dies bedeutet genau das Gleiche wie ein leerer Grund. Es ist einfach eine historische Eigenheit, dass Pläne mit Kosten unter 0,909090 ... (1 / 1,1) auf diese Weise gekennzeichnet werden. Wenn dieser Grund auftritt, wird nichts vorzeitig beendet oder anderweitig speziell behandelt oder im Optimierungscode geändert.

Abgesehen von "Memory Limit Exceeded" (Speicherlimit überschritten) bedeutet keiner der "Gründe für eine vorzeitige Beendigung" (wenn überhaupt) viel für die Abfrageoptimierung oder die Leistungsanalyse. Ich ignoriere sie im Allgemeinen.

Rat

Richten Sie Ihre Bemühungen zur Optimierung von Abfragen auf der Grundlage der tatsächlichen Leistungsmetriken (verstrichene Zeit, CPU- / Speicherauslastung, ... was auch immer im Kontext wichtig ist) aus. Wenn eine Abfrage für den beabsichtigten Zweck zu langsam ist, nehmen Sie sich Zeit, um sie zu beschleunigen. Messen Sie die tatsächliche Leistung, vergleichen Sie sie mit der Basislinie und dem Verlauf und legen Sie den Optimierungsaufwand für die wichtigen Abweichungen fest.

Speichern Sie garantiert saubere Daten in einem richtigen relationalen Schema mit nützlichen Statistiken und Indizes sowie gut geschriebenen, optimierungsfreundlichen Abfragen.


10

Wenn Sie zu http://schemas.microsoft.com/sqlserver/2004/07/showplan/showplanxml.xsd wechseln (dieser Link wird angezeigt, wenn Sie einen Ausführungsplan als xml öffnen), wird der angezeigt Drei Gründe aufgelistet, die sind:

  • Auszeit
  • MemoryLimitExceeded
  • GoodEnoughPlanFound

Die Artikel, die Sie erwähnen, scheinen in Ordnung zu sein, um diese Ereignisse zu finden. Haben Sie ein bestimmtes Problem? Das einzige, was zu beachten ist, ist, dass diese DMVs nicht alle jemals auf dem Server ausgeführten SQL-Befehle erfassen und beim Neustart des Servers zurückgesetzt werden. Sie könnten showplan xml mit Extended Events abfangen und das abfragen, aber es scheint mir übertrieben.

Ich würde mir auch nicht allzu viele Sorgen um GoodEnoughPlanFound machen, da der Optimierer seine Arbeit (schnell einen guten Plan zu finden) ziemlich gut macht.

HTH

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.