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 |