MS SQL Server (MSSQL)

SQL Server에서 통계(Statistics)가 쿼리 플랜에 미치는 영향

초심으로 2024. 9. 12. 15:00

728x90

SQL Server에서 성능 최적화는 매우 중요한 요소 중 하나이며, 그 중심에는 쿼리 플랜(Query Plan)이 있습니다. SQL Server는 쿼리를 최적화하기 위해 통계(Statistics)를 사용하며, 이 통계는 데이터 분포에 대한 정보를 SQL Server에 제공하여 효율적인 쿼리 플랜을 생성하는 데 기여합니다.

통계는 특히 인덱스(Index)가 있는 컬럼이나 WHERE 절에서 자주 사용되는 컬럼에서 중요한 역할을 합니다. 잘못된 통계는 부적절한 쿼리 플랜을 생성할 수 있으며, 이는 성능 저하로 이어질 수 있습니다.

이번 블로그에서는 SQL Server 통계가 쿼리 플랜에 미치는 영향을 알아보고, 이를 실습할 수 있는 예제를 함께 살펴보겠습니다.


통계(Statistics)란 무엇인가?

SQL Server의 통계는 특정 컬럼에 대한 데이터 분포를 나타냅니다. 이를 통해 쿼리 최적화 도구는 쿼리 실행 시 가장 효율적인 접근 방식을 선택할 수 있습니다. 통계는 주로 히스토그램(histogram)밀도 정보(density information)로 구성됩니다.

  1. 히스토그램: 해당 컬럼의 값 분포를 보여주며, SQL Server가 데이터의 범위와 중복도를 예측하는 데 도움을 줍니다.
  2. 밀도 정보: 해당 컬럼의 고유 값에 대한 정보를 제공합니다. 이 정보는 인덱스를 사용할 때 도움이 됩니다.

통계는 주로 다음의 두 가지 방식으로 생성됩니다:

  • 자동 통계 생성: SQL Server는 기본적으로 필요할 때 자동으로 통계를 생성합니다.
  • 수동 통계 생성: 특정한 요구 사항이 있는 경우, 사용자가 직접 통계를 생성할 수 있습니다.

통계가 쿼리 플랜에 미치는 영향

쿼리 최적화는 통계를 기반으로 이루어집니다. SQL Server는 통계를 통해 다음을 결정합니다:

  • 적합한 인덱스 선택: 통계는 인덱스 선택을 돕고, 잘못된 통계는 부적절한 인덱스를 선택하게 할 수 있습니다.
  • 조인 순서 및 방식 결정: SQL Server는 통계 정보를 통해 테이블 간의 조인 순서와 방법을 결정합니다.
  • 최적의 실행 계획 생성: 통계는 쿼리에서 특정 조건에 따라 가장 효율적인 실행 계획을 수립하는 데 사용됩니다.

예시:

만약 통계가 부정확하거나 오래된 경우, SQL Server는 데이터가 적다고 잘못 판단하고, 풀 테이블 스캔(Table Scan)을 선택할 수 있습니다. 하지만 실제 데이터는 매우 클 수 있으며, 이는 성능 저하로 이어질 수 있습니다.


실습 예시: 통계가 쿼리 플랜에 미치는 영향

1. 예제 테이블 생성 및 데이터 삽입

먼저, 간단한 테이블을 생성하고 데이터를 삽입해 보겠습니다.

-- 테이블 생성
CREATE TABLE ProductSales
(
    SaleID INT IDENTITY(1,1),
    ProductID INT,
    Quantity INT,
    SaleDate DATE
);

-- 데이터 삽입
INSERT INTO ProductSales (ProductID, Quantity, SaleDate)
VALUES 
(1, 10, '2024-01-01'),
(1, 20, '2024-01-02'),
(2, 15, '2024-01-01'),
(3, 30, '2024-01-03'),
(3, 40, '2024-01-04'),
(4, 50, '2024-01-05'),
(5, 60, '2024-01-06'),
(5, 70, '2024-01-07');

2. 통계 생성 및 쿼리 실행 계획 확인

ProductID 컬럼에 대해 통계를 수동으로 생성하고, 쿼리를 실행하여 실행 계획을 확인합니다.

-- 수동 통계 생성
CREATE STATISTICS Stats_ProductID ON ProductSales (ProductID);

-- 통계를 사용하는 쿼리 실행 및 실행 계획 확인
SELECT ProductID, SUM(Quantity) 
FROM ProductSales
WHERE ProductID = 3
GROUP BY ProductID;

이 쿼리의 실행 계획을 확인해 보면, SQL Server가 ProductID에 대한 통계를 사용하여 최적의 실행 계획을 수립했는지 확인할 수 있습니다.

3. 통계 업데이트 및 성능 차이 확인

데이터가 변경되었을 때 통계를 업데이트하지 않으면, SQL Server가 부정확한 실행 계획을 생성할 수 있습니다. 이를 실습해 보겠습니다.

-- 새로운 데이터 삽입
INSERT INTO ProductSales (ProductID, Quantity, SaleDate)
VALUES (3, 100, '2024-01-08'), (3, 120, '2024-01-09');

-- 통계 업데이트 없이 동일한 쿼리 실행
SELECT ProductID, SUM(Quantity) 
FROM ProductSales
WHERE ProductID = 3
GROUP BY ProductID;

통계를 업데이트하지 않고 쿼리를 실행하면, SQL Server는 여전히 이전의 통계를 바탕으로 실행 계획을 수립할 것입니다. 이로 인해 성능이 저하될 수 있습니다.

4. 통계 업데이트 후 성능 개선

이제 통계를 수동으로 업데이트하고 쿼리를 다시 실행해 보겠습니다.

-- 통계 업데이트
UPDATE STATISTICS ProductSales (Stats_ProductID);

-- 동일한 쿼리 실행
SELECT ProductID, SUM(Quantity) 
FROM ProductSales
WHERE ProductID = 3
GROUP BY ProductID;

통계가 업데이트된 후 SQL Server는 최신 데이터를 기반으로 새로운 실행 계획을 수립할 수 있습니다. 이를 통해 쿼리 성능이 개선되는 것을 확인할 수 있습니다.


통계 관리 팁

  1. 자동 통계 기능 활성화: 기본적으로 SQL Server는 통계를 자동으로 생성 및 업데이트합니다. 이를 활성화된 상태로 유지하는 것이 좋습니다.
  2. 수동 통계 업데이트: 대규모 데이터 변경이 발생한 경우, 수동으로 통계를 업데이트하여 최적의 쿼리 실행 계획을 보장할 수 있습니다.
  3. 통계 확인: sys.stats와 같은 시스템 뷰를 통해 현재 테이블의 통계 정보를 확인할 수 있습니다.
-- 통계 정보 확인
SELECT name, stats_id, auto_created, user_created
FROM sys.stats
WHERE object_id = OBJECT_ID('ProductSales');

결론

SQL Server에서 통계는 쿼리 최적화의 핵심 요소입니다. 통계가 적절하게 유지되지 않으면 잘못된 실행 계획이 생성되어 성능 저하로 이어질 수 있습니다. 이 글에서 설명한 실습 예제를 통해 통계가 쿼리 성능에 어떤 영향을 미치는지 직접 확인해 보시기 바랍니다.

반응형