1

Ich habe die Theorie und Ansichten hinter SQL Server 2008 "OPTIMIZE FOR UNKNOWN" Abfrage Plan Option gelesen. Ich verstehe, was es gut genug macht.Erfahrung mit wann OPTIMIZE FÜR UNBEKANNT verwenden

Ich habe einige begrenzte Experimente gemacht und festgestellt, dass es mit einem warmen Cache nur bei> 100k Zeilen von Vorteil war. Dies geschah jedoch auf einer einfachen Tabelle und Abfrage ohne Joins, Filterung usw. Bei einem kalten Cache würde das Bild zweifellos viel mehr zu seinen Gunsten sein.

Ich habe derzeit kein Produktionssystem für die Vorher/Nachher. Daher bin ich neugierig, ob jemand vor/nach dem Testen irgendwelche brauchbaren Entdeckungen gemacht hat, wann genau diese Option verwendet wird und wann nicht.

UPDATE:

habe ich eine Tabelle mit 3 cols, ein PK auf der UID, und ein Index für Col2 (int). Die gesamte Verarbeitung war gegen Col2. Angegeben ist jeweils Anzahl der Zeilen und Zeit (DATEDIFF * 1000000):

Type  1,000 5,000 20,000 100,000 
Normal  0.3086 6.327 26.427 144.83, 141.126 
Recompile   117.59 584.837 
For Unknown 0.8101 6.52 26.89 143.788, 143.248 

Antwort

0

Sie würden es verwenden, wenn Sie Ihre Daten ausreichend verzerrt ist, dass ein Plan mit einem Parameterwert erzeugt würde für einen weiteren potenziellen Wert des Parameters völlig ungeeignet sein. d.h., um ein Parameter-Sniffing-Problem zu lösen.

Der Rest Ihrer Frage scheint nicht besonders relevant für den Zweck der Hinweis oder beantwortbare IMO.

+0

Ich könnte argumentieren, dass ein Plan von "@UID = 1", die einen Index Scan verursachen würde, nicht suchen, wäre immer schlecht für "@ UID = 100000". Die Blogs von MSDN sind in Bezug auf Best Practices sehr vage und geben nur das an, was Sie hier sagen. Der Rest der Frage beleuchtet ein Szenario, das die Situation verschärft, also IMO ist es sehr relevant. – IamIC

+0

@IanC - Es ist völlig unbeantwortbar wie geschrieben. Die Anzahl der Zeilen bedeutet nichts ohne den Kontext eines Ausführungsplans. –

+0

Ich verstehe das. Alles, worum ich bitte, sind einige Fallstudien. Dies ist ähnlich wie die Frage "tut Hyperthreading verletzt oder Hilfe SQL Server". Es gibt keine "Ja/Nein" Antwort. Die einzige Möglichkeit, irgendeine Antwort zu finden, besteht darin, einige Fallstudien zu untersuchen und Muster abzuleiten. Dies wurde für dieses Szenario getan und eine Schlussfolgerung wurde erreicht. Es könnte getan werden für das, was ich auch frage. – IamIC