使用函数调整 SQL Server 查询
Posted
技术标签:
【中文标题】使用函数调整 SQL Server 查询【英文标题】:Tuning SQL Server Query with function 【发布时间】:2013-09-30 11:11:39 【问题描述】:功能:
create function .[data_by_date_district](@rev_datetime datetime)
returns table
as
return
(
SELECT
ro.Region,[DATETIME],
sum(datain) 'datain',
sum(dataout) 'dataout'
FROM
data.inoutdata cr
join
structure.site ro on
ro.site = substring(replace([siteunqid],'**',''),1,LEN(siteunqid)-1)
where [DATETIME] =@rev_datetime
group by Region,[DATETIME]
);
使用任何日期执行此函数需要 00:00:00。
现在,当我将其与另一个表连接时,需要 4 秒(该表为 75 行):
SELECT
Region,[DATETIME],datain,dataout,(cr.datain+cr.dataout) 'total',SP_GEOMETRY,MI_STYLE,MI_PRINX
FROM
data.data_by_date_district(DATEADD(DAY,-1,cast(GETDATE() as DATE)) ) cr
join
datamap.VectorMaps.REGION_BND db
on db.Name = cr.Region
第一个表有 1,700,000 行数据,每天增加 170,000 行,但另一个表只有 75 行。有什么办法可以减少查询时间?函数的结果是75行。
【问题讨论】:
请附上您的执行计划。 @Devart 图片好不好,因为 xml 太大了。 【参考方案1】:我认为您应该使用公用表表达式而不是函数来获取结果集并用 cte in from 子句替换函数。我希望这会有所帮助!
【讨论】:
不错的 Pratik CTE 确实有帮助【参考方案2】:您是否尝试过在查询中直接使用函数体(替换函数调用)?我认为函数对性能不是很好。
类似的东西(抱歉,格式不是最好的):
SELECT Region,
[DATETIME],
datain,
dataout,
(cr.datain + cr.dataout) 'total',
SP_GEOMETRY,
MI_STYLE,
MI_PRINX
FROM (
SELECT ro.Region,
[DATETIME],
SUM(datain) 'datain',
SUM(dataout) 'dataout'
FROM data.inoutdata cr
JOIN structure.site ro ON ro.site = SUBSTRING(REPLACE([siteunqid], '**', ''), 1, LEN(siteunqid) - 1)
WHERE [DATETIME] = DATEADD(DAY, -1, CAST(GETDATE() AS DATE))
GROUP BY Region,
[DATETIME]
) cr
JOIN datamap.VectorMaps.REGION_BND db ON db.Name = cr.Region
【讨论】:
实际上我正在加入此表以从中接收几何列。我不能直接加入它,因为它给出了“类型几何无法比较它不能在 group by 子句中使用” 好吧,这很酷,现在需要 1 秒才能更好地调整它,因为它只有 75 行 :( . 我还看到,在对 176133 行执行操作的表 inoutdata 上,现在聚集索引查找成本从 75% 降低到 46%。 我认为,只有在SELECT
子句中应用时,功能才真正好用。否则它们会影响性能。
我使用了 CTE,查询在 00:00:00 运行。很有趣。我不知道这是如何工作的,但是。以上是关于使用函数调整 SQL Server 查询的主要内容,如果未能解决你的问题,请参考以下文章