私は最近、方法clustered index
とnon-clustered index
仕組みについて読んでいます。簡単な言葉での私の理解(間違っている場合は修正してください):
clustered
裏打ちされnon-clustered index
たデータ構造B-Tree
Clustered Index
: インデックス列 (またはキー) に基づいてデータを物理的に並べ替えます。clustered Index
ごとに 1 つだけ持つことができますtable
。index
テーブルの作成時にno が指定された場合、SQL
サーバーは自動的に に を作成しclustered Index
ますprimary key column
。
Q1 : データはインデックスに基づいて物理的にソートされているため、ここに余分なスペースは必要ありません。これは正しいです?作成したインデックスを削除するとどうなりますか?
Non-clustered Index
: ではnon-clustered indexes
、leaf-node
ツリーの には、列の値と、データベース内の実際の行へのポインター (行ロケーター) が含まれています。non-clustered index table
これを物理的にディスクに格納するために余分なスペースが必要です。ただし、1本は数に限りません。non-clustered Indexes.
Q2 : 非クラスター化インデックス列に対するクエリでは、並べ替えられたデータが得られないということですか?
Q3 : リーフ ノードのポインタを使用して実際の行データを見つけるために、ここに関連付けられた追加のルックアップがあります。クラスター化インデックスと比較した場合、これはどの程度のパフォーマンスの違いになりますか?
演習:
Employee テーブルを考えてみましょう:
CREATE TABLE Employee
(
PersonID int PRIMARY KEY,
Name varchar(255),
age int,
salary int
);
ここで、employee テーブルを作成しました (employee のデフォルトのクラスター化インデックスが作成されます)。
このテーブルに対する 2 つの頻繁なクエリは、年齢列と給与列でのみ発生します。簡単にするために、テーブルが頻繁に更新されないと仮定しましょう
例えば:
select * from employee where age > XXX;
select * from employee where salary > XXXX and salary < YYYY;
Q4 : インデックスを構築する最良の方法は何ですか。これらの両方の列に対するクエリのパフォーマンスが同様になります。age 列の age クエリにクラスター化インデックスがある場合、age 列のクエリは高速になりますが、salary 列よりも遅くなります。
Q5 : 関連するメモとして、一意の制約を持つ列にインデックス (クラスター化されたインデックスとクラスター化されていないインデックスの両方) を作成する必要があることを繰り返し見てきました。何故ですか?これを怠るとどうなりますか?
どうもありがとうございました。私が読んだ投稿は次のとおりです。
http://msdn.microsoft.com/en-us/library/ms190457.aspx
クラスター化インデックスと非クラスター化インデックスの実際の意味は何ですか?