2012-08-10 3 views
1

나는 이것에 대해 매우 혼란스러워합니다. 최종 SQL 문이 동적으로 작성되고 많은 함수와 프로 시저가이 작업에서 역할을하기 때문에 예제를 제공 할 수 없습니다 ...T-SQL - INNER MERGE JOIN이 여러 조인을 더 빨리 수행하도록 정의하는 이유는 무엇입니까?

일반적으로 5 개의 조인이 있습니다. 나는 그 중 하나를 제거하면 문장이 0 초 동안 실행되고, 그렇지 않으면 4 분 이상 실행되는 것으로 나타났습니다. 그런 다음 실제 실행 계획을 살펴보고 "병합 조인"에 많은 비용이 소요된다는 사실을 알게되었습니다. Google에서 검색하면 'INERER MERGE JOIN'또는 'OPTION (MERGE JOIN)'을 사용하여 문을 닫을 수 있습니다.

쿼리가 0 초 동안 실행되기 때문에 정말 좋았습니다. 하지만 내 질문은 왜?

약간의 연구를했는데 MERGE 조인을 사용하려면 두 문을 정렬해야한다는 것을 알았습니다. 제 경우는 아니지만 0 초 만에 올바른 결과를 얻습니다.

왜 T-SQL 아이디어로 인해이 문제가 발생할 수 있습니까?

나는 이미 해결책이 있지만 나는 이것이 왜 작동하고 있으며 어떤 일이 일어나고 있는지 알고 싶다. 이런 일이 왜

답변

3

이유 중 하나는 느린 계획에 중첩 된 루프 안쪽의 쿼리 (부정확 한 추정 비용으로 인해 선택 계획) 병합주기

이 조인 힌트를 평가하는 비용과 결합 사용하는 경우입니다 값 비싼 u 리가] 복적으로 한 번만 (사용자 정의 설명에서 정렬 연산자에 대한 입력으로) 평가되지 않게됩니다 (병합 조인은 각 입력을 1 회 통과합니다).

이 경우에 대해 느린 버전과 빠른 버전 모두에 대한 실행 계획을 캡처해야합니다.

+0

"병합"옵션을 사용해야 할 때 - 높은 비용의 연산이 포함 된 중첩 루프가있을 때마다? – gotqn

+0

@Joro 모든 쿼리 힌트는 실행 계획을보고 SQL Server가 왜 최상의 계획을 제공하지 않는지를 확인한 후에 최후의 수단으로 사용해야합니다. –

0

쿼리 최적화 프로그램은 계획을 만들 때 조인 수를 고려합니다. 나는 5 개의 조인이 다른 접근법을 취하는 바로이 시나리오를 보아왔다. 테이블 힌트를 사용하여 쿼리 계획을 강제로 수행 할 수 있습니다. 또한 조인이 아닌 조인 또는 교차를 사용하도록 쿼리를 restucuture 할 수 있습니다.

+0

감사합니다. 그러나 변경이 허용되지 않은 저장 프로 시저에 의해 동적으로 생성되므로 구조를 다시 작성할 수 없습니다. – gotqn