私たちは SQL タイムアウトを経験しており、そのボトルネックが監査テーブルであることを特定しました。システム内のすべてのテーブルには、新しい監査レコードの原因となる挿入、更新、および削除のトリガーが含まれています。
これは、監査テーブルがシステム内で最大かつ最もビジーなテーブルであることを意味します。ただし、データは入ってくるだけで出てこない (このシステムでは) ため、select
パフォーマンスは必要ありません。
返品を実行するselect top 10
と、「最初の」レコードではなく最近レコードが挿入されます。 order by
もちろん動作しますが、select top はディスク上の順序に基づいて行を返す必要があると思います.これは最低の PK 値を返すと思います.
クラスター化されたインデックスを削除することが提案されており、実際には主キー (一意の制約) も削除されています。前に述べたようにselect
、このシステム内のこのテーブルからする必要はありません。
クラスター化インデックスがテーブルに作成するパフォーマンス ヒットはどのようなものですか? 索引付けされていない、クラスター化されていない、キーのないテーブルを持つことの (非選択) 影響は何ですか? 他の提案はありますか?
編集
私たちの監査にはCLR関数が含まれており、現在、PK、インデックス、FKなどを使用して、または使用せずにベンチマークを行って、CLR関数と制約の相対的なコストを決定しています。
調査の結果、パフォーマンスの低下はinsert
ステートメントに関連するものではなく、監査を調整する CLR 機能に関連するものでした。CLR を削除し、代わりに単純な TSQL プロシージャを使用すると、パフォーマンスが 20 倍向上しました。
テスト中に、クラスター化されたインデックスと ID 列は、少なくとも他の処理と比較して、挿入時間にほとんど、またはまったく違いがないことも確認しました。
// updating 10k rows in a table with trigger
// using CLR function
PK (identity, clustered)- ~78000ms
No PK, no index - ~81000ms
// using straight TSQL
PK (identity, clustered) - 2174ms
No PK, no index - 2102ms