SQL Azureにクラスター化インデックスが必要な理由

SQL Azureのテーブルにデータを追加するには、クラスター化インデックスが必要です。クラスター化インデックスが無いテーブルにデータを追加しようとすると、エラーが発生しデータを追加することができません。SQL Serverには、そのような制限はありません。

なぜ、SQL Azureには、そのような制限があるのでしょうか。

SQL Azureのデータベース高可用性

SQL Azure上で動作するデータベースのインスタンスはレプリカと呼ばれます。

同時に、起動している1つのデータベースには、3つのレプリカが存在します。
一つ目のレプリカは、プライマリレプリカと見なされます。全ての読み書きをするクエリはプライマリレプリカに発行されます。
他の二つのレプリカはセカンダリと見なされます。
プライマリレプリカに書き込まれたデータは、セカンダリレプリカに書き込まれます。もしプライマリレプリカが落ちた場合、ロードバランサーが起動し、セカンダリレプリカをプライマリレプリカへ昇格させます、

それぞれのレプリカは、別々のラックに分かれた異なる物理マシン上に配置されます。

20101031155604
(引用:マイクロソフト 勉強会キット: SQL Azure の管理とセキュリティ 2010年10月版 V1.1 )

 

SQL Azureのレプリケーション技術

SQL Azureで使用しているレプリケーション技術にクラスター化インデックスを使用しています。

トランザクションをコミットする前に、プライマリレプリカと、一つのセカンダリレプリカに(コミットされた)データの書き込みが行われます。データ行は、3つのレプリカすべて同じリーフノードに存在します。つまり、データページは、3つのレプリカで同じ場所に存在することになります。

 

クラスター化インデックス

SQL ServerとSQL Azureでは、クラスター化インデックスは、B-Tree構造で構成されます。B-Tree構想では、それぞれのページは、インデックスノードに存在します。

B-Treeの一番上のノードが、ルートノードです。

B-Treeの最下層のノードが、リーフノードです。

ルートノードと、リーフノードの間には、複数の中間ノードが存在します。

20101031160816

クラスター化インデックスは、リーフノードにテーブルのデータページを含んでいます。ルートノードと中間ノードは、インデックスページとインデックス行を含んでいます。インデックス行は、Key Valuesとポインターを保持します。

参考に、クラスター化インデックスと非クラスター化インデックスを簡易的に図侍したものを下に掲載します。リーフノードで実際のデータを保持しているのが、クラスター化インデックスです。

20101031161113

20101031161154 

クラスター化インデックスの時と、非クラスター化インデックスの時とで、データの持ち方が異なっていることがわかると思います。クラスター化インデックスの時は、実データがクラスター化インデックスに従って並べ替えが行われます。

クラスター化インデックスが無いとき、データは特定の順番には並ばないのです。(詳細は、ヒープ構造を参照)

 

なぜ、SQL Azureにクラスター化インデックスが必要なのか

SQL Azureでは、データページの並び順がデータレプリケーションのキーとなっているので、クラスター化インデックスが必要なのです。データ書き込みが行われるとき、プライマリレプリカにデータ書き込みが行われるリーフノードと、まったく同じリーフノードをセカンダリレプリカのリーフノードに書き込みが行われる動作をしています。

クラスター化インデックスが無いと、レプリケーションできない仕様になっている為、データを保持するテーブルには、クラスター化インデックスが必要になります。

 

参考