Suchen Sie den Wert, den OPTIMIZE FOR UNKNOWN verwendet


Antworten:


17

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:

DBCC SHOW_STATISTICS für dbo.Users.IX_Reputation

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.


5

Benjamin Nevarez hat einen guten Artikel OPTIMIZE FOR UNKNOWNin 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.

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.