我正在使用SQL Server,我希望从重用查询计划中受益。我发现了这个document,但我仍然不清楚我的查询计划是否被重复使用。
declare @su dbo.IntCollection -- TABLE (Value int not null)
insert into @su values (1),(2),(3) --... about 500 values
update mt
set mt.MyField = getutcdate()
from MyTable mt
join @su vsu on mt.Id = vsu.Value -- Clustered PK, int
从技术上讲,批处理的文本因运行而异,因为@su
中插入了不同的值。但更新查询的文本保持不变。如果我使用.NET,我基本上会将一个表变量传递给SQL命令,但我使用的是Python,看起来没有办法从我的程序中传递table参数。
问题1 :更新查询计划是否重复使用?或者优化器是否看起来批处理文本不同并且不批量分析单个查询?换句话说,它与
相同update MyTable
set MyField = getutcdate()
where Id in (1, 2, 3 ...)
问题2 :我可以通过引入带有table参数的存储过程来强制SQL在调用之间保持相同,但是我会从中受益吗?
问题3 :如何识别给定查询其计划是重新使用还是重新计算?
问题4 :在我的具体案例中,我是否应该担心以上所有问题?毕竟它只是一堆ID表的更新......
答案 0 :(得分:2)
回答你的问题..
问题1:更新查询计划是否重复使用?或者优化器是否看起来批处理文本不同并且不批量分析单个查询?换句话说,它与
相同
您的两个更新语句都被视为新查询,因为SQL会尝试计算查询的哈希值,并且任何简单更改都不会与旧哈希值匹配
问题2:我可以通过引入带有table参数的存储过程来强制SQL在调用之间保持相同,但是我会从中受益吗?
这对我来说听起来不错......比一堆IN's
问题3:如何识别给定查询其计划是重新使用还是再次计算?
select usecounts from sys.dm_exec_cached_plans ec
cross apply
sys.dm_exec_sql_text(ec.plan_handle) txt
where txt.text like '%your query text%'
在我看来,你很担心......正如你提到的白皮书所指出的那样,有许多规则强制执行查询计划重用行为。因此大多数情况下,查询计划将被重用..问题4:在我的具体案例中,我是否应该担心以上所有问题?毕竟它只是一堆ID表的更新......
只有当我看到高SQL Compilations/sec
加上Batch Requests/sec
SQL Compilations / sec是一个很好的指标,但只有在与Batch Requests / sec结合使用时才会出现。就其本身而言,每秒的编辑并没有真正告诉你太多。
你看到170.如果每秒批量请求只有200(有点夸大效果)那么是的,你需要深入到原因的底部(最有可能过度使用临时查询和一次性使用)计划)。但是如果你的每秒批量需求大约为5000,那么每秒170次编译就不算差了。一般的经验法则是,Compilations / sec应该比批量请求总数/秒小10%或更少。