본문 바로가기

MSSQL

MSSQL : 쿼리 옵션에 따라 달라지는 실행 계획

반응형

MS SQL은 쿼리를 실행할 때, 쿼리 최적화 프로그램이 비용을 기준으로 최적의 실행계획을 생성하고, 이를 cache에 저장합니다. 이렇게 하면, 같은 쿼리를 다시 실행할 때, cache에 있는 실행계획을 재사용하여 성능을 향상시킬 수 있습니다. 그러나, 쿼리 옵션에 따라서 실행계획이 다르게 cache에 올라가는 경우가 있습니다. 이는 다음과 같은 이유로 발생할 수 있습니다.

 

  • **쿼리 유형**: MS SQL은 쿼리를 ad-hoc 쿼리와 stored procedure로 구분합니다. ad-hoc 쿼리는 매번 실행할 때마다 새로운 실행계획을 생성하고 cache에 저장합니다. 그러나, stored procedure는 한 번만 실행계획을 생성하고 cache에 저장하며, 이후에는 같은 실행계획을 재사용합니다. 따라서, 같은 쿼리라도 ad-hoc 쿼리와 stored procedure로 작성하면 실행계획이 다르게 cache에 올라갈 수 있습니다.
  •  **쿼리 힌트**: 쿼리 힌트는 쿼리 최적화 프로그램에게 쿼리를 실행하는 방법에 대한 추가적인 정보를 제공하는 방법입니다. 예를 들어, `OPTION (RECOMPILE)` 힌트는 쿼리를 실행할 때마다 새로운 실행계획을 생성하도록 지시합니다. `OPTIMIZE FOR` 힌트는 특정 파라미터 값에 대한 최적의 실행계획을 사용하도록 지시합니다. 쿼리 힌트를 사용하면, 쿼리 최적화 프로그램이 기본적으로 생성하는 실행계획과 다른 실행계획이 cache에 올라갈 수 있습니다.
  •  **쿼리 옵션**: 쿼리 옵션은 쿼리를 실행하는 데 영향을 미치는 여러 가지 설정입니다. 예를 들어, `ANSI_NULLS` 옵션은 NULL 값을 비교하는 방법을 결정합니다. `ARITHABORT` 옵션은 산술 오버플로우나 0으로 나누기와 같은 오류가 발생했을 때 쿼리를 중단할지 여부를 결정합니다. 쿼리 옵션을 변경하면, 쿼리 최적화 프로그램이 다른 실행 모드나 연산자를 선택할 수 있으므로, 실행계획이 다르게 cache에 올라갈 수 있습니다.

실행계획에 미칠 수 있는 옵션

ANSI_NULLS

ANSI_PADDING

ANSI_WARNINGS*

ARITHABORT

CONCAT_NULL_YIELDS_NULL

NUMBERIC_ROUNDABORT

QUOTED_IDENTIFIER

반응형