OLTPシステムのキーおよびクラスターとしてのGUIDには何の問題もありません(クラスターのサイズの増加に悩まされるインデックスがテーブルにたくさんある場合を除く)。実際、IDENTITY列よりもはるかにスケーラブルです。
GUIDはSQL Serverの大きな問題であると広く信じられています。主に、これはまったく間違っています。実際、GUIDは、約8コア以上のボックスで大幅に拡張可能です。
申し訳ありませんが、開発者は正しいです。GUIDを心配する前に、他のことを心配してください。
ああ、最後に:そもそもなぜクラスターインデックスが必要なのですか?懸念事項が多数の小さなインデックスを持つOLTPシステムである場合は、ヒープを使用する方が適切です。
次に、GUIDが導入する断片化が読み取りにどのような影響を与えるかを考えてみましょう。フラグメンテーションには3つの大きな問題があります。
- ページ分割にはディスクI / Oがかかります
- 半分のフルページは、フルページほどメモリ効率が良くない
- ページが順番どおりに保存されないため、シーケンシャルI / Oの可能性が低くなります
質問での懸念はスケーラビリティに関するものであるため、「ハードウェアを追加するとシステムが高速化する」と定義できるため、これらは最小の問題です。それぞれに順番に対処するには
広告1)スケールが必要な場合は、I / Oを購入する余裕があります。安価なSamsung / Intel 512GB SSD(数米ドル/ GB)でも、10万IOPSをはるかに超えます。2ソケットシステムですぐに消費することはありません。そして、あなたがそれに出くわすなら、もう1つを買うとあなたは設定されています
広告2)テーブルで削除を行うと、とにかくページが半分になります。たとえそうでなくても、メモリは安価であり、最大のOLTPシステムを除くすべてのシステムにとって、ホットデータはそこに収まるはずです。より多くのデータをページにパックすることは、スケールを探しているときに最適化されていません。
広告3)頻繁にページ分割され、非常に断片化されたデータで構築されたテーブルは、連続して入力されたテーブルとまったく同じ速度でランダムI / Oを実行します
参加に関しては、OLTPのようなワークロードのような2つの主要な参加タイプがあります。ハッシュとループです。それぞれを順番に見てみましょう。
ハッシュ結合:ハッシュ結合は、小さなテーブルがスキャンされ、通常は大きなテーブルが検索されることを前提としています。小さなテーブルはメモリ内にある可能性が非常に高いため、ここではI / Oを心配する必要はありません。シークは、断片化されたインデックスと非断片化されたインデックスのコストが同じであるという事実に既に触れました。
ループ結合:外部テーブルが検索されます。同じ費用
また、多くの不適切なテーブルスキャンが実行されている可能性がありますが、GUIDは再び問題ではなく、適切なインデックス作成が重要です。
現在、正当な範囲スキャンが行われている場合があり(特に外部キーを結合する場合)、この場合、断片化されていないデータに比べて断片化されたデータの「パック」が少なくなります。しかし、3NFデータが適切にインデックス付けされている場合に表示される可能性のある結合は次のとおりです。
参照するテーブルの主キーへの外部キー参照を持つテーブルからの結合
逆に
広告1)この場合、主キーへの1回のシークを行います-nを1に結合します。断片化の有無、同じコスト(1シーク)
広告2)この場合、同じキーに参加していますが、複数の行を取得できます(範囲シーク)。この場合の結合は1対nです。ただし、探している外部テーブルは、同じキーを探しています。これは、断片化されていないインデックスと同じように、断片化されたインデックスの同じページにある可能性があります。
これらの外部キーについて少し考えてみましょう。主キーを「完全に」シーケンシャルに配置した場合でも、そのキーを指すものはすべて非シーケンシャルです。
もちろん、お金が安くてプロセスが高い銀行のあるSANの仮想マシンで実行している場合があります。その後、このアドバイスはすべて失われます。しかし、それがあなたの世界である場合、スケーラビリティはおそらくあなたが探しているものではありません-あなたはパフォーマンスと高速/コストを探しています-これらは両方とも異なっています。