1

功能 :

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

4

2 回答 2

3

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

于 2013-09-30T11:38:24.930 回答
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
于 2013-09-30T11:21:44.327 回答