「増分キーに基づいたクラスター化インデックスの作成を避ける」ことは、SQL Server 2000日からの神話ですか?


22

私たちのデータベースは多くのテーブルで構成されており、そのほとんどは整数の代理キーを主キーとして使用しています。これらの主キーの約半分はID列にあります。

データベース開発は、SQL Server 6.0の時代に始まりました。

これらのインデックス最適化のヒントにあるように、最初から続いているルールの1つは、増分キーに基づいてクラスター化インデックスを作成しないことです。

現在、SQL Server 2005とSQL Server 2008を使用して、状況が変わったという強い印象を持っています。一方、これらの主キー列は、テーブルのクラスター化インデックスの完全な最初の候補です。

回答:


34

神話は、行レベルのロック追加した SQL Server 6.5以前に遡ります。そして、カレン・デラニーによってここでほのめかされました。

これは、データページ使用の「ホットスポット」と、挿入された行ではなく、2kページ全体(SQL Server 7以降は8kページを使用)がロックされたという事実に関係していました。

Kimberly L. Trippによる信頼できる記事が見つかりました

「クラスター化インデックスの議論は続く...」

ホットスポットは、ページレベルのロックのためにSQL Server 7.0よりも前に回避しようとしたものです(これがホットスポットという用語が否定的な用語になった場所です)。実際、否定的な用語である必要はありません。ただし、ストレージエンジンは(SQL Server 7.0で)再設計/再設計され、真の行レベルロックが含まれるようになったため、(ホットスポットを避けるための)この動機はなくなりました。

編集、2013年5月

lucky7_2000の答えのリンクは、ホットスポットが存在し、問題を引き起こす可能性があると言っているようです。ただし、この記事ではTranTimeで一意でないクラスター化インデックスを使用しています。これには、uniquifierを追加する必要があります。これは、インデックスが厳密に単調に増加しない(および幅が広すぎる)ことを意味します。その回答のリンクは、この回答または私のリンクと矛盾していません

個人的なレベルでは、クラスター化されたPKとしてbigint IDENTITY列を持つテーブルに毎秒数万行を挿入したデータベースで目覚めました。


23

要約すると、最近のSQL Serverバージョンでは、ID列のクラスター化されたキーが最近の推奨オプションです。


短く、シンプルで、これで私の+1が得られます。SQLSkillsへのリンクを確認してください。豊富な情報があります。
-AndrewSQL

12
これはコマンドのように聞こえます。なぜそうすべきについての説明や論理はありません
...-gbn

コマンドのように聞こえるだけでなく、間違っています。連続キーを使用すると、1秒あたり非常に大量の挿入を行うデータベースでホットスポットの問題が発生します。
トーマスケイサー

1
必須ではありませんが、好ましいと言いました。世界のデータベースの98%を構成する通常のアプリケーションでは、ID列のクラスター化キーは正常に機能します。
mrdenny

10

Kimberly Trippには、このトピックに関する素晴らしいブログ投稿があります。私は言い換えることができますが、私を信じて、私はそれを正しません。読んでください。 http://www.sqlskills.com/BLOGS/KIMBERLY/post/Ever-increasing-clustering-key-the-Clustered-Index-Debateagain!.aspx

そこにいる間、キーのクラスタリングのトピックに関する彼女の他の投稿をチェックしてください。彼女のサイトから得られる豊富な知識があります。


4

この投稿を確認してください:

http://blogs.msdn.com/b/sqlserverfaq/archive/2010/05/27/monotonically-increasing-clustered-index-keys-can-cause-latch-contention.aspx

増分キーに基づいてクラスター化インデックスを作成すると、パフォーマンスに悪いホットスポットが作成される場合があります...


1
そのリンクを与えるための+1。そこにはいくつかの興味深いヒントがあります。ただし、指定されたシナリオを、tblTransactions(TranTime)で非クラスター化インデックスcidx_trantimeを作成するシナリオまたは他のシナリオと比較した場合、結果ははるかに説得力があると思います。このような大量のデータを生成する場合、データを取得する効率的な方法が必要であることに注意してください。すべてをヒープに投入することはできません。
bernd_k

@bernd_k:これは貧弱なリンク例です。子テーブルには、内部一意修飾子を必要とする不正な非一意のクラスター化キーがあります
-gbn

1
次に、この実験を試してください:kejser.org/boosting-insert-speed-by-generated-scalable-keys
Thomas Kejser
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.