2013-09-30 114 views
1

功能:优化SQL Server查询与功能

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] [email protected]_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 

第一表具有170万行的数据,其由17万每日增加,而其他表只有75行。有什么办法可以减少查询时间吗?函数的结果是75行。

+0

请附上您的执行计划。 – Devart

+0

@Devart形象很好,因为xml太大了。 – kinkajou

回答

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 
+0

实际上,我正在加入此表以从中接收几何列。我不能直接加入它,因为它提供了“类型几何不具有可比性,它不能用于group by子句” – kinkajou

+0

检查我编辑的答案,也许它会工作。 – Szymon

+0

好吧,这很酷,现在需要1秒任何方式来调整它更好,因为它只是75行:(。 – kinkajou

3

我认为你应该使用公用表表达式,而不是功能,让您的结果集,并从子句中的CTE替换功能。我希望这有帮助!

+0

不错的一个Pratik CTE的确有帮助 – kinkajou