1. ホーム
  2. sql

[解決済み] SQL Serverの実行プランで「クラスター化インデックススキャン(クラスター化)」が意味するものは?

2022-03-10 19:54:44

質問

ファイルグループ 'DEFAULT' のディスク容量が不足しているため、データベース 'TEMPDB' に新しいページを割り当てることができませんでした」と表示されて実行できないクエリがあります。

トラブルシューティングの途中で、実行計画を調べています。Clustered Index Scan (Clustered) "と書かれたコストのかかるステップが2つあります。私はこれが何を意味するのか見つけるのに苦労しています?

Clustered Index Scan (Clustered) "の説明や、関連ドキュメントの場所を教えていただけませんか?

どのように解決するのですか?

<ブロッククオート

クラスタ化インデックススキャンについて教えてください。 (クラスター化)"。

インデックスシークとスキャンの両方を理解する必要があるため、分かりやすく説明します。

では、テーブルを作りましょう

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-ツリー の構造から、一致するレコードを直接探すことができます。

テーブルのルートとリーフノードは、以下の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

そして実行計画を見てください

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

クラスター化インデックススキャン。 Sql サーバーがクラスタ化インデックス内の行を上から下へ読み取るとき。 例えば、非キーカラムのデータを検索する場合。このテーブルでは、NAMEは非キーカラムなので、NAMEカラムのデータを検索すると、次のようになります。 clustered index scan なぜなら、すべての行はクラスタ化インデックスのリーフレベルにあるからです。

select * from scanseek where name = 'Name340'

注意:この回答は理解を深めるために短くまとめました。もし何か質問や提案があれば、以下にコメントしてください。