2012-06-21 7 views
1

나는 쿼리를 작성 중이며 SQL Profiler 추적을 분석하여 쿼리의 성능과 속도를 모니터링합니다.3 개의 개별 쿼리를 결합한 TSQL 쿼리가 왜 느리게 실행됩니까?

이 작업을 수행하는 동안 동일한 테이블에서 3 가지 다른 선택을 실행하면 이러한 선택이 WHERE 절의 OR로 그룹화 된 경우보다 훨씬 빠르다는 것을 알았습니다.

A)

SELECT * FROM navigation_trees nt INNER JOIN contents c ON c.navigation_tree_id = nt.id WHERE nt.id = @NodeID 

SELECT * FROM navigation_trees nt INNER JOIN contents c ON c.navigation_tree_id = nt.id WHERE nt.id = @ParentID 

SELECT * FROM navigation_trees nt INNER JOIN contents c ON c.navigation_tree_id = nt.id WHERE nt.id IN (SELECT id FROM @ChildrenIDS) 

B) 여기

SELECT * FROM navigation_trees nt INNER JOIN contents c ON c.navigation_tree_id = nt.id 
    WHERE 
     nt.id = @NodeID OR 
     nt.id = @ParentID OR 
     nt.id IN (SELECT id FROM @ChildrenIDS) 

그리고 두 쿼리의 프로파일 측정 값입니다 :

CPU | Reads | Writes | Duration(ms) 

A) 15 | 1095 | 0 | 26 

B) 531 | 456139 | 0 | 541 

당신이 되거 수 있습니까?

감사합니다.

+0

두 검색어에 대한 계획을 보여 봤습니까? –

+1

SQL Studio에서 실행 계획을 활성화하고 세부 정보를 확인하십시오. –

+0

테이블에 몇 개의 레코드가 있는지 확인하십시오. 읽기를 정당화 할 것입니다. –

답변

3

3 개의 선택이 단지 3 개의 선택이고, 3 개의 조건을 가진 A 선택은 OR에 의해 결합되며 실제로 중복 제거에 대한 추가 비용이 선택됩니다.

중복되지 않도록하려면 OR 대신 UNION ALL을 사용해보십시오. 물론 매우 일반적인 조언입니다. 성능을 위해서만 쿼리를 조정할 때는 항상 실행 계획을 참조하여 해당 시나리오에서 특정 조언이 적용되는지 확인하십시오.

2

David에 동의하지만 코드 예제를 넣고 싶습니다. 그것들은 살인자 일 가능성이 높습니다. 새로운 개발자를 가르치는 기본 규칙은 필요한 경우입니다. 또는 노조가 필요합니다. 필터 초기 필터의 다른 기본 규칙과 자주 관련됩니다. 최적화가 데이터를 줄이기 위해 더 나은 경로를 볼 수 있으므로 모든 조인시 필터링하는 쿼리가 where 절에서 실행되는 필터보다 빨리 발생합니다.

귀하의 질의가 이와 같이 동작하거나 다른 Union All을 필요로 할 수 있습니다.

Select 
    * 
From 
(
    SELECT * 
    FROM 
     navigation_trees nt 
    WHERE 
     nt.id = @NodeID 

    union 
    SELECT 
     * 
    FROM 
     navigation_trees nt 
    WHERE 
     nt.id = @ParentID 

    union 
    SELECT 
     * 
    FROM 
     navigation_trees nt 
    WHERE 
     nt.id IN (SELECT id FROM @ChildrenIDS) 

) nt 

INNER JOIN 
    contents c 
ON 
    c.navigation_tree_id = nt.id 
관련 문제