테이블에 데이터 삽입
INSERT INTO Product VALUES (1, 'Fellowship of the Rings', 25000, 'Book of Legend', 1)
INSERT INTO Category VALUES(1, 'Novel'), (2, 'Science')
데이터 조회
SELECT * FROM Category
SELECT * FROM Product
테이블의 인덱스 정보 조회
SELECT t.name, i.name, i.index_id, i.type, i.type_desc
FROM sys.tables t
INNER JOIN sys.indexes i
ON t.object_id = i.object_id
WHERE t.name = 'Product'
SELECT t.name, i.name, i.index_id, i.type, i.type_desc
- t.name → 테이블 이름
- i.name → 인덱스 이름 (해당 테이블의 특정 인덱스)
- i.index_id → 인덱스 ID (각 인덱스의 고유 식별자)
- i.type → 인덱스 유형 (숫자 값) (1: Clustered, 2: Nonclustered, 3: XML 등)
- i.type_desc → 인덱스 유형 설명 (CLUSTERED, NONCLUSTERED, FULLTEXT 등)
FROM sys.tables t
INNER JOIN sys.indexes i
ON t.object_id = i.object_id
테이블 정보(sys.tables)와 인덱스 정보(sys.indexes)를 조인
- sys.tables t: 데이터베이스에 존재하는 모든 테이블 정보를 저장하는 시스템 뷰
- sys.indexes i: 모든 인덱스 정보를 저장하는 시스템 뷰
- ON t.object_id = i.object_id: sys.tables의 object_id(각 테이블의 고유 ID)와 sys.indexes의 object_id(각 테이블에 속한 인덱스의 고유 ID)를 매칭하여 JOIN→ 즉, 각 테이블이 가진 인덱스 정보를 가져오는 역할
WHERE t.name = 'Product';
- HERE t.name = 'Product' 조건을 추가하여 Product 테이블의 인덱스만 조회
- 만약 WHERE 절이 없으면 모든 테이블의 인덱스를 조회
테이블의 데이터 확인
SELECT * FROM Product;
SELECT * FROM Product WITH (INDEX(idx_product_categoryno))
Product 테이블에서 특정 인덱스(idx_product_categoryno)를 강제적으로 사용하여 조회한다.
💭 왜 인덱스를 강제 지정할까?
✅ 자동 선택이 비효율적일 때
- SQL Server의 자동 최적화가 최적의 인덱스를 선택하지 못할 수도 있음
- 특정 인덱스를 수동으로 지정하여 성능을 향상시킬 수 있음
✅ 카디널리티(중복도)가 낮은 열을 빠르게 조회할 때
- CategoryNo처럼 중복이 적은 열에 인덱스를 설정하면 검색 속도가 빨라짐
- 인덱스를 활용하면 테이블 전체를 조회(FULL SCAN)하지 않고 빠르게 검색 가능
✅ 테스트 및 튜닝을 위해
- WITH(INDEX(idx_product_categoryno))를 사용하면 실제 해당 인덱스가 유용한지 확인 가능
- 실행 계획(Query Plan)을 분석하여 인덱스 활용 여부를 평가
🚀 인덱스 강제 적용의 효과
- 빠른 검색: CategoryNo에 대한 인덱스를 활용하면 특정 CategoryNo를 기준으로 조회할 때 성능 향상 가능
- 실행 계획 튜닝 가능: SQL Server가 예상과 다르게 최적의 인덱스를 선택하지 않을 때 수동 지정하여 테스트 가능
- 유지보수 주의: 강제 인덱스를 사용하면 향후 인덱스 구조가 변경될 경우 오류 가능성이 있음
댓글