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

関数の代わりに一般的なテーブル式を使用して結果セットを取得し、関数を from 句の cte に置き換える必要があると思います。これが役立つことを願っています!

于 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 に答える