2

私は次のテーブルスキーマを持っています-

CREATE TABLE [dbo].[TEST_TABLE]
(
    [TEST_TABLE_ID] [int] IDENTITY(1,1) NOT NULL,
    [NAME] [varchar](40) NULL,
    CONSTRAINT [PK_TEST_TABLE] PRIMARY KEY CLUSTERED 
    (
        [TEST_TABLE_ID] ASC
    )
)

に巨大なデータを挿入しましたTEST_TABLE

列を主キーとしてマークTEST_TABLE_IDしたので、クラスター化インデックスはに作成されTEST_TABLE_IDます。

次のクエリを実行しているとき、実行プランはClustered Index Scanどちらが期待されているかを示しています。

SELECT * FROM TEST_TABLE WHERE TEST_TABLE_ID = 34

しかし、次のクエリを実行しているとき、NAME列にはインデックスがないため、テーブルスキャンを期待していました。

SELECT * FROM TEST_TABLE WHERE NAME LIKE 'a%'

しかし、実行計画ではそれが表示されていClustered Index Scanます。

NAME列にはインデックスがないのに、なぜクラスター化インデックスにアクセスしているのですか?

これは、クラスター化されたインデックスがデータページに存在するために発生していると思います。

私の仮定が正しいかどうか誰かに教えてもらえますか?それとも他に理由がありますか?

4

5 に答える 5

3

クラスタ化インデックスは、すべてのテーブル データを格納するインデックスです。したがって、テーブル スキャンはクラスター化インデックス スキャンと同じです。

クラスター化インデックス (「ヒープ」) のないテーブルでは、テーブル スキャンですべてのデータ ページをクロールする必要があります。これが、クエリ オプティマイザが「テーブル スキャン」と呼ぶものです。

于 2012-09-27T06:24:58.133 に答える
3

他の人が既に説明したように、クラスター化されたインデックスを持つテーブルの場合、Clustered Index ScanTable Scanを意味します。

つまり、テーブルはクラスター化インデックスです。

あなたが間違っているのは、最初のクエリ実行計画です:

SELECT * 
FROM TEST_TABLE 
WHERE TEST_TABLE_ID = 34 ;

スキャンではなく、クラスター化インデックスのシークを行います。テーブル全体 (クラスター化インデックス) を検索 ( scan ) する必要はありません。ポイントに直接移動し ( seeks )、行がid=34存在するかどうかを確認します。

SQL-Fiddleでの簡単なテストと、2 つの実行計画の違いを確認できます。

于 2012-09-27T06:39:22.110 に答える
2

テーブルはクラスター化インデックスとして格納されます。テーブルをスキャンする唯一の方法は、クラスター化インデックスをスキャンすることです。クラスター化インデックスを持たないテーブルのみが、"テーブル スキャン" 自体を持つことができます。

于 2012-09-27T06:24:57.903 に答える
1

これは、このテーブルにクラスター化インデックスがあり、クラスター化インデックス全体をスキャンして、where 句に基づいてすべての行を返すためです。インデックスが見つからないというメッセージが表示されるはずです。

于 2012-09-27T06:30:50.663 に答える
0

テーブルにクラスター化インデックスを作成すると、SQL Server はクラスター化インデックス キー (この場合は Test_Table_ID) に基づいてそのテーブルの行を論理的に並べ替えます。

ただし、クラスター化インデックス スキャン オペレーターが表示されている場合、これは少し誤解を招く可能性があります。特定の条件が満たされている場合 (SQL Server がデータの順序を考慮していないことと同じ)、SQL Server は順序付けされていない割り当てスキャンを実行できます。これは、クラスター化インデックス スキャンよりもテーブル スキャンに似ています。インデックス内のポインターをたどるのではなく、IAM チェーンに基づいて、CI のリーフ レベル (テーブル データ ページ) を割り当て順に実際に読み取ります。これにより、断片化 (ページが物理的に乱れている状態) によってパフォーマンスが低下しないため、パフォーマンスが向上する可能性があります。

これが発生しているかどうかを確認するには、実行計画の Ordered プロパティを調べます。これが False に設定されている場合、順不同の割り当てスキャンが行われます。

于 2012-09-27T06:52:41.227 に答える