次のクエリは正しい結果を返しますが、同じ結果をより速く得るにはどうすればよいですか?今年、今週、今月、今四半期に基づいて売上を集計する最速の方法は?
目標は、売り手の進捗状況を、今日、今週、月、および四半期の売上を要約して追跡するためのテーブルを出力することです。
SellerID Today ThisWeek ThisMonth ThisQuarter
----------- --------------------- --------------------- --------------------- ---------------------
1 400,00 700,00 900,00 900,00
2 950,00 1850,00 2650,00 2650,00
マイクエリ:
CREATE TABLE #sales(
[Price] MONEY,
[Date] DATE,
[SellerID] INT
)
INSERT INTO #sales VALUES
(100, '2012-01-01', 1),
(200, '2012-04-01',1),
(300, '2012-04-23',1),
(400, '2012-04-27',1),
(700, '2012-01-01', 2),
(700, '2012-01-02', 2),
(800, '2012-04-01',2),
(900, '2012-04-23',2),
(950, '2012-04-27',2)
SELECT
SellerID AS SellerID,
SUM(CASE WHEN [Date] >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()),0) THEN [Price] END) AS Today,
SUM(CASE WHEN [Date] >= DATEADD(WEEK, DATEDIFF(WEEK, 0, GETDATE()), 0) THEN [Price] END) AS ThisWeek,
SUM(CASE WHEN [Date] >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) THEN [Price] END) AS ThisMonth,
SUM(CASE WHEN [Date] >= DATEADD(QUARTER, DATEDIFF(QUARTER, 0, GETDATE()), 0) THEN [Price] END) AS ThisQuarter
FROM #sales
WHERE DATEPART(YEAR, [Date]) = DATEPART(YEAR, GETDATE())
GROUP BY SellerID
大きなテーブルの上に同じクエリを実行すると、これは非常に遅くなります。 CASE文を削除するだけで実行時間が50%近く短縮されます。
私はどのようにしてより高速で効率的な方法で同じ結果を達成できますか?
あなたの '[Date]'列がインデックスされている限り、トランザクションデータを照会するのに最も効率的なソリューションがあると思います。パフォーマンス上の問題を抱えている場合は、データウェアハウジングを増やしたいかもしれません。 – GarethD
はい、インデックスに登録されています。残念ながら現時点では少し制限されているSQL Azureを使用しています。私はそれがより良いアプローチ(+1)だとも考えています。 –