SQL Server에서 실행 계획 작성은 얼마나 결정적인가?


13

다음과 같은 상수가 주어집니다.

  • 구조가 동일한 동일한 데이터베이스 (테이블, 인덱스 등)
  • 동일한 데이터
  • 동일한 SQL Server 및 하드웨어 구성
  • 동일한 통계
  • 클라이언트에서 동일한 SET 옵션
  • 동일한 SQL Server 버전
  • 동일한 추적 플래그

이러한 상수가 주어지면 SQL Server는 항상 주어진 쿼리에 대해 동일한 계획을 생성합니까?

그렇지 않은 경우 다른 고려 사항이 있습니까? 비결정론 적 요소도 고려해야 하는가?


같은 계획을 말하는 것은 잘못된 일이지만 비슷한 계획을 말할 수는 있습니다. DBA / 개발자가 제어 할 수있는 외부 요인과 함께; "쿼리 계획 최적화 알고리즘"및 "내부 쿼리 비용 알고리즘"은 SQL Server 엔진 내에 작성됩니다. 우리는 "어떻게 선택"을 모든 방식으로 지시 할 수있는 통제력이 없습니다. 엔진을 가장 잘 선택할 수 있도록 외부 환경을 설정할 수 있습니다. 주어진 쿼리에 대해 옵티마이 저가 0.001 비용 차이를 말하는 두 개의 실행 계획을 제시하면 선택한 실행 계획과 관련이 없다고 생각합니다.
Anup Shah

나는 당신이 이것에 대해 이론적이어야한다고 생각하지 않습니다. 나는 다른 데이터베이스로 25 년 동안 일해 왔으며 거의 ​​항상 쿼리를 다시 작성하여 더 잘 실행할 수 있습니다. 때로는 쿼리를 작성하는 한 가지 방법으로 더 나은 이유를 이해하기가 매우 어렵습니다.

답변:


13

이러한 상수가 주어지면 SQL Server는 항상 주어진 쿼리에 대해 동일한 계획을 생성합니까? 그렇지 않은 경우 다른 고려 사항이 있습니까? 비결정론 적 요소도 고려해야 하는가?

내가 아는 한 쿼리 컴파일은 결정적입니다. 원래 QO 디자인 목표 중 하나는 통계 전용 사본을 사용하여 다른 시스템에서 실행 계획을 재현 할 수 있어야한다는 것이 었습니다. 데이터베이스 을 . 사용 가능한 메모리 양 및 논리 프로세서 수와 같은 구성 매개 변수와 관련하여 몇 가지 미묘한 점이 있지만 동기화 할 항목 목록으로 덮여 있습니다.

주의 사항 : 목록에서 '동일한'이라는 단어 가 모든면에서 정확히 동일한 의미로 사용 되는 경우에 해당됩니다 . 예를 들어, '같은'통계는 두 시스템에 존재할 수 있지만, 그들은 단지입니다 정확히 같은 히스토그램 단계와 밀도 정보가있는 경우 동일 .

즉, 최적화 프로세스도 매우 복잡 하므로이 결정적 프로세스에 대한 모든 입력이 동일한 지 확인하기가 어려울 수 있습니다. 하고 모든 내부 상태가 동일하여 특정 코드 최적화 프로그램을 통해 동일한 코드 경로가 사용 편집. 쿼리에 데이터베이스 외부 (다른 데이터베이스 또는 인스턴스에 대한 액세스)가 포함 된 경우 해당 환경도 동일해야합니다.

목록에 추가 할 한 가지 계획 은 두 번째 데이터베이스에도 계획 지침 이 있는지 확인하는 것 입니다.


GETDATE()쿼리에서 와 같이 비 결정적 기능을 사용 하면 다른 계획도 얻을 수 있습니다. 기본 옵티마이 저는 값을 직접 사용하지 않지만 카디널리티 추정은 카디널리티 추정 중 상수 폴딩 및 표현식 평가를 참조하십시오 . 이 두 클래스의 차이가 문제의 범위에 해당되는지 확실하지 않습니다. 두 시스템이 동시에 실행될 경우 동일한 계획을 생성하기 때문입니다 (보다 일반적으로 동일한 입력 변수, 매개 변수 및 함수 값으로).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.