使用函数调整 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 查询的主要内容,如果未能解决你的问题,请参考以下文章

调整SQL Server中的大型查询

SQL Server 查询:调整货币列

在 SQL Server 中调整大型查询

调整查询以解析 SQL Server 2014 上的 XML 数据

SQL Server 使用分区函数实现查询优化

在查询中使用相同的函数两次(SQL Server)