2016-03-30 16 views
0

クラスタ化インデックスはテーブル内のデータの物理的な順序を決定することを理解しました。レコードの物理的順序をチェックするために2つの一時テーブルを作成しました。インデックス作成と実行プラン

CREATE TABLE #My_table_1 
    (
    ID INT, 
    COL1 INT, 
    COL2 VARCHAR(20) UNIQUE, 
    COL3 VARCHAR(20) 
); 

CREATE CLUSTERED INDEX IX_Employee 
    ON #My_table_1 (ID, COL1 DESC) 

INSERT INTO #My_table_1 VALUES (1,10,'10','10'); 
INSERT INTO #My_table_1 VALUES (2,520,'20','10'); 
INSERT INTO #My_table_1 VALUES (3,50,'30','10'); 
INSERT INTO #My_table_1 VALUES (5,55,'65','10');  
INSERT INTO #My_table_1 VALUES (1,5,'100','10');    
INSERT INTO #My_table_1 VALUES (3,300,'50','10'); 
INSERT INTO #My_table_1 VALUES (3,40,'5','10'); 
INSERT INTO #My_table_1 VALUES (1,15,'4','10'); 
INSERT INTO #My_table_1 VALUES (5,100,'56','10'); 

CREATE TABLE #My_table_2 
    (
    ID INT, 
    COL1 INT, 
    COL2 VARCHAR(20) UNIQUE, 
) 

CREATE CLUSTERED INDEX IX_Employee 
    ON #My_table_2 (ID, COL1 DESC) --Creating a CLUSTERED INDEX on columns ID,COL1 

INSERT INTO #My_table_2 VALUES (1,10,'10'); 
INSERT INTO #My_table_2 VALUES (2,520,'20'); 
INSERT INTO #My_table_2 VALUES (3,50,'30'); 
INSERT INTO #My_table_2 VALUES (5,55,'65'); 
INSERT INTO #My_table_2 VALUES (1,5,'100');   
INSERT INTO #My_table_2 VALUES (3,300,'50'); 
INSERT INTO #My_table_2 VALUES (3,40,'5'); 
INSERT INTO #My_table_2 VALUES (1,15,'4'); 
INSERT INTO #My_table_2 VALUES (5,100,'56'); 

私は両方のテーブルをクエリとして、私はレコードの順序が両方のテーブルで異なることがわかりました。それはなぜそうですか? Selection_Order 私は実行計画を確認しました。クエリの実行計画が異なるからです。 Execution Plan 誰も説明することができます、なぜそれが起こっている?クラスタ化インデックスについての私の理解が間違っているかどうか?

+4

注文をどのように決定しましたか? selectはあなたに注文を与えないので、SQL Serverが適切であると見なして結果を注文します。あなたが注文をしたい場合は、order by節を追加してください。 – TomTom

答えて

2

私はクラスター化されたインデックスについてのあなたの理解が上にあると信じています。ここでは、SQL Serverのオプティマイザ、統計情報、および注文について理解しています。

クエリオプティマイザは、より良い方法があると判断した場合、インデックス(ヒントインデックス)を無視して自由に感じます。そのより良い方法は、データの選択性、データの種類、表のサイズ、列の数などさまざまな情報を使用して決定されます。クラスター化された索引の場合でも、指定されたデータのみが索引に保持されます。まだデータの残りの列に対してルックアップが発生している必要があります。これらの個々の列のデータをルックアップするというだけでなく、テーブルスキャンを実行するコストはいくらですか?

最後に、そのデータはどのような順序でも返されるとは限りません。クラスタ化インデックスが使用されているときに偶然一致する可能性がありますが、それは意図的ではありません。副作用です。既知の順序付けられた方法でデータを返す唯一の方法は、ORDER BYを使用することです。

関連する問題