2009-06-25 14 views

答えて

27

実際には関係ありませんが、DateTimeは本当にユニークであることが保証されていますか?私は、DateTimeにクラスタード・インデックスを置くことを避けます。代わりにINT IDENTITYまたはBIGINT IDENTITYを使用し、DateTimeに通常のクラスター化されていないインデックスを配置します(これは本当にユニークであることは保証されていません......)

マルク・

PS:主キーと同じように、クラスタ化されたキーがどうあるべきかについての一般的なコンセンサスがある:

  • ユニーク(そうでない場合はSQL Serverは、4-を追加することで、 "uniquify" 意志それに対するバイトのユニファイア)
  • 狭いこれまで静的(変更はありません)
  • 可能な限り(つまり4バイトuniqueifier含む)クラスタ化キーを構成する列(複数可)に追加され

を増やしますクラスタリングされていないすべてのインデックスのすべてのエントリ - できるだけ細いものを保持したい。

PS 2:非クラスタ化インデックスに検索値が見つかると、SQL Serverがすべての行を取得するため、クラスタ化キーが各非クラスタ化インデックスに追加されます。これはデータベースの行の「場所」です。したがって、ユニークで、が狭いである必要があります。

+0

クラスタ化インデックスは一意である必要がありますか? – Eyvind

+4

もしそれが*ユニークでないならば、SQL Serverは自動的に4バイトの "ユニーク化"を追加します - もし可能であれば、それを避けてください! –

+1

ありがとう、それを知らなかった。だから、問題のテーブルが一意の識別子であるPKを持っているなら、日時フィールドとPKにクラスタ化インデックスを作成するほうがよいでしょうか? – Eyvind

5

読めば、このhttp://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx

を読むには、しばしば日時フィールドに基づいて、良い選択は、日付とアイデンティティの複合キーであるた - の順(日付、アイデンティティ)で。

+3

複合クラスターキーの最初のフィールドとしてDateTimeを実際に持たせることがどれほど役立つかを強調することはできません。最後に1時間以内にログエントリを常に照会している場合、問題は主キーの一部としてDateTimeを持つことに役立ちます。特に、DateTimeフィールドが95%未満の選択性(非ユニークな値がたくさんあることを意味します)が、インデックスをヒットし、期待するパフォーマンスを得る方法です。 – AndyClaw

関連する問題