MS SQL Server (MSSQL)

인덱스 생성 원칙

초심으로 2024. 9. 10. 14:00

728x90

데이터베이스 성능을 최적화하는 데 있어 인덱스는 핵심적인 역할을 합니다. 하지만 모든 컬럼에 인덱스를 설정하는 것이 항상 좋은 전략은 아닙니다. 인덱스는 검색 성능을 향상시키지만, 동시에 쓰기 성능에 영향을 미치며 디스크 공간을 소모합니다. 따라서 어떤 데이터 유형의 컬럼에 인덱스를 설정하는 것이 좋은지 이해하고, 적절한 선택을 하는 것이 중요합니다. 이 글에서는 인덱스를 설정하기 적합한 데이터 유형의 컬럼에 대해 예시와 함께 살펴보겠습니다.


1. 인덱스 설정의 기본 원칙

인덱스를 설정할 때 고려해야 할 기본 원칙은 다음과 같습니다:

  1. 자주 검색되는 컬럼: 검색 쿼리에서 자주 사용되는 컬럼에 인덱스를 설정하면 성능이 향상됩니다.
  2. 정렬 및 필터링에 사용되는 컬럼: 정렬(ORDER BY)이나 필터링(WHERE)에 자주 사용되는 컬럼은 인덱스를 통해 성능을 개선할 수 있습니다.
  3. 조인에 사용되는 컬럼: 다른 테이블과의 조인(JOIN)에 사용되는 컬럼에도 인덱스를 설정하면 성능이 향상됩니다.

이제 각 데이터 유형별로 인덱스 설정이 적합한 예시를 살펴보겠습니다.


2. 숫자형 데이터 (INT, BIGINT, FLOAT 등)

2.1. 예시: 고객 ID 컬럼

  • 컬럼: CustomerID (INT)
  • 쿼리:
  • SELECT * FROM Orders WHERE CustomerID = 123;
  • 설명: 숫자형 데이터는 비교 연산이 빠르고, 인덱스가 성능 향상에 효과적입니다. CustomerID와 같은 고유한 숫자형 컬럼은 인덱스를 설정하기에 적합합니다. 특히, 이 컬럼이 PRIMARY KEY로 설정된 경우, 자동으로 클러스터형 인덱스가 생성됩니다.
  • 해결 방법:
  • CREATE INDEX IX_CustomerID ON Orders(CustomerID);

2.2. 예시: 제품 가격 컬럼

  • 컬럼: Price (FLOAT)
  • 쿼리:
  • SELECT * FROM Products WHERE Price > 100;
  • 설명: 가격 같은 숫자형 범위 검색 쿼리에 인덱스를 추가하면 성능을 개선할 수 있습니다. 다만, FLOAT보다는 DECIMAL과 같은 더 정밀한 데이터 타입을 사용하는 것이 좋습니다.
  • 해결 방법:
  • CREATE INDEX IX_Price ON Products(Price);

3. 문자형 데이터 (VARCHAR, CHAR, TEXT 등)

3.1. 예시: 사용자 이메일 컬럼

  • 컬럼: Email (VARCHAR)
  • 쿼리:
  • SELECT * FROM Users WHERE Email = 'user@example.com';
  • 설명: VARCHAR와 같은 문자형 데이터는 검색 및 정렬에 인덱스를 추가하면 성능이 향상됩니다. 다만, 너무 긴 문자열에 인덱스를 추가하면 성능이 저하될 수 있으므로 적절한 길이로 설정하는 것이 중요합니다.
  • 해결 방법:
  • CREATE INDEX IX_Email ON Users(Email);

3.2. 예시: 고객 성 컬럼

  • 컬럼: LastName (VARCHAR)
  • 쿼리:
  • SELECT * FROM Customers WHERE LastName LIKE 'Smith%';
  • 설명: 문자형 데이터의 경우, LIKE 연산자를 사용할 때 인덱스가 성능을 개선할 수 있습니다. 하지만 %로 시작하는 검색은 인덱스를 활용할 수 없습니다. 인덱스를 설정하면 성능이 향상될 수 있습니다.
  • 해결 방법:
  • CREATE INDEX IX_LastName ON Customers(LastName);

4. 날짜 및 시간형 데이터 (DATE, DATETIME, TIMESTAMP 등)

4.1. 예시: 주문 날짜 컬럼

  • 컬럼: OrderDate (DATETIME)
  • 쿼리:
  • SELECT * FROM Orders WHERE OrderDate >= '2024-01-01';
  • 설명: 날짜형 데이터는 시간 범위 검색에 인덱스가 매우 효과적입니다. 특히, 날짜 범위 검색 쿼리에서 인덱스를 활용하면 성능이 크게 향상됩니다.
  • 해결 방법:
  • CREATE INDEX IX_OrderDate ON Orders(OrderDate);

4.2. 예시: 최근 활동일 컬럼

  • 컬럼: LastActivityDate (DATETIME)
  • 쿼리:
  • SELECT * FROM Users WHERE LastActivityDate BETWEEN '2024-01-01' AND '2024-12-31';
  • 설명: 날짜와 시간의 범위 검색에서 인덱스가 성능을 크게 개선할 수 있습니다. 특히, 범위 검색에서는 인덱스의 이점을 최대한 활용할 수 있습니다.
  • 해결 방법:
  • CREATE INDEX IX_LastActivityDate ON Users(LastActivityDate);

5. 부울형 데이터 (BOOLEAN)

5.1. 예시: 활성 상태 컬럼

  • 컬럼: IsActive (BOOLEAN)
  • 쿼리:
  • SELECT * FROM Users WHERE IsActive = 1;
  • 설명: 부울형 데이터는 인덱스가 효율적이지 않을 수 있습니다. 부울형 컬럼이 두 가지 상태(예: TRUE/FALSE)만을 갖는 경우, 인덱스를 설정해도 성능 개선이 미미할 수 있습니다.
  • 해결 방법: 부울형 컬럼에 인덱스를 설정할 필요가 없는 경우도 많습니다. 그러나 이 컬럼이 자주 사용되는 경우, 인덱스를 설정하여 성능을 개선할 수 있습니다.

결론

인덱스를 설정하는 것은 성능 최적화의 중요한 부분입니다. 데이터 유형에 따라 인덱스의 효과는 달라질 수 있으며, 인덱스를 설정할 때는 데이터의 사용 패턴을 고려하는 것이 중요합니다. 숫자형 데이터와 날짜형 데이터는 범위 검색 및 정렬에 유리하며, 문자형 데이터는 검색 성능을 향상시킬 수 있습니다. 그러나 부울형 데이터는 성능 개선 효과가 제한적일 수 있습니다. 적절한 인덱스 설정으로 데이터베이스 성능을 최적화하고, 쿼리 응답 시간을 줄이는데 도움이 되길 바랍니다.

반응형