DataBase/MSSQL

인덱스의 개념과 성능이 향상되는 이유/유의사항 (With SSMS)

범데이 2024. 9. 19. 23:57
728x90

 

 

 

실제 현업에서 몇억 개의 row를 가진 테이블에 적절한 인덱스를 추가했더니, 조회 시간이 수십 초에서 몇 초 이내로 대폭 감소한 경험이 있었다.

 

이런 현상은 대용량 데이터베이스 성능 최적화의 대표적인 사례로, 인덱스가 어떻게 데이터베이스에서 성능을 향상시키는지 보여준다.

 

이번 포스팅에서는 인덱스의 개념과 성능이 향상되는 이유를 SQL Server Management Studio(SSMS) Version 16을 중심으로 정리해보고자 한다.

 

 


1. 인덱스란?

데이터베이스에서 인덱스(Index)는 특정 데이터를 빠르게 찾기 위해 사용되는 구조로, 책의 색인 역할을 한다고 볼 수 있다. 데이터베이스 테이블은 수백만, 수억 개의 데이터를 포함하고 있을 수 있으며, 인덱스는 이러한 대용량 데이터를 효율적으로 조회하는 데 중요한 역할을 한다.

 

 

인덱스는 크게 두 가지 형태로 나뉜다;

 

1. 클러스터형 인덱스: 테이블 데이터가 물리적으로 정렬되는 방식으로, 테이블의 데이터 자체가 인덱스의 순서에 맞춰 저장된다. 주로 기본 키(Primary Key)에 의해 자동으로 생성된다.

2. 비클러스터형 인덱스: 데이터는 정렬되지 않지만, 특정 열에 대한 별도의 인덱스 테이블이 생성되어 해당 데이터를 빠르게 찾을 수 있다.

 

 

SQL Server Management Studio(SSMS)에서 인덱스를 쉽게 추가하고 관리할 수 있으며, CREATE INDEX구문을 통해 특정 컬럼에 인덱스를 추가하는 것이 가능하다.

 

CREATE INDEX IX_Table_Column
ON TableName (ColumnName);

 

 

 

 

 

2. SSMS(Version 16)에서의 인덱스 관리

SSMS Version 16에서는 인덱스 생성 뿐만 아니라, 인덱스를 통한 성능 향상을 더욱 쉽게 분석할 수 있는 기능들이 제공된다. 예를 들어, 쿼리 실행 계획(Query Execution Plan)을 확인하여 어떤 인덱스가 사용되었는지 시각적으로 분석할 수 있고, 성능 튜닝을 위한 인덱스 추천 기능도 활용할 수 있다.

 

 

실행 계획 보기 옵션은 Query → Include Actual Execution Plan 을 클릭하여 활성화 할 수 있다.

 

이후 쿼리를 실행하면 결과 창 아래에 Execution Plan 탭이 표시되며, 여기서 SQL Server가 쿼리를 처리한 경로를 시각적으로 볼 수 있다. 인덱스가 사용된 경우 ,각 작업에서 어떤 인덱스가 사용되었는지, 풀 스캔(Full Table Scan)이 발생했는지 등을 확인할 수 있다.

 

(위의 경우는 Clustered Index Seek로 표시되듯이, 인덱스를 효율적으로 사용하여 특정 데이터를 찾는 경우로, 인덱스가 성능에 긍정적인 영향을 주고 있는 경우이다.)

 

 

이를 통해 특정 쿼리에서 인덱스가 올바르게 사용되고 있는지, 추가로 성능 최적화를 위해 새로운 인덱스를 추가할 필요가 있는지를 판단할 수 있다.

 

 

 

3. 대용량 테이블에서 인덱스가 성능을 향상시키는 이유

대규모 테이블에 인덱스를 적용하면 조회 성능이 크게 향상되는 이유는 다음과 같다.

 

 

1. 데이터 검색 범위 축소

인덱스는 테이블의 모든 데이터를 탐색하는 대신, 특정 데이터를 찾을 수 있는 경로를 제공한다. 인덱스가 없는 상태에서는 데이터를 검색할 때 전체 테이블을 스캔해야 하지만, 인덱스가 있으면 특정 데이터가 있는 위치로 바로 접근할 수 있다. 이는 테이블이 클수록 성능 향상 효과가 더 크다.

 

2. B-Tree 구조를 통한 빠른 탐색

SQL Server에서 사용되는 인덱스는 B-Tree 구조를 사용한다. 이 구조는 트리 형태로 데이터를 저장하므로, 데이터를 검색할 때 중간에 불필요한 데이터들을 건너뛰고 원하는 데이터로 빠르게 접근할 수 있다. 대규모 데이터를 처리할 때 특히 유리하다.

 

3. 디스크 I/O 감소

인덱스를 통해 필요한 데이터가 저장된 페이지로 직접 접근할 수 있기 때문에, 디스크에서 읽어야 할 페이지 수가 줄어든다. 디스크 I/O는 성능에 매우 큰 영향을 미치므로, 이를 줄이는 것이 성능 향상의 핵심이다.

 

4. 쿼리 최적화

SQL Server는 쿼리를 실행할 때 인덱스를 활용하여 최적화된 실행 계획을 수립한다. 인덱스가 존재하면, SQL Server는 해당 인덱스를 이용해 데이터를 더 효율적으로 조회할 수 있다.

 

 

 

 

4. 인덱스 남용시 부작용

인덱스는 성능을 극대화하는 중요한 도구이지만, 남용할 결우 부작용도 있을 수 있다. 주의해야 할 점은 다음과 같다.

 

1. 데이터 삽입/수정/삭제 성능 저하: 인덱스는 데이터의 변경이 있을 때마다 함께 갱신되어야 하므로, 테이블에 많은 인덱스가 있으면 데이터 변경 작업의 속도가 느려질 수 있다.

 

2. 디스크 공간 증가: 인덱스는 별도의 저장 공간을 차지한다. 인덱스가 많아질수록 데이터베이스의 디스크 사용량이 크게 증가할 수 있으며, 이는 대규모 데이터베이스에서 중요한 관리 이슈가 될 수 있다.

 

3. 인덱스 선택 오류: 인덱스가 많으면 SQL Server가 적절한 인덱스를 선택하는 데 혼란이 생길 수 있다. 적절한 인덱스가 선택되지 않으면 오히려 쿼리 성능이 저하될 수 있다.

 

따라서 인덱스는 적재적소에 필요한 만큼 설계하고 관리하는 것이 중요하다. 특정 쿼리에 맞춰 신중하게 인덱스를 추가하고, 정기적인 모니터링을 통해 불필요한 인덱스를 제거하거나 수정해야 한다.

 

 

 

 

5. 결

위 사례처럼, 몇억 개의 row가 있는 대용량 테이블에서 인덱스를 추가하는 것은 단순한 조회 성능을 극적으로 향상시킬 수 있는 방법이다. 특시 SSMS(Version 16)의 향상된 성능 튜닝 도구를 활용하면 인덱스 관리가 훨신 수월해진다. 대규모 데이터베이스에서 인덱스는 선택이 아닌 필수 도구이며, 적절한 인덱스를 설계하면 실시간 데이터 조회와 분석의 효율성을 극대화할 수 있다.

 

 

 


#References

https://gent.tistory.com/492

https://cchoimin.tistory.com/entry/MSSQL-%EC%9D%B8%EB%8D%B1%EC%8A%A4-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95-%ED%88%B4or%EC%BF%BC%EB%A6%AC

https://ittrue.tistory.com/331

https://velog.io/@akfls221/%EC%9D%B8%EB%8D%B1%EC%8A%A4%EA%B0%80-%EB%A7%8E%EC%9C%BC%EB%A9%B4-%EB%AC%B4%EC%A1%B0%EA%B1%B4-%EC%A2%8B%EC%9D%80%EA%B0%80-861kuwau

 
반응형