Статьи

Существуют ли различия между сканированием таблицы и сканированием индекса

Вступление

Как все мы знаем, разработчики предпочитают Index Seek в случае выполнения запроса, и мы все знаем, что такое Index Seek и как он повышает производительность. В этой статье мы не будем обсуждать поиск по индексу.

Сканирование таблицы выполняется на таблице, на которой нет индекса (кучи) — он просматривает строки в таблице, а сканирование индекса выполняется на индексированной таблице — самом индексе.

Здесь мы пытаемся обсудить определенный сценарий, связанный со сканированием таблиц и индексами.

Описание сценария

Предположим, у нас есть табличный объект без индекса. Имя табличного объекта — tbl_WithoutIndex, а другой табличный объект — tbl_WuthIndex.

 -- Heap Table Defination
IF OBJECT_ID(N'dbo.tbl_WithoutIndex', N'U') IS NOT NULL
  BEGIN
  DROP TABLE [dbo].[tbl_WithoutIndex];
  END
GO
CREATE TABLE [dbo].[tbl_WithoutIndex]
  (
  EMPID  INT  NOT NULL,
  EMPNAME  VARCHAR(50) NOT NULL
  );
GO
-- Insert Some Records
INSERT INTO  [dbo].[tbl_WithoutIndex]
  (EMPID, EMPNAME)
VALUES (101, 'Joydeep Das'),
  (102, 'Sukamal Jana'),
  (103, 'Ranajit Shinah');
GO 
-- Table with Index (Clustered Index for primary Key) 
IF OBJECT_ID(N'dbo.tbl_WithIndex', N'U') IS NOT NULL
  BEGIN
  DROP TABLE [dbo].[tbl_WithIndex];
  END
GO
CREATE TABLE [dbo].[tbl_WithIndex]
  (
  EMPID  INT  NOT NULL PRIMARY KEY,
  EMPNAME  VARCHAR(50) NOT NULL
  );
GO
-- Finding Index Name
sp_helpindex tbl_WithIndex;
index_name
index_description
index_keys
PK__tbl_With__14CCD97D3AD6B8E2

кластерный, уникальный первичный ключ, расположенный на ПЕРВИЧНОМ

EmpId
 -- Insert Some Records
INSERT INTO  [dbo].[tbl_WithIndex]
  (EMPID, EMPNAME)
VALUES (101, 'Joydeep Das'),
  (102, 'Sukamal Jana'),
  (103, 'Ranajit Shinah');
GO

Теперь мы собираемся сравнить результаты выполнения плана

 SELECT * FROM [dbo].[tbl_WithoutIndex];  

не имеет индекса (здесь я имею в виду кластеризованный индекс) таблица является кучей. Поэтому, когда мы помещаем оператор SELECT, сканируется вся таблица.

 SELECT * FROM [dbo].[tbl_WithIndex];

Здесь у таблицы есть ПЕРВИЧНЫЙ КЛЮЧ, поэтому он имеет кластерный индекс. Но здесь мы не помещаем столбцы индекса в предложение WHERE, поэтому происходит сканирование кластерного индекса.

Внимательное наблюдение за планом выполнения


Пожалуйста, помните, что таблица имеет небольшое количество записей.
Имя таблицы
Ориентировочная стоимость ввода-вывода
tbl_WithoutIndex
0.0032035
Tbl_WithIndex
0.003125

Если мы увидим оценочную стоимость операции , она будет одинаковой для обоих запросов ( 0,0032853 ).

Вопрос в мыслях

Здесь мы видим, что оценочная стоимость операции для обоих запросов одинакова. Итак, Вопрос в том, что если происходит сканирование индекса, мы можем удалить индекс и использовать кучу (в нашем случае). Так есть ли другая разница между ними?

Как они отличаются

Здесь мы понимаем, в чем внутренняя разница между сканированием таблиц и индексным сканированием.

Когда происходит сканирование таблицы, сервер MS SQL считывает все строки и столбцы в память. Когда происходит сканирование индекса, он будет читать все строки и только столбцы в индексе.

Эффекты в производительности

В случае производительности сканирование таблицы и сканирование индекса имеют одинаковый вывод, если мы используем одну инструкцию SELECT таблицы. Но это отличается в случае сканирования индекса, когда мы собираемся в таблицу JOIN.

Надеюсь, вам понравится.