Answers:
找到简单的计划后,尝试进行简单的参数化。参数化尝试可能被认为是安全的或不安全的。
关键是要找到一个简单的计划并认为它是安全的。如果琐碎计划的成本超过cost threshold for parallelism
,则优化器将继续进行后期优化,在此可以考虑并行计划。无论最终结果是串行计划还是并行计划,如果对找到的(但不是最终使用的)安全小计划进行了参数化,则将简单地对其进行参数化。
在问题示例中,将价格设置为cost threshold for parallelism
高于简单计划的成本将使优化器在该阶段停止。
查看查询计划并不总是足以确定您的查询是否实际上已经过简单参数化。
最安全的方法是检查一些DMV以进行验证:
/*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';
此外,您还可以使用未记录的跟踪标志8607,但不能用作OPTION
子句提示。使用该OPTION
子句可以防止琐碎的计划。
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);
如果认为该计划可用于简单参数化,则您会在此处看到确认消息。
******************** ** Query marked as Cachable ** Query marked as Safe for Auto-Param