Wenn ich eine OPTIMIZE FOR UNKNOWN
in meiner gespeicherten Prozedur habe, kann ich dann sehen, welchen Wert die Datenbank für optimal befunden hat?
Wenn ich eine OPTIMIZE FOR UNKNOWN
in meiner gespeicherten Prozedur habe, kann ich dann sehen, welchen Wert die Datenbank für optimal befunden hat?
OPTIMIZE FOR UNKNOWN verwendet keinen Wert, sondern den Dichtevektor.
Wenn Sie DBCC SHOWSTATISTICS ausführen, ist dies der Wert, der in der Spalte "Alle Dichte" der zweiten Ergebnismenge aufgeführt ist:
In diesem Beispiel verwende ich die StackOverflow-Demo-Datenbank. Der Dichtevektor für die Reputationsspalte ist 5.962674E-05.
Wenn Sie diesen Wert multiplizieren mit der Anzahl der Zeilen in der Tabelle, 5.962674E-05 * 5277831, erhalten Sie 314.69985680094. Dies ist die Anzahl der Zeilen, die SQL Server für einen bestimmten Reputationsfilter voraussichtlich zurückgibt.
Benjamin Nevarez hat einen guten Artikel OPTIMIZE FOR UNKNOWN
in seinem Blog
Im Wesentlichen verwendet SQL Server Statistiken über die Tabelle zusammen mit Mathematik, um zu bestimmen, welcher Wert verwendet werden soll.
Von seinem Beitrag:
Die Dichte ist definiert als 1 / Anzahl unterschiedlicher Werte. Die SalesOrderDetail-Tabelle enthält 266 unterschiedliche Werte für ProductID, sodass die Dichte wie zuvor im Statistikobjekt gezeigt als 1/266 oder 0,003759399 berechnet wird. Eine Annahme im statistischen mathematischen Modell, das von SQL Server verwendet wird, ist die Einheitlichkeitsannahme. Da in diesem Fall SQL Server das Histogramm nicht verwenden kann, besagt die Einheitlichkeitsannahme, dass die Datenverteilung für einen bestimmten Wert gleich ist. Um die geschätzte Anzahl von Datensätzen zu erhalten, multipliziert SQL Server die Dichte mit der aktuellen Gesamtzahl von Datensätzen (0,003759399 * 121,317 oder 456,079), wie im Plan angegeben. Dies ist auch dasselbe, um die Gesamtzahl der Datensätze durch die Anzahl der unterschiedlichen Werte 121.317 / 266 zu teilen, was ebenfalls 456.079 ergibt.