2009-03-15 14 views
1

一般的でない固有の列にクラスタード・インデックスを使用すると、挿入パフォーマンスが耐えられなくなるレコード数については、クラスタ化されたインデックスは、それほどユニークでない列にパフォーマンスを挿入しますか?

私が考えることができるのは、スタックオーバーフローのコメントテーブルです。コメントテーブルが回答テーブルまたは質問テーブルの外部キーにクラスタードインデックスを持っていた場合、挿入パフォーマンスが許容できると思いますか?私は、これがコメントが通常照会される方法のための最も速い読み取りパフォーマンスをもたらすと仮定しています。

クラスタ化インデックスは一意の列に予約する必要があることがよくありますが、問題のテーブルがこのインデックスで最も頻繁にクエリされた場合はどうなりますか?

答えて

2

クラスタ化インデックスは常に一意にしてください。大量の挿入があるテーブルでは、int identityのようなものが良い選択です。挿入されたページがメモリに格納されていることが多いためです。

クラスタ化されたインデックスを一意にしないと、SQL Serverがそれを行います。なぜなら、特定の行を探し出す必要があるからです。 uniquifierを維持することは何か費用がかかるでしょう。

したがって、コメントテーブルのクラスタードインデックスを投稿IDにしたい場合はどうすればいいでしょうか。これは、ポストのすべてのコメントを参照することが本当に速くなるため、すべての情報がディスク上の同じ領域にあるため、有用な場合があります。

問題はありませんが、それに複数の列を追加することで一意のインデックス作成:例:

create unique clustered index pk_comment(post_id, comment_id) 

をしかし...このインデックスを持つことは、あなたの指数は、もはや単調挿入のパフォーマンスに影響を与える可能性が増加しないことを意味します。ページ分割の量にも影響する可能性があります。

私は、それを単純にして、主キーをcomment_idにチャックして、必要に応じてアプリケーションをカバーしたインデックスに追加プロファイルすることを推奨します。データがディスク上にレイアウトされている根本的な方法が問題になる場合にのみ、問題を複雑にすることを検討する必要があります。

2

それが依存:(インデックスに残っすなわちスペース)フィルファクタに行

    • サイズ
    • テーブル上の非クラスタ化インデックスの数
    • 方法インデックスが再編成されることがよくあります(クラスタ化されたインデックスが単調に増加しているキーの場合はそれほど重要ではありません)。

    ベンチマークあなたの特定の状況のた​​めの箱。

  • +1

    忘れていない: サーバのCPU、メモリ、ディスク –

    関連する問題