0

「%X%」のようなクエリを実行している列があります。データの量が増えるにつれて再検討する必要があることを知って、簡単にするためにこのようにしました。

ただし、テーブルをロックすることは予想していませんでしたが、そうしているようです。クエリは遅く、クエリが実行されている場合、完了するまで他のクエリは終了しません。

私が求めているのは、なぜこれが起こっているのかについての一般的なアイデアと、ロックに関して何が起こっているのかを正確に把握するために SQL Server にドリルダウンする方法についてのアドバイスです。

60 秒ごとにウェイクアップしてさまざまなことをチェックし、場合によっては行を挿入するサービスを除いて、すべてのクエリは SELECT であることに言及する必要があります。この表は更新されず、CRD のみで、CRUD は更新されませんが、問題は断続的ではなく一貫しています。

4

1 に答える 1

1

これは、LIKE '%X%' が完全なスキャンを強制するために発生しています。使用できるインデックスがある場合、エンジンはインデックスをスキャンしますが、すべての行を読み取る必要があります。非クラスター化インデックスがない場合、エンジンはクラスター化インデックス スキャンを実行するか、テーブルがヒープの場合はテーブル スキャンを実行します。

これは、LIKE %somevalue% 構造が原因で発生します。たとえば、電話帳を持っていて、名前の途中に X が付いている人をすべて見つけるように求められた場合、インデックス内のすべてのエントリを読む必要があります。一方、LIKE 'X%' の場合は、'X' で始まるエントリだけを確認すればよいことがわかります。

テーブル全体をスキャンする必要があるため、行ロックをテーブル ロックにエスカレートする可能性があります。これは欠陥ではありません。単一のロックを配置する方が効率的であると SQL Server が判断した場合、SQL Server はほとんど常に正しいです。テーブルは 100,000 行を超えてロックされますが、書き込み操作はブロックされます。

私の提案は、LIKE '%X%' を含むクエリよりも優れたクエリを見つけようとすることです。

于 2012-12-24T23:09:52.193 に答える