gpt4 book ai didi

sql-server - T-SQL 代码保存为内联表值函数时非常慢

转载 作者:行者123 更新时间:2023-12-04 00:48:41 26 4
gpt4 key购买 nike

我似乎无法弄清楚为什么 SQL Server 在将我的代码包装在 ITVF 中时采用完全不同的执行计划。单独运行 ITVF 内部的代码时,查询会在 5 秒内运行。如果我将其保存为 ITVF,它将运行 20 分钟并且不会产生结果。我更喜欢在 ITVF 中使用它以进行代码重用。为什么将代码保存为 ITVF 会导致严重的性能问题?

CREATE FUNCTION myfunction
(
@start_date date,
@stop_date date
)
RETURNS TABLE
AS
RETURN
(
with
ad as (
select [START_DATE]
,[STOP_DATE]
,ID
,NAME
,'domain1\' + lower(DOMAIN1_NAME)
collate database_default as ad_name
from EMP_INFO
where DOMAIN1_NAME != ''
union
select [START_DATE]
,[STOP_DATE]
,ID
,NAME
,'domain2\' + lower(DOMAIN2_NAME)
collate database_default as ad_name
from EMP_INFO
where DOMAIN2_NAME != ''
)
select ad.ID
,ad.NAME
,COUNT(*) as MONITORS
from scores
join users
on (scores.evaluator_id = users.[user_id])
join ad
on (lower(users.auth_login) = ad.ad_name and
scores.[start_date] between ad.[START_DATE] and ad.[STOP_DATE])
where scores.[start_date] between @start_date and @stop_date
group by ad.ID
,ad.NAME
)

编辑:

好吧...我想我想出了问题...但我不明白。也许我应该发布一个全新的问题,让我知道你的想法。这里的问题是当我用文字调用函数时,它真的很慢……当我用变量调用它时,它很快。
-- Executes in about 3 seconds
declare @start_date date = '2012-03-01';
declare @stop_date date = '2012-03-31';
select *
from myfunction(@start_date, @stop_date);

--Takes forever! Never completes execution...
select *
from myfunction('2012-03-01', '2012-03-31')

有任何想法吗?

最佳答案

当您使用文字时,SQL Server 可以查看列统计信息来估计将返回的行数,并根据该假设选择适当的计划。当您使用变量时,这些值在编译时是未知的,因此它依赖于猜测。

如果计划在猜测时比在引用实际统计数据时更好,那么这表明统计数据可能需要更新。

如果您打开了统计信息的自动更新,那么您很可能会在这里遇到问题 Statistics, row estimations and the ascending date column

关于sql-server - T-SQL 代码保存为内联表值函数时非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10017793/

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