Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server 2012中重用查询计划_Sql Server_Sql Server 2012_Query Optimization_Sql Execution Plan - Fatal编程技术网

Sql server 在SQL Server 2012中重用查询计划

Sql server 在SQL Server 2012中重用查询计划,sql-server,sql-server-2012,query-optimization,sql-execution-plan,Sql Server,Sql Server 2012,Query Optimization,Sql Execution Plan,我使用的是SQL Server,我想从重用查询计划中获益。我发现了这一点,但我仍然不清楚我的查询计划是否被重用 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

我使用的是SQL Server,我想从重用查询计划中获益。我发现了这一点,但我仍然不清楚我的查询计划是否被重用

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
中插入了不同的值。但update查询的文本保持不变。如果我使用的是.NET,我基本上会将一个表变量传递给SQL命令,但我使用的是Python,看起来无法从程序中传递表参数

问题1:更新查询计划是否得到重用?或者优化器是否认为批处理的文本不同,并且不分析批处理中的单个查询?换句话说,它与

update MyTable
set MyField = getutcdate()
where Id in (1, 2, 3 ...)
问题2:通过引入带有表参数的存储过程,我可以强制SQL在调用之间保持不变,但我会从中受益吗

问题3:如何识别给定查询的计划是否被重用或再次计算


问题4:在我的具体案例中,我是否应该担心上述所有问题?毕竟,这只是一个关于一堆ID的表的更新…

只是对您的问题的回答

问题1:更新查询计划是否得到重用?或者优化器是否认为批处理的文本不同,并且不分析批处理中的单个查询?换句话说,它与

update MyTable
set MyField = getutcdate()
where Id in (1, 2, 3 ...)
这两个update语句都被视为新查询,因为SQL试图计算查询的哈希值,任何简单的更改都不会与旧的哈希值匹配

问题2:通过引入带有表参数的存储过程,我可以强制SQL在调用之间保持不变,但我会从中受益吗

这对我来说似乎是个不错的方法..而不是一堆的
IN

问题3:如何识别给定查询的计划是否被重用或再次计算

问题4:在我的具体案例中,我是否应该担心上述所有问题?毕竟,这只是一个更新表上的一堆ID

在我看来,您非常担心..正如您在白皮书中指出的,有许多规则强制执行查询计划重用行为..因此,大多数情况下,查询计划将被重用

只有当我看到高
SQL编译/秒
加上
批处理请求/秒

摘自以下答案:

SQL编译/秒是一个很好的指标,但仅当与批处理请求/秒结合时。就其本身而言,每秒的编译并不能告诉你多少

你看到的是170。如果每秒批处理请求数仅为200(效果有点夸张),那么是的,您需要深入了解原因(很可能是过度使用临时查询和一次性计划)。但是,如果每秒的批处理请求量约为5000,那么每秒170次编译也不错。一般的经验法则是编译/秒应为10%或小于批处理请求总数/秒


是的,刚刚检查并发现计划没有被重用。我编写的存储过程只是为了测试目的,现在可以看到
update
的计划正在被重用,但无论如何,它需要执行另一个批处理来准备参数变量,比如
declare@v
insert into@v
(当然,该批次的计划虽然是基本的,但不会重复使用).你怎么看,一般来说这是更好的方法?基于以上评论,我不是100%肯定..当一个计划没有被重用时,有很多事情需要检查..你能用例子详细解释一下批吗?我的意思是:我把
update
语句放在SP:
创建过程my_proc@su IntCollection作为update…
,我明白了更新的计划正在被重用。现在,要从程序中调用我的程序,我必须运行如下批处理:
声明@su IntCollection
插入@su值(1)、(2)、(3)
exec my_proc@su
当然,该批的计划不会被重用,因为它在不同的运行中具有不同的插入值。在这种情况下,使用SP是否更好?是的,继续使用SP,即使批计划也可以被重用。可能您的批存储不安全