데이터베이스

OPTION (OPTIMIZE FOR UNKNOWN) 완벽 정리

Jinwookoh 2025. 5. 4. 13:23

 

SQL Server에서 성능 튜닝을 할 때 쿼리 힌트(Query Hint)는 매우 중요한 도구입니다. 그중에서도 OPTION (OPTIMIZE FOR UNKNOWN)은 실행 계획 캐싱과 관련된 성능 문제를 해결할 수 있는 핵심 힌트 중 하나입니다.

이 글에서는 OPTION (OPTIMIZE FOR UNKNOWN)의 개념, 사용 사례, 성능에 미치는 영향, 그리고 주의할 점까지 실무 중심으로 상세히 설명합니다.


📌 OPTIMIZE FOR UNKNOWN이란?

SQL Server에서는 파라미터가 있는 쿼리를 실행하면 해당 파라미터의 "값"을 기준으로 실행 계획을 수립합니다. 이 과정을 *파라미터 스니핑(Parameter Sniffing)*이라고 부르며, 일반적으로는 성능 최적화에 도움이 됩니다.

하지만 **편향된 데이터 분포(skewed data)**나 비정형적인 초기 파라미터로 인해 "비효율적인 실행 계획"이 캐시되는 문제가 발생할 수 있습니다.

이럴 때 사용하는 힌트가 바로:

OPTION (OPTIMIZE FOR UNKNOWN)

입니다.

✅ 동작 원리

OPTIMIZE FOR UNKNOWN은 파라미터 값을 무시하고, 해당 열의 통계 정보(Statistics) 기반으로 일반화된 실행 계획을 수립하도록 옵티마이저에 지시합니다.

즉, 특정한 값이 아닌 **"대표적인 평균값"**을 기준으로 실행 계획을 생성합니다.


💡 사용 예제

다음과 같은 쿼리를 가정해보겠습니다:

DECLARE @CategoryId INT = 5;

SELECT *
FROM Products
WHERE CategoryID = @CategoryId
OPTION (OPTIMIZE FOR UNKNOWN);

이 경우 SQL Server는 @CategoryId = 5를 고려하지 않고, 통계에 기반한 실행 계획을 수립합니다.


🚀 언제 사용해야 할까?

✅ 성능 튜닝이 필요한 시점

  • 특정 파라미터에서는 쿼리가 빠르게 실행되지만, 다른 파라미터에선 매우 느려지는 경우
  • 동일한 쿼리를 다양한 조건에서 실행해야 할 때
  • 쿼리 캐시에서 잘못된 실행 계획이 재사용되면서 성능이 불안정한 경우

✅ 활용 예시

-- 매번 다른 고객 ID로 호출되는 경우
DECLARE @CustomerId INT = 123;

SELECT *
FROM Orders
WHERE CustomerId = @CustomerId
OPTION (OPTIMIZE FOR UNKNOWN);

📉 주의할 점

❗ 일반화된 실행 계획 = 항상 최선은 아님

OPTIMIZE FOR UNKNOWN은 "최악을 피하는 전략"이지, "최고의 성능을 보장"하진 않습니다. 데이터 분포가 극단적이지 않거나, 파라미터의 값이 예측 가능하다면 오히려 성능이 떨어질 수도 있습니다.

❗ 통계가 최신이어야 의미 있음

OPTIMIZE FOR UNKNOWN은 통계 정보를 기반으로 실행 계획을 세우므로, 통계가 오래되었다면 부정확한 계획이 만들어질 수 있습니다.

🛠️ 통계 갱신은 UPDATE STATISTICS 또는 자동 업데이트 옵션을 확인하세요.


🔍 OPTIMIZE FOR vs OPTIMIZE FOR UNKNOWN

힌트 설명
OPTIMIZE FOR (@Param = value) 특정 파라미터 값에 최적화된 실행 계획 사용
OPTIMIZE FOR UNKNOWN 통계 기반의 일반적인 실행 계획 사용

🧠 결론

OPTION (OPTIMIZE FOR UNKNOWN)은 파라미터 스니핑 이슈를 완화하고, 일관된 성능 확보를 위한 중요한 도구입니다. 하지만 모든 상황에 만능은 아니며, 데이터 분포와 쿼리 성격을 고려한 적용이 필요합니다.

SQL Server에서 안정적인 실행 계획을 확보하고 싶다면, OPTIMIZE FOR UNKNOWN을 꼭 실무에 도입해보세요.