Eine einfache Parametrisierung wird versucht, wenn ein trivialer Plan gefunden wird. Der Parametrisierungsversuch kann als sicher oder unsicher angesehen werden .
Der entscheidende Punkt ist, dass ein trivialer Plan gefunden und als sicher angesehen wird . Wenn die Kosten des Trivialplans die überschreiten cost threshold for parallelism
, fährt der Optimierer mit späteren Optimierungsphasen fort, in denen parallele Pläne in Betracht gezogen werden können. Unabhängig davon, ob das Endergebnis ein serieller oder paralleler Plan ist, wird es einfach parametrisiert, wenn der gefundene ( aber letztendlich nicht verwendete ) sichere Trivialplan parametrisiert wurde.
In dem cost threshold for parallelism
Fragenbeispiel kann der Optimierer in diesem Stadium anhalten, wenn er die höheren als die Kosten des Trivialplans festlegt.
Ein Blick auf den Abfrageplan reicht nicht immer aus, um herauszufinden, ob Ihre Abfrage tatsächlich einfach parametrisiert wurde.
Am sichersten ist es, einige DMVs zu überprüfen, um Folgendes zu überprüfen:
/*Unsafe auto param*/
SELECT *
FROM sys.dm_os_performance_counters AS dopc
WHERE dopc.counter_name LIKE '%Unsafe Auto-Params/sec%';
/*Safe auto param*/
SELECT *
FROM sys.dm_os_performance_counters AS dopc
WHERE dopc.counter_name LIKE '%Safe Auto-Params/sec%';
/*Trivial Plans*/
SELECT *
FROM sys.dm_exec_query_optimizer_info AS deqoi
WHERE deqoi.counter = 'trivial plan';
Darüber hinaus können Sie auch das undokumentierte Ablaufverfolgungsflag 8607 verwenden, jedoch nicht als OPTION
Klauselhinweis. Die Verwendung der OPTION
Klausel verhindert einen trivialen Plan.
DBCC TRACEON(8607, 3604);
/*Wait*/
/*Run*/
SELECT u.CreationDate, u.Id
FROM dbo.Users AS u
WHERE u.Reputation = 2;
/*Clean up*/
DBCC TRACEOFF(8607, 3604);
Wenn der Plan für die einfache Parametrisierung als sicher eingestuft wird, wird hier eine Bestätigung angezeigt.
********************
** Query marked as Cachable
** Query marked as Safe for Auto-Param