(ID、シーケンス、NEWSEQUENTIALIDのような)順次キーと(NEWIDや独自のランダム化されたキージェネレータのような)順不同キーの使用に関して、考慮すべきいくつかの側面があります。
順次キーから始まり、すべての行がインデックスの右端に移動します。ページがいっぱいになると、SQL Serverは新しいページを割り当てて塗りつぶします。この結果、索引の断片化が少なくなり、読取りパフォーマンスには有益です。また、単一のセッションでデータがロードされ、データが単一のドライブまたは少数のドライブに存在する場合、挿入が高速になります。
しかし、多くのスピンドルを持つハイエンドのストレージサブシステムでは、状況が異なる可能性があります。複数のセッションからデータをロードすると、ページ・ラッチの競合(ラッチはデータベース・ページへのアクセスを同期するために使用されるオブジェクトです)が、インデックス・リーフ・レベルのリンク・リストの右端のページで終了します。このボトルネックは、ストレージ・サブシステムのフル・スループットの使用を防ぎます。 シーケンシャルキーを使用して数値キーを使用する場合は、常に範囲内の最小値で開始して、範囲全体を使用することができます。たとえば、INT型で1で始まるのではなく、-2,147,483,648で始めることができます。
NEWIDで生成されたランダムなキーやカスタムソリューションなど、非順次的なキーを検討してください。既にフルページに行を強制しようとすると、SQL Serverは従来のページ分割を実行します。新しいページが割り当てられ、元のページの半分が新しいページに移動されます。ページ分割にはコストがかかり、インデックスの断片化が発生します。索引の断片化は、読取りのパフォーマンスに悪影響を及ぼす可能性があります。ただし、挿入パフォーマンスに関して、ストレージサブシステムに多数のスピンドルが含まれていて、複数のセッションからデータをロードしている場合、スプリットにもかかわらず、ランダム順序は実際にはシーケンシャルよりも優れています。
インデックスの右端にホットスポットがなく、ストレージサブシステムの のスループットを向上させるためです。この戦略を示すベンチマークの良い例は、Thomas Kejserのブログ、http://blog.kejser.org/2011/10/05/boosting-insert-speed-by-generating-scalable-keys/にあります。
出典: クエリのMicrosoft® SQLServer®の2012 試験70から461 トレーニングキット
えっ?それらが連続して生成される場合、GUIDのようなものではなく、生成されたGUIDが実際にユニークであることをguarneteedにすることができますか? – Justin
@Justing - GUIDが一意であるという保証はありません。 –
リンクは揮発性です... Fotia now 404sは答えのリンクです。 –