全体的な課題:
多くの「マーケット」について、1日に数回テーブルにアイテムを追加しています。
それで
- 12:00に、マーケット「x」に2000アイテムを追加します。
- 12:30に、マーケット「y」に3000アイテムを追加します。
- 14:00に、マーケット「x」に2500アイテムを追加します。
これは毎日数回行われます。
いつでも、毎日の各市場の最新アイテムを抽出する必要があります
上記の挿入の望ましい結果は次のとおりです。
マーケット「x」の2500アイテム
マーケット「y」の3000アイテム
データのバッチを追加するたびに、バッチを一意に定義するExecutionTimeタイムスタンプがあります。したがって、12:00のマーケット「x」の2000アイテムは同じExecutionTime値を持ち、14:00のマーケット「x」の2500アイテムは別のExecutionTime値を持ちます。
私たちはこれを行うビューを作成しました
SELECT
*
FROM
dbo.Items AS s
WHERE
(ExecutionTime =
(SELECT MAX(ExecutionTime) AS Expr1
FROM dbo.Items AS s2
WHERE (SiteAlias = s.SiteAlias) AND (Market = s.Market)
AND (LocalTimestamp >=
DATEADD(dd, DATEDIFF(dd, 0, s.LocalTimestamp), 0))
AND
(LocalTimestamp <
DATEADD(dd, DATEDIFF(dd, 0, s.LocalTimestamp), 1))))
次のようにビューをクエリします。
SELECT *
FROM [ExportedData]
WHERE
SiteAlias = 'MyAlias'
AND LocalTimeStamp between '2012-05-14 00:00' AND '2012-05-18 00:00'
ORDER BY [Timestamp]
テーブルITemsのフィールドExecutiontimeにインデックスを定義し、sitealiasにインデックスとlocaltimestampを組み合わせたインデックスを定義しました。
問題:パフォーマンスが低下します。約150000行のクエリには数分かかります。
私たちがすべき見解に明らかな改善はありますか?ビューの作成で簡単な失敗がない場合に備えて、クエリプランなどを提供する準備ができています。
興味深いことに、SiteAliasで「=」の代わりに「LIKE」を使用してビューをクエリすると、実行が約90%高速化されます。これは私が予想していなかったことです。
ありがとう、
:o)
/ジェスパーコペンハーゲン