옵티 마이저에게 더 많은 시간을 줄 수 있습니까?


18

옵티마이 저가 실행 시간을 최소화하고 기여하지 않아야하는 모든 시간을 할애 할 수 없다는 점을 감안할 때 때때로 실행 가능한 모든 실행 계획을 탐색하십시오.

필요한 모든 시간 (또는 특정 밀리 초)에 최적화 프로그램을 제공 할 수 있도록 이것이 재정의 될 수 있는지 궁금합니다 .

나는 이것을 필요로하지 않지만 (atm) 복잡한 쿼리가 단단한 루프에서 실행되고 최적의 계획을 세우고 미리 캐시하려는 시나리오를 상상할 수 있습니다.

물론 그것은 당신이 단단한 루프를 가지고 있기 때문에 쿼리를 다시 작성해야합니다.

이것은 호기심에서 더 많은 질문이며 때로는 단락 최적화와 전체 최적화 사이에 차이가 있는지 확인하는 것입니다.

추적 플래그 2301을 사용하여 옵티 마이저에 더 많은 시간을 제공 할 수있는 것으로 나타났습니다. 정확하게 요구 한 것은 아니지만 가깝습니다.

내가 찾은 최고의 정보는 Ian Jose의 SQL Server 2005 SP1의 쿼리 프로세서 모델링 확장에 있습니다.

이 추적 플래그를주의해서 사용하십시오! 그러나 더 나은 계획을 세울 때 유용 할 수 있습니다. 또한보십시오:

조인 순서에 대한 솔루션 공간이 기하 급수적으로 폭발하는 조인이 많은 쿼리에 대해 생각하고있었습니다. SQL Server가 사용하는 휴리스틱은 꽤 좋지만 더 많은 시간 (초 또는 분)이있는 경우 최적화 프로그램이 다른 순서를 제안하는지 궁금합니다.

답변:


16

추적 플래그 2301에 다음, 정말 그냥 더 많은 시간을 제공하기 때문에 '열심히'옵티 마이저을 수행 8780이 (무제한하지 상세히 설명 된 바와 같이 여기 (러시아어) 덜 자세한 여기에 ) 그 일을 할 수 있습니다.

러시아어 기사의 원저자에 대한 영어 상세 설명. 여기에는 저자 자신의 경고가 포함됩니다 :

프로덕션 환경에서는 사용하지 않는 것이 좋습니다 .

두 가지를 결합하고 (선택적으로 쿼리 힌트 옵션 (QUERYTRACEON 2301, QUERYTRACEON 8780을 통해)을 4 레벨 중첩 인라인 TVF 쿼리에 적용하십시오 (하단에있는 하나만 실제 작업을 수행하고 상위 레벨은 결과를 상관시킵니다) EXISTS 하위 쿼리를 통해)는 MERGE JOIN과 여러 개의 LAZY SPOOL을 실행하여 실행 시간을 절반으로 줄였습니다.


4

아냐, 못해

작동 방식 (복잡한 짐승, 내부에서 알 필요는 없음)을 이해하여 쿼리를 "최적화 친화적"으로 만들 수 있습니다. 시간이 너무 중요한 경우 SQL Server 작동 방식을 변경하지 말고 쿼리를 수정하십시오.

예를 들어, 데이터 볼륨 + 데이터 분배가 변경 될 때 쿼리가 O (n)보다 덜 효율적으로 스케일링을 시작하는시기를 알고 자합니다. 옵티 마이저에 더 많은 시간을 제공하면 여기에 값이 추가되지 않습니다.

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