공부/데이터베이스

INDEX SCAN vs INDEX SEEK

원클릭쓰리버그 2022. 3. 14. 20:19
728x90
USE Northwind;

-- 인덱스 접근 방식 (Access)
-- Index Scan vs Index Seek

CREATE TABLE TestAccess
(
	id INT NOT NULL,
	name NCHAR(50) NOT NULL,
	dummy NCHAR(1000) NULL,
);
GO

CREATE CLUSTERED INDEX TestAccess_CI
ON TestAccess(id);
Go

CREATE NONCLUSTERED INDEX TestAccess_NCI
ON TestAccess(name);
GO

DECLARE @i INT;
SET @i = 1;

WHILE(@I <= 500)
BEGIN 
	INSERT INTO TestAccess
	VALUES (@i, 'Name' + CONVERT(varchar,@i), 'Hello World'+ CONVERT(VARCHAR,@i));
	SET @i = @i+1;
END

--인덱스 정보
EXEC sp_helpindex 'TestAccess';
-- 인덱스 번호
SELECT index_id, name
FROM sys.indexes
WHERE object_id = object_id('TestAccess');
--조회
DBCC IND ('Northwind', 'TestAccess', 1);
DBCC IND ('Northwind', 'TestAccess', 2);


-- 논리적 읽기 -> 실제 데이터를 찾기 위해 페이지 수
SET STATISTICS TIME ON;
SET STATISTICS IO ON;

-- INDEX SCAN = LEAF PAGE 순차적으로 검색
SELECT* 
FROM TestAccess;


-- INDEX SEEK

-- CLUSTERED의 루트(1)에서 해당 ID(id = 104)로 접근(2)하여 데이터를 찾음.
SELECT*
FROM TestAccess
WHERE id = 104;


-- 찾는 과정. NONCLUSTERED의 루트(1)에서 해당 INDEX키 값에 접근(2)하여 CLUSTERED ID를 참고함.
-- 참고된 ID를 CLUSTERED의 루트(3)에서 해당 ID로 접근(4)하여 데이터를 찾음.
SELECT*
FROM TestAccess
WHERE name = 'name5';

-- INDEX SCAN + KEY LOOKUP
-- 정렬 기준(ORDER BY)가 name 이므로 NONCLUSTERED에서 4번에 걸쳐 처리한다. 4 * 5 = 20(최대값)
-- 만약 같은 테이블에 있다면, 논리적 읽기가 생략되므로 실제로는 20보다 적게 처리가 된다.

-->> 결론 INDEX SCAN이지만 꼭 나쁜건 아니다. 실제 논리적 읽기 수를 통해 효율성을 판단해야한다.
SELECT TOP 5 * 
FROM TestAccess
ORDER BY name;

'공부 > 데이터베이스' 카테고리의 다른 글

JOIN의 원리  (0) 2022.03.21
BookMark LoopUp  (0) 2022.03.14
Clustered VS Non-Clustered  (0) 2022.03.11
데이터베이스 세부 인덱스 확인 및 복합 인덱스  (0) 2022.03.09
윈도우 함수  (0) 2022.03.02