【发布时间】:2015-09-01 12:18:04
【问题描述】:
我正在使用 MS SQL Server 2008 R2。我有一个名为 rpt_getWeeklyScheduleData 的存储过程。这是我用来在特定数据库中查找其执行计划的查询:
select
*
from
sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) st
where
OBJECT_NAME(st.objectid, st.dbid) = 'rpt_getWeeklyScheduleData' and
st.dbid = DB_ID()
上面的查询返回 9 行。我期待 1 行。
这个存储过程已经被修改了多次,所以我相信 SQL Server 一直在为它构建一个新的执行计划,只要它被修改和运行。是正确的解释吗?如果不是,那你怎么解释呢?
还可以查看每个计划的创建时间吗?如果是,那怎么办?
更新:
这是存储过程的签名:
CREATE procedure [dbo].[rpt_getWeeklyScheduleData]
(
@a_paaipk int,
@a_location_code int,
@a_department_code int,
@a_week_start_date varchar(12),
@a_week_end_date varchar(12),
@a_language_code int,
@a_flag int
)
as
begin
...
end
存储过程很长; @a_flag 参数的 if 条件只有 2 个。
if @a_flag = 0
begin
...
end
if @a_flag = 1
begin
...
end
【问题讨论】:
-
至少有不同的连接设置,如 ansi_nulls 或 datefirst 会导致创建多个计划,查看 dm_exec_plan_attributes 可能会说明:msdn.microsoft.com/en-us/library/ms189472.aspx
-
你的 proc 定义中有重新编译选项吗?
-
@DLeh 我们已经有数据库处于版本控制之下。我们总是使用 DROP & CREATE 来更改存储过程。
-
@srh 在您的原始帖子中您说您不确定是否使用 DROP 或 ALTER 对其进行了修改。是哪一个?
标签: sql sql-server sql-execution-plan