2014-01-10 3 views
0

우리 고객 중 하나는 모든 하위 선택이 임시 테이블 및 조인으로 대체되도록 지시하는 SQL 저장 프로 시저에 대한 새로운 코딩 표준을 도입하려고합니다. 그들은 이러한 변화의 이유로 가독성을 인용하고 있습니다.모든 subselect를 임시 테이블로 전환하고 조인이 성능에 영향을 줍니까?

SQL 성능 튜닝의 미세한 점에 대해서는 많이 알지 못하지만, 성능 문제가 발생할 것으로 생각됩니다. 내가 맞습니까?

MS SQL을 사용하고 있습니다.

+2

예, 성능 문제가 발생할 수 있습니다. 경우에 따라 임시 테이블을 사용하면 성능이 향상 될 수 있으며 경우에 따라 성능이 저하 될 수 있습니다. –

+0

그들이 도움을 줄 때와 상처를 입을 때 어떤 엄격하고 빠른 규칙이 있습니까? – eckza

+1

테이블 변수에 대해 알고 있습니까? - 그들은 종종 규모에 따라 임시 테이블을 수행합니다. –

답변

2

나는이 질문이 너무 광범위하고 해석의 대상이 될 우려가 있습니다.

일반적으로 중간 결과에 임시 테이블을 사용하면 SQL Server의 쿼리 최적화 프로그램을 우회합니다. 임시 테이블을 만들면 오버 헤드가 발생하고 테이블을 만든 다음 데이터를 다시 읽습니다. 예를 들어, 단순히 다양한 열 별칭을 정의하는 하위 쿼리를 사용하는 다음 쿼리를 고려하십시오

SQL이 정의와 같은 수준에서 열 별칭의 사용을 허용하지 않기 때문에 하위 쿼리에 대한이 구조가 오히려 일반적이다

select col3 + 1 
from (select col2 * 2 as col3 
     from (select col1/100 as col2 
      from (select col*col as col1 
        from a 
       ) b 
      ) c 
    ) d 
. 중간 테이블을 구체화하면 성능에 큰 영향을 미칩니다.

이 경우
with cte as (
     <complex query here> 
    ) 
select . . . 
from cte cte1 join 
    cte cte2 
    on cte1.col = cte2.col; 

이 쿼리 엔진은 실제로 두 번 CTE에 대한 하위 쿼리를 실행합니다 한편

는 쿼리로 구성 될 수 경우가 있습니다. 결과를 임시 테이블에 저장하면 성능이 향상 될 수 있습니다.

임시 테이블에 대한 나의 가장 큰 반대는 유지 보수입니다. 역설적이게도 고객이 왜 이것을 사용하려고하는지입니다. 예를 들어, 조회를 변경하면 임시 테이블의 구조가 변경 될 수 있습니다. 하나의 쿼리에서 어떤 쿼리를 유지하고 어떤 쿼리를 제거해야하는지 분명합니다. 임시 테이블의 집합으로서 더 이상 필요하지 않은 테이블을 작성할 위험이 있습니다.

0

데이터 및 subselect의 사용 방식에 따라 성능이 향상되거나 성능이 저하 될 수 있습니다. 상관 관계가있는 하위 쿼리는 성능이 떨어지며 임시 테이블이나 조인은이 경우 성능을 향상시키는 경향이 있습니다. 파생 된 테이블은 임시 테이블보다 빠르거나 반환되는 행 수 및 임시 테이블이 인덱싱 된 경우에 따라 달라질 수 있습니다. 모든 것은 또한 특정 데이터베이스의 디자인과 나머지 쿼리의 디자인에 달려 있습니다. 그리고 테이블 변수 나 테이블 값 함수가 최선의 선택 일 수도 있습니다. 이 표준을 사용하면 많은 유연성을 잃을 수 있습니다.

나는 개인적으로 가능한 문제가 무엇인지 그리고 하위 선택을 만드는 데있어 다른 방법이 무엇인지 설명 할 것입니다. 여전히 새로운 기능을 원한다면이 새로운 표준을 사용하십시오. 그러나 쿼리를 성능 조정해야 할 경우 표준을 수정하여 위반할 수있는 권한을 요청하십시오. 또한 많은 레코드가 포함될 경우 임시 테이블을 인덱싱해야합니다.