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.
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.
ParameterCompiledValue
für diese anderen Parameter durch unterschiedliche erklärbar ?
RANGE_HI_KEY
vermutlich auf der x-Achse, aber was ist auf der y-Achse? EQ_ROWS
? RANGE_ROWS
? Die Summe davon?