74

a もTable Scana もClustered Index Scan基本的にテーブル内のすべてのレコードをスキャンするのに、クラスター化インデックス スキャンの方が優れていると思われるのはなぜでしょうか?

例として、多くのレコードがある場合、次のパフォーマンスの違いは何ですか?:

declare @temp table(
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp

-----------------------------

declare @temp table(
    RowID int not null identity(1,1) primary key,
    SomeColumn varchar(50)
)

insert into @temp
select 'SomeVal'

select * from @temp
4

3 に答える 3

82

クラスタ化インデックスのないテーブル(ヒープテーブル)では、データページは相互にリンクされていないため、ページをトラバースするには、インデックス割り当てマップを検索する必要があります。

ただし、クラスター化されたテーブルでは、データページが二重にリンクされたリストにリンクされているため、シーケンシャルスキャンが少し高速になります。もちろん、その代わりに、、、、およびでデータページを順番に保持するためのオーバーヘッドがINSERTありUPDATEますDELETE。ただし、ヒープテーブルにはIAMへの2回目の書き込みが必要です。

クエリにRANGE演算子(例:)がある場合SELECT * FROM TABLE WHERE Id BETWEEN 1 AND 100、クラスター化されたテーブル(順序が保証されている)の方が効率的です。インデックスページを使用して関連するデータページを見つけることができるためです。ヒープは順序付けに依存できないため、すべての行をスキャンする必要があります。

そしてもちろん、クラスター化インデックスを使用すると、クラスター化インデックスシークを実行できます。これは、パフォーマンスに非常に最適です...インデックスのないヒープは、常にテーブルスキャンになります。

それで:

  • すべての行を選択するクエリの例では、唯一の違いは、クラスター化インデックスが維持する二重リンクリストです。これにより、クラスター化されたテーブルは、行数が多いヒープよりもほんの少し速くなります。

  • クラスタ化インデックスによって(少なくとも部分的に)満たすことができる句を含むクエリのWHERE場合、順序付けのために先に出てくるので、テーブル全体をスキャンする必要はありません。

  • クラスター化インデックスで満たされないクエリの場合、ほぼ均等です...繰り返しますが、唯一の違いは、順次スキャン用の二重リンクリストです。どちらの場合も、あなたは最適ではありません。

  • 、、およびヒープの場合、勝つかどうかはわかりませんINSERT。ヒープは順序を維持する必要はありませんが、IAMへの2回目の書き込みが必要です。相対的なパフォーマンスの違いはごくわずかだと思いますが、データにもかなり依存します。UPDATEDELETE

Microsoftには、クラスター化されたインデックスをヒープ上の同等の非クラスター化インデックスと比較するホワイトペーパーがあります(上記で説明したものとまったく同じではありませんが、近いです)。彼らの結論は、基本的にすべてのテーブルにクラスター化インデックスを配置することです。結果を要約するために最善を尽くします(ここでも、非クラスター化インデックスをクラスター化インデックスと実際に比較していることに注意してください。ただし、比較的比較可能だと思います)。

  • INSERTパフォーマンス:ヒープに必要な2回目の書き込みにより、クラスター化インデックスは約3%勝ちます。
  • UPDATEパフォーマンス:ヒープに必要な2回目のルックアップにより、クラスター化インデックスは約8%勝ちます。
  • DELETEパフォーマンス:ヒープのIAMからの2回目のルックアップと2回目の削除が必要なため、クラスター化されたインデックスは約18%勝ちます。
  • 単一のSELECTパフォーマンス:ヒープに必要な2回目のルックアップにより、クラスター化されたインデックスは約16%勝ちます。
  • 範囲のSELECTパフォーマンス:ヒープのランダムな順序により、クラスター化されたインデックスが約29%勝ちます。
  • 同時実行INSERT:クラスター化インデックスのページ分割により、負荷がかかった状態でヒープテーブルが30%勝ちます。
于 2008-08-20T21:32:33.960 に答える
4

http://msdn.microsoft.com/en-us/library/aa216840(SQL.80).aspx

Clustered Index Scan の論理演算子と物理演算子は、Argument 列で指定されたクラスター化インデックスをスキャンします。オプションの WHERE:() 述語が存在する場合、述語を満たす行のみが返されます。Argument 列に ORDERED 句が含まれている場合、クエリ プロセッサは、行の出力がクラスター化インデックスによって並べ替えられた順序で返されるように要求しています。ORDERED 句が存在しない場合、ストレージ エンジンは最適な方法でインデックスをスキャンします (出力が並べ替えられることは保証されません)。

http://msdn.microsoft.com/en-us/library/aa178416(SQL.80).aspx

Table Scan 論理および物理演算子は、Argument 列で指定されたテーブルからすべての行を取得します。Argument 列に WHERE:() 述語がある場合、述語を満たす行のみが返されます。

于 2008-08-20T20:54:30.073 に答える
-2

テーブル スキャンでは、テーブルのすべての行を調べる必要があります。クラスター化インデックス スキャンは、インデックスをスキャンするだけで済みます。テーブル内のすべてのレコードをスキャンするわけではありません。それがインデックスの要点です。

于 2008-08-20T20:44:58.130 に答える