数億行のデータを持つテーブルがあります。EventId
整数フィールドであると呼ばれるフィールドがあります。
特定の EventId を持つデータのみを返すさまざまなビューがいくつかあります
クエリを実行すると
SELECT TOP 1000 * FROM vw_MyView
行を返すのに 5 分かかります。何にインデックスを追加する必要がありますか? 現在、各ビューの where 句で使用されている主キーのマスター テーブル (クラスター化LogId
) と非クラスター化のインデックスがあります。EventId
ビューにインデックスを作成できることはわかっています。ビューのどのフィールドにインデックスを作成する必要がありますか? DB エンジン チューニング ウィザードを実行して、その内容を確認する必要がありますか?
フィードバックを受けて更新
内部にすべてのデータを含む私のマスターテーブルは、次のスキーマの行に沿っています
LogId (int) PK
EventId (int)
Param1 varchar(255)
Param2 varchar(255)
..
..
..
Param24 varchar(255)
各イベント タイプには異なるパラメーターがあるため、マスター テーブルの一般的なフィールド名です。
イベントの種類ごとにビューがあり、ビューを通じてマスター テーブルの ParamX フィールドに適切なフィールド名が与えられます。
したがって、1つのイベントのビューは次のようになります
SELECT LogId, Param1 AS Name, Param2 AS Address1, Param3 AS Address2
WHERE EventId = 10
クエリを実行してみました
SELECT TOP 1000 LogId from vw_MyView
そしてそれは速く働きました。速度を落としているのは他のフィールドですが、インデックス作成が不十分であると思いますか?
更新 2 - 詳細情報
以前は、各イベントのデータは各イベントのテーブルに格納されていました。これは、新しいイベントを追加するには、イベントごとに新しいテーブルが必要になることを意味していました。
データを一時テーブルに一括インポートしてから、それをマスター テーブルに移動しています。一括インポートにより高速になりますが、マスター テーブルがこれほど大きいと、クエリが遅くなりすぎて使用できなくなるのではないかと懸念しています。
数百万行のデータは 10 年以上あるので、おそらく最初の 8 年分のデータを別のデータベースに移動して、アーカイブの目的で最新の 2 年分だけを保持することができます。
問題は、メンテナンスを必要としないが潜在的に多くのインデックス作成を必要とするマスター テーブル アプローチを続行するか、それともイベントごとにテーブルを持つ元のアプローチに戻るかということです。
フィードバックをありがとう、本当に感謝しています