web-dev-qa-db-ja.com

SQL Server実行計画で「クラスター化インデックススキャン(クラスター化)」とはどういう意味ですか?

「ファイルグループ 'DEFAULT'のディスク領域が不足しているため、データベース 'TEMPDB'に新しいページを割り当てることができませんでした」というクエリを実行できません。

トラブルシューティングの途中で、実行計画を検討しています。 「クラスター化インデックススキャン(クラスター化)」というラベルの付いた2つのコストの高いステップがあります。私はこれが何を意味するのかを知るのに苦労していますか?

「クラスター化インデックススキャン(クラスター化)」の説明、または関連ドキュメントの場所に関する提案をいただければ幸いです。

23
Bin

「クラスター化インデックススキャン(クラスター化)」の説明をいただければ幸いです。

理解を深めるために、インデックスシークとスキャンの両方を理解する必要がある最も簡単な方法で説明します。

それではテーブルを構築しましょう

use tempdb GO


create table scanseek  (id  int , name varchar(50) default ('some random names')  )

create clustered index IX_ID_scanseek on scanseek(ID)


declare @i int
SET @i = 0
while (@i <5000)
begin 
insert into scanseek
select @i, 'Name' + convert( varchar(5) ,@i)
set @i =@i+1
END

インデックスシークでは、SQLサーバーがインデックスの b-tree 構造を使用して、一致するレコードを直接シークします

enter image description here

以下のDMVを使用して、テーブルのルートノードとリーフノードを確認できます。

-- check index level 
SELECT 
index_level
,record_count
,page_count

,avg_record_size_in_bytes
FROM sys.dm_db_index_physical_stats(DB_ID('tempdb'),OBJECT_ID('scanseek'),NULL,NULL,'DETAILED')
GO

ここで、列「ID」にクラスター化インデックスがあります

いくつかの直接一致するレコードを検索できます

select * from scanseek where id =340

実行計画を見てください

enter image description here

クエリで行を直接要求したため、クラスター化インデックスSEEKを取得しました。

クラスタ化インデックススキャン:SQLサーバがクラスタ化インデックスの行を上から下に読み通すとき。たとえば、非キー列のデータを検索します。テーブルのNAMEは非キー列なので、名前列でデータを検索するとclustered index scanすべての行がクラスター化インデックスリーフレベルにあるため。

select * from scanseek where name = 'Name340'

enter image description here

注:この回答は、理解を深めるためだけに短くしました。質問や提案がある場合は、以下にコメントしてください。

43

コメントでのGordonの回答を拡張すると、クラスター化インデックススキャンは、テーブルインデックスの1つをスキャンして、where句フィルターを実行している値、またはクエリプランの次のテーブルへの結合を実行している値を見つけます。

テーブルには複数のインデックス(1つはクラスター化され、多くは非クラスター化)を持つことができ、SQL Serverは実行されているフィルターまたは結合に基づいて適切なインデックスを検索します。

クラスター化インデックス は、MSDNで非常によく説明されています。クラスター化クラスターと非クラスター化の主な違いは、クラスター化インデックスが行をディスクに格納する方法を定義することです。

レコードの数が原因でクラスター化インデックスの検索に非常にコストがかかる場合は、レコードの範囲のフィルター処理に使用される日付フィールドなど、頻繁に検索するフィールドの非クラスター化インデックスをテーブルに追加できます。

5
Martin Noreke

クラスター化インデックスは、インデックスのターミナル(リーフ)ノードが実際のデータページ自体であるインデックスです。データページ内でのレコードの配置方法を指定するため、テーブルごとにクラスター化インデックスは1つだけ存在できます。一般的に(およびいくつかの例外を除いて)最もパフォーマンスの高いインデックスタイプと見なされます(主に、実際のデータレコードに到達する前に間接レベルが1つ少ないため)。

「クラスター化インデックススキャン」とは、特定の値(または値のセット)を検索するために、SQLエンジンがクラスター化インデックスを走査することを意味します。これは、レコードを見つけるための最も効率的な方法の1つです(SQLエンジンが単一の選択された値と一致することを探している「クラスター化インデックスシーク」によるビート)。

エラーメッセージは、クエリプランとはまったく関係ありません。これは、TempDBのスペースが不足していることを意味します。

3
Curt

クエリプランのステップにカーソルを合わせると、SSMSはそのステップの実行内容の説明を表示します。これにより、「クラスター化インデックススキャン(クラスター化)」および関連する他のすべての手順のベースラインを理解できます。

0
Edward Brey