gpt4 book ai didi

sql - 一个存储过程怎么可以有多个执行计划呢?

转载 作者:行者123 更新时间:2023-12-03 00:10:22 25 4
gpt4 key购买 nike

我正在使用 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 参数只有 2 个 if 条件。

if @a_flag = 0
begin
...
end

if @a_flag = 1
begin
...
end

最佳答案

根据存储过程的性质(未提供),这很可能出于多种原因(很可能不限于以下原因):

  1. 过程是否使用大量if this then this select, else this select/update
  2. 该过程是否包含动态sql?
  3. 您是否同时从 Web 和 SSMS 执行 SP?那么您可能会使用不同的连接设置来执行 SP。
  4. 存储过程有参数吗?有时参数的差异可能会导致一个执行计划对于特定的集合来说很糟糕,因此会使用不同的计划。

尝试一个可能有帮助的类比......也许......

<小时/>

假设您有一个用于周末购物的存储过程。您通常需要购买杂货,有时需要购买空气过滤器,甚至更少需要购买一大包每年需要更换 4 次的东西。

  1. 杂货店可以处理杂货,并且距离您家最近(5 分钟)。
  2. Target 可以搬运空气过滤器杂货,但会增加 25 分钟的行程时间。
  3. “应有尽有的大地方”拥有您可能需要的一切,但距离酒店只有一个小时的车程。

所以在这里,根据您的参数@needsAirFilter@needsBigPackOfSomething可能会极大地改变您的“购物”存储过程的“执行计划”。

如果@needsAirFilter@needsBigPackOfSomethingfalse,则没有理由开车30分钟或小时,因为您需要的一切都在在杂货店。

每月一次,@needsAirFilter 为 true,在这种情况下我们需要前往 Target,因为杂货店的执行计划不足。

每年 4 次 @needsBigPackOfSomething 是真的,我们需要花一个小时的车程去拿一大包东西,同时还要去买杂货和空气过滤器,因为我们在那里。

当然...我们可以每次开车一个小时去买杂货,其他的需要时做的事情(想象一下单个执行计划)。但这绝不是最有效的方法。在这种情况下,我们对于实际需要的信息/商品有不同的执行计划。

不知道这是否有帮助......但我玩得很开心:D

关于sql - 一个存储过程怎么可以有多个执行计划呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30871662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com