2009-08-22 14 views
5

SQL Server 2008 DBで監査用に単一のテーブルを使用しています。UPDATEなしのSQL高速INSERT

シングルテーブルアーキテクチャはうまく動作し、クエリが簡単で、スキーマの変更に対応します。

しかし、DB全体の大きなボトルネックです。 INSERTとUPDATESはすべて監査テーブルを通過する必要があります。

すでにSELECTステートメントにNOLOCK HINTを使用しています。

この表には更新がないので、INSERT文のスループットを改善するための提案はありますか?私はなるだろう

答えて

4

INT(またはBIGINT)IDENTITYプライマリクラスタ化インデックスがテーブルにあることを確認してください。そして、可能であれば他の指標はないことが好ましい - それはインサートを遅くする。

テーブルにはINSERTと読み込みがほとんど必要ないため、クラスタ化されたプライマリキーの問題を自分自身で "保存"しなければならないという誤解があります。 SQL Serverのインデックスの女神、キンバリーメーカーTrippとして

、彼女の優れたブログ記事The Clustered Index Debate continuesに説明しています

挿入がクラスタ化 テーブルに高速です(しかし、唯一の「正しい」 クラスタ化されたテーブルで)より ヒープと比較しています。ここでの主な問題は、IAM/PFSの ルックアップが、 ヒープ内の挿入位置がクラスタ化されたテーブル (挿入された場所はクラスタ化されたキーによって定義された )よりも遅いことです。インサート は、注文が定義されている(CL) テーブルに挿入され、その注文が増え続ける の場合に、より高速です。

のでクラスタ化インデックスは、あなたの挿入をスピードアップし、右ここ静的を意味します(変更することはありません)、ユニークな、できるだけ小さく(INTまたはBIGINT)、好ましくは増え続けることができます(ノーページ分割とパフォーマンスペナルティはありません)。

また、テーブルに挿入が行われ、更新/削除が行われない場合は、クラスタ化されたインデックスで100%FILLFACTORを使用して、これらのSQL Serverページを完全に埋める必要があります。マルク・

+0

私はこれらの行に沿って作業しています。 IDENTITY CLUSTERED PRIMARY KEYを持っているので、最後のページでINSERTが本当にAPPENDになっています。 100%FILL FACTORはナイスなタッチです。 私は毎月のメンテナンスを考えています。レコードを「永続的な」履歴テーブルに移動して、メインテーブルが決して大きくならないようにします。 – pkario

+0

インデックスが絶えず増えていれば、テーブルのサイズさえもそれほど大きな問題ではありません(明らかにselectを除いて) –

2

唯一の推奨事項は以下のとおりです。

  • は、あなたが他の任意のデータを可能な限り
  • などの非文字列の値を書き込むストアドプロシージャを経由して
  • グラブを監査するあなたの書き込みをカプセル化していることを確認しますまたは
  • 監査用のsprocに別の用途に適したビューを使用することを検討してください。結合が可能な限り最小限であることを確認します。このビューは、文字列データ用にFKを検索しようとしたときに、監査メッセージなどに対するPKのルックアップ用です。
  • 推奨事項ではありませんが、インデックスが少ないほど挿入が速くなり、選択が遅くなります。
  • 「古い」監査行を別の表にアーカイブすることを検討してください。できるだけ監査テーブルを小さくしてください。古い監査行を別の表に移動します。レポート/照会の場合は、joinまたはunionの「ライブ」監査と「古い」監査を作成します。
0

あなただけのテーブルの上にすべてのインデックスを削除することを検討し、監査テーブルに追加し、常にテーブルスキャンを実行して終了しようとしているレポートを実行している場合。

関連する問題