使用函数调整SQL Server查询

时间:2013-09-30 11:11:39

标签: sql-server sql-server-2008 query-optimization

功能:

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行。

2 个答案:

答案 0 :(得分:3)

我认为您应该使用公共表表达式而不是函数来获取结果集并通过cte in from子句替换函数。我希望这有帮助!

答案 1 :(得分: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