Что означает" Кластеризованное сканирование индекса (Кластеризованное) " в плане выполнения SQL Server?

У меня есть запрос, который не удается выполнить с "не удалось выделить новую страницу для базы данных"TEMPDB" из-за недостаточного дискового пространства в файловой группе "по умолчанию"".

по пути устранения неполадок я изучаю план выполнения. Существует два дорогостоящих шага с надписью " Кластеризованное сканирование индекса (Clustered Index Scan)". Мне трудно понять, что это значит?

Я был бы признателен за любые объяснения "кластеризованного сканирования индекса (кластеризованного)" или предложения о том, где найти соответствующий документ?

4 ответов


Я был бы признателен за любые объяснения " кластеризованного сканирования индексов (Сгруппировавшись)"

я постараюсь поставить самым простым способом, для лучшего понимания вам нужно понять как поиск индекса, так и сканирование.

Итак, давайте построим таблицу

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 server использует B-дерево структура индекса, который нужно искать сразу к соответствовать записи

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

ваши запрошенные строки непосредственно в запросе, поэтому u получил кластеризованный индекс .

сканирование кластеризованного индекса: когда Sql server считывает строки сверху вниз в кластеризованном индексе. например, поиск данных в столбце non key. В нашей таблице NAME не является ключевым столбцом, поэтому, если мы будем искать некоторые данные в столбце name, мы увидим кластеризованный индекс, потому что все строки находятся на уровне листа кластеризованного индекса.

пример

select * from scanseek where name = 'Name340'

enter image description here

обратите внимание: я сделал этот ответ сокращенно для лучшего понимания только, если у вас есть какие-либо вопросы или предложения, пожалуйста, прокомментируйте ниже.


расширяя ответ Гордона в комментариях, сканирование кластеризованного индекса сканирует один из индексов таблиц, чтобы найти значения, которые вы делаете фильтр предложения where, или для соединения со следующей таблицей в плане запроса.

таблицы могут иметь несколько индексов (один кластеризованный и много некластеризованных), и SQL Server будет искать соответствующий на основе выполняемого фильтра или соединения.

Кластеризованных Индексов объясняются довольно хорошо на MSDN. Этот ключевое различие между кластеризованными и некластеризованными заключается в том, что кластеризованный индекс определяет способ хранения строк на диске.

Если ваш кластеризованный индекс очень дорог для поиска из-за количества записей, вы можете добавить некластеризованный индекс в таблицу для полей, которые вы часто ищете, таких как поля даты, используемые для фильтрации диапазонов записей.


кластеризованный индекс-это тот, в котором терминальный (листовой) узел индекса является фактической страницей данных. Для каждой таблицы может быть только один кластеризованный индекс, поскольку он определяет порядок расположения записей на странице данных. Обычно (и за некоторыми исключениями) он считается наиболее эффективным типом индекса (в первую очередь потому, что до получения фактической записи данных меньше одного уровня косвенности).

"кластеризованное сканирование индекса" означает, что SQL engine обход кластеризованного индекса в поисках определенного значения (или набора значений). Это один из наиболее эффективных методов поиска записи (удар по "кластеризованному индексу поиска", в котором SQL Engine ищет соответствие одному выбранному значению).

сообщение об ошибке не имеет ничего общего с планом запроса. Это просто означает, что у вас нет места на TempDB.


при наведении указателя мыши на шаг в плане запроса SSMS отображает описание того, что делает шаг. Это даст вам базовое представление о" Кластеризованном сканировании индекса (Кластеризованном) " и всех других шагах.