かなり大きなレコード数(1000万から2000万行)のデータウェアハウスがあり、特定の日付の間にレコードを数えるクエリや、特定のフラグを持つレコードを数えるクエリを実行することがよくあります。
SELECT
f.IsFoo,
COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo
パフォーマンスはそれほど悪くありませんが、比較的遅くなる可能性があります(コールドキャッシュで10秒程度)。
最近、私GROUP BY
はインデックス付きビューで使用できることを発見し、次のようなものを試しました
CREATE VIEW TestView
WITH SCHEMABINDING
AS
SELECT
Date,
FlagId,
COUNT_BIG(*) AS WidgetCount
FROM Widgets
GROUP BY Date, FlagId;
GO
CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
Date,
FlagId
);
その結果、最初のクエリのパフォーマンスは100ミリ秒未満になり、結果のビューとインデックスは100k未満になりました(行数が多いにもかかわらず、日付とフラグIDの範囲は、このビューに1000〜2000行しか含まれないことを意味します)。
おそらくこれはWidgetテーブルへの書き込みのパフォーマンスを低下させると思いましたが、いいえ-このテーブルへの挿入と更新のパフォーマンスは、私が知る限りほとんど影響を受けません(さらに、このテーブルは頻繁に更新されないデータウェアハウスであるためとにかく)
私には、これはあまりにも良いように思えます-それは本当ですか?この方法でインデックス付きビューを使用する場合、何に注意する必要がありますか?
SELECT
とCREATE VIEW
スクリプトは間違っていCREATE INDEX
ます。