5 つの列 (tableID、CompanyID、UserID、ProjectID、DailyHoursWorked、entryDate) しかない TimeCard という非常に長いテーブル (~3500 万行) があるとします。これは、会社ごと、プロジェクトごと、従業員の 1 日あたりの労働時間を記録する非常に単純な表です。
ここで、特定の会社の従業員の 1 か月あたりのプロジェクトごとの総労働時間を調べるレポートを生成する必要があります。レポートの実行時に必要な集計を実行する代わりに、すべての会社/プロジェクト/ユーザー データが月ごとに集計されたテーブルのようなデータ構造を構築したいので、レポートの実行時にそのデータ構造を直接クエリできます。 3,500 万件までのレコードには数分かかることがあるため、ランタイム集計を実行しません。
だから私は2つの異なる方法があります。(CompanyID、UserID、ProjectID、MonthlyHoursWorked、Month) を列として追加の物理テーブルを作成し、TimeCard テーブルでトリガーを使用して、追加のテーブルの値を変更します。または、インデックス付きビューを作成できます。なので両方試しました。最初に、次のコードでインデックス付きビューを試しました。
CREATE VIEW [dbo].[vw_myView] WITH SCHEMABINDING AS
SELECT
JobID,
ProjectID,
Sum(DailyHoursWorked) AS MonthTotal,
DATEADD( Month, DATEDIFF( Month, 0, entryDate), 0 ) AS entryMonth,
CompanyID,
COUNT_BIG(*) AS Counter
FROM
dbo.TimeCard
Group By DATEADD( Month, DATEDIFF( Month, 0, entryDate ), 0 ), JobID, ProjectID, CompanyID
Go
CREATE UNIQUE CLUSTERED INDEX [IX_someIndex] ON [dbo].[vw_myView]
(
[CompanyID] ASC,
[entryMonth] ASC,
[UserID] ASC,
[ProjectID] ASC
)
インデックス付きビューが正しく作成され、合計で合計 500 万行に達しました。
ただし、毎回 SQL キャッシュをクリアして次のクエリを実行すると、*select * from vw_myView where companyID = 1*、ほぼ 3 分かかります。上記のように追加のテーブル ルートを使用すると、キャッシュがクリアされた状態で、約 4 秒かかります。
私の質問は、インデックス付きビューはこの特定のシナリオでは悪い選択ですか? 特に、基になるテーブル (TimeCard) が変更されるたびに、またはそれに対してクエリが実行されるたびに、インデックス付きビュー全体が再計算/再集計されるかどうかを知りたいですか?
ありがとう!