Schlechte Abfrageleistung

10

Wir haben eine große Prozedur (über 10.000 Zeilen), die normalerweise in 0,5 bis 6,0 Sekunden ausgeführt wird, je nachdem, mit wie vielen Daten gearbeitet werden muss. Im letzten Monat hat es mehr als 30 Sekunden gedauert, nachdem wir ein Statistik-Update mit FULLSCAN durchgeführt haben. Wenn es langsamer wird, "behebt" ein sp_recompile das Problem, bis der nächtliche Statistikjob erneut ausgeführt wird.

Durch den Vergleich der langsamen und schnellen Ausführungspläne habe ich sie auf eine bestimmte Tabelle / einen bestimmten Index eingegrenzt. Wenn es langsam läuft, schätzt es, dass ~ 300 Zeilen von einem bestimmten Index zurückgegeben werden. Wenn es schnell läuft, schätzt es 1 Zeile. Wenn es langsam ausgeführt wird, wird nach einer Suche im Index ein Table Spool verwendet. Wenn es schnell ausgeführt wird, wird der Table Spool nicht ausgeführt.

Mit DBSS SHOW_STATISTICS habe ich das Indexhistogramm in Excel grafisch dargestellt. Normalerweise würde ich erwarten, dass das Diagramm mehr "sanfte Hügel" ist, aber stattdessen sieht es aus wie ein Berg, wobei der höchste Punkt 2x-3x höher ist als die meisten anderen Werte im Diagramm.

Indexhistogramm

Wenn ich Statistiken ohne FULLSCAN aktualisiere, sieht es normaler aus. Wenn ich es dann erneut mit FULLSCAN ausführe, sieht es so aus, wie ich es oben beschrieben habe.

Dies fühlt sich wie ein Parameter-Sniffing-Problem an und hängt speziell mit der (scheinbar) seltsamen Indexverteilung oben zusammen.

Der Prozess nimmt einen Tabellenwertparameter auf. Kann bei einem Tabellenwertparameter ein Parameter-Sniffing auftreten?

BEARBEITEN: Der Prozess akzeptiert auch 12 andere Parameter, von denen einige optional sind, von denen zwei ein Start- und ein Enddatum sind.

Ist das Histogramm seltsam oder belle ich den falschen Baum an?

Es ist mir sicher angenehm, die Abfrage anzupassen und / oder meine Indizierung anzupassen. Wenn das die Lösung ist, die großartig ist, dann ist meine Frage an diesem Punkt mehr über das verzerrte Histogramm.

Ich sollte erwähnen, dass dies ein PK IDENTITY-Clustered-Index ist. Wir haben zwei Systeme, die miteinander kommunizieren, eines als Legacy-System und eines als neues System aus eigenem Anbau. Beide Systeme speichern ähnliche Daten. Um sie synchron zu halten, wird die PK in dieser Tabelle im neuen System erhöht, wenn Dinge zum alten System hinzugefügt werden, auch wenn die Daten nicht übergehen (ein RESEED wird durchgeführt). Es könnte also einige Lücken in der Nummerierung in dieser Spalte geben. Datensätze werden selten, wenn überhaupt, gelöscht.

Alle Gedanken wäre sehr dankbar. Ich bin mehr als glücklich, mehr Informationen zu sammeln / aufzunehmen.

Mark Wilkinson
quelle
Ist der einzige Parameter für die Prozedur ein TVP oder gibt es auch andere Parameter?
Martin Smith
1
Wenn Sie sich langsames und schnelles Plan-XML ansehen, wäre der Unterschied ParameterCompiledValuefür diese anderen Parameter durch unterschiedliche erklärbar ?
Martin Smith
1
Der Datumsbereich, mit dem kompiliert wurde, ist dramatisch enger (5 Tage statt 31). Für die meisten Anrufe wird dieser Prozess einen Monat lang ausgeführt. Ich könnte versuchen, dieser bestimmten Anweisung einen Hinweis zum erneuten Kompilieren hinzuzufügen.
Mark Wilkinson
1
Das scheint definitiv eine seltsame Verteilung für eine Identitätsspalte zu sein. Ich habe gerade diesen Artikel gelesen und mich gefragt, ob Sie näher auf das eingehen können, was Sie für diese beiden Pläne als geschätzt oder tatsächlich sehen. > blogs.technet.com/b/mspfe/archive/2013/04/18/…
Richard Schweiger
1
Um ganz klar zu sein: Was ist die Grafik genau? RANGE_HI_KEYvermutlich auf der x-Achse, aber was ist auf der y-Achse? EQ_ROWS? RANGE_ROWS? Die Summe davon?
Paul White 9

Antworten:

3

Dies hing letztendlich mit dem Parameter-Sniffing zusammen. Es ist einfach so passiert, dass einige seltsam geformte Versionen dieser Abfrage direkt nach der Neuerstellung der Statistiken ausgeführt wurden. Der zwischengespeicherte Plan war also nicht repräsentativ für die Mehrheit der Anrufe. Ich habe den Trick verwendet, die Datumsparameter in lokale Variablen zu kopieren, und dies funktioniert einwandfrei, ohne die Leistung zu beeinträchtigen. Dies beantwortet nicht, warum das Histogramm so "aus" aussieht, aber es erklärt meine Leistungsprobleme.

Mark Wilkinson
quelle