2013-09-30 146 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