に私は、この定義を持つユーザーの変更をログに記録するテーブルを持っている:大きなテーブルの上にntext型の列上のパフォーマンスの低下フィルタリング
audit_trail
(
change_id int identity (1, 1) NOT NULL,
change_date datetime NOT NULL,
user_id int NOT NULL,
record_id int NOT NULL,
table_name nvarchar(50) NOT NULL,
field_name nvarchar(50) NOT NULL,
new_value ntext NULL
)
このクエリは、このテーブルの上に非常に遅い(15+分)を実行します:
SELECT DISTINCT record_id
FROM audit_trail
WHERE table_name = 'jobs'
AND field_name = 'status'
AND new_value LIKE '157'
私のテーブルには7000万を超えるレコードがあります。これは、このテーブルの通常のクエリではありません。このテーブルの通常のクエリは、日付別に並べ替えたり、日付範囲の変更を検索したりするため、change_date
列にクラスタードインデックスがあります。このクエリの実行計画は、クラスタ化インデックススキャンを実行していることを示しています。私は(table_name, field_name)
にノンクラスタード・インデックスを追加してパフォーマンスを向上させることができると考えましたが、このインデックスは使用されていませんでした。このクエリのパフォーマンスを改善するための推奨事項はありますか?
パターンでワイルドカードを使用していないのはなぜですか? – ThomasMcLeod
@ThomasMcLeod new_valueはntext列です。文字列の比較には '='は使用できません。 – InvisibleBacon
私は、パフォーマンスのヒットがntext列と関係していると考えています。この列の選択性は何ですか?実験として、テーブルをntextの代わりにnvarcharでduppし、再度クエリを実行してみてください。 – ThomasMcLeod