执行计划重用

发布于 2024-08-18 23:38:58 字数 621 浏览 7 评论 0原文

考虑以下“代码”,

define stmt1 = 'insert into T(a, b) values(1, 1);
define stmt2 = 'select * from T';
MSSqlCommand.Execute( stmt1;stmt2 );
MSSqlCommand.Execute( stmt2 );

使用以下方法调查缓存的查询计划:

SELECT [cp].[refcounts] 
, [cp].[usecounts] 
, [cp].[objtype] 
, [st].[dbid] 
, [st].[objectid] 
, [st].[text] 
, [qp].[query_plan] 
FROM sys.dm_exec_cached_plans cp 
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st 
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp ;

我的印象是,第一个“执行”生成一个复合执行计划,而不是两个单一的执行计划,从而禁用第二个“执行”重用第一个“执行”中生成的任何执行计划执行。

我说得对吗?

Consider the following "code"

define stmt1 = 'insert into T(a, b) values(1, 1);
define stmt2 = 'select * from T';
MSSqlCommand.Execute( stmt1;stmt2 );
MSSqlCommand.Execute( stmt2 );

Investigating the cached query-plans using:

SELECT [cp].[refcounts] 
, [cp].[usecounts] 
, [cp].[objtype] 
, [st].[dbid] 
, [st].[objectid] 
, [st].[text] 
, [qp].[query_plan] 
FROM sys.dm_exec_cached_plans cp 
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st 
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp ;

My impression is that the first "Execute" generates a composite execution plan instead of two singular execution plans, thereby disabling the second "Execute" reusing any execution plan generated in the first Execute.

Am I right?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明媚殇 2024-08-25 23:38:58

是的,你说得对。要重用执行计划的第二部分,您需要将第一个语句拆分为 2 个单独的执行计划。您可以通过使用单独的 MSSqlCommand.Execute 调用来执行它们,或者在一个查询中使用对 sp_executesql 的两次调用来执行此操作(这会增加一级间接)。它看起来像这样(伪代码):

MSSqlCommand.Execute('exec sp_executesql stmt1; exec sp_executesql stmt2");

Yes, you're right. To reuse the the second part of the execution plan you need to split the first statement into 2 separate execution plans. You can do this either by executing them with separate MSSqlCommand.Execute calls or by using two calls to sp_executesql in one query (this adds one level of indirection). It would look something like this (in pseudocode):

MSSqlCommand.Execute('exec sp_executesql stmt1; exec sp_executesql stmt2");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文