복붙노트

[SQL] 왜 임시 테이블과 부속 사이에 거대한 성능 차이가있다

SQL

왜 임시 테이블과 부속 사이에 거대한 성능 차이가있다

이는 SQL 서버 2008 R2에 대한 질문입니다

나는 지금까지, DBA가 아니에요. 나는 때때로 SQL을 작성하는 자바 개발자입니다. (대부분의 코드에 포함). 나는 내가 잘못 여기서 뭔가를 한 경우 알고 싶어하고, 만약 그렇다면, 내가 피하기 위해 할 수있는 일이 다시 일어날 수 있습니다.

Q1 :

SELECT something FROM (SELECT * FROM T1 WHERE condition1) JOIN ...

Q1은 14 조인 기능

Q2는 한 가지 예외가 Q1과 동일하다. 이전에 실행되고, 임시 테이블에 저장된다 (조건 1이 T1 * FROM).

이 상관 하위 쿼리가 아닙니다.

Q2 :

SELECT * INTO #tempTable FROM T1 WHERE condition1
SELECT something FROM #tempTable  JOIN ...

또, 14 조인.

내가 지금 Q1입니다 퍼즐 있다는 것은 Q2 (결합 된 두 쿼리)을 2 초 걸렸다 동안 (역할 재생 캐싱을 방지하기 위해, 그것을 몇 번 시도)를,> 2 분했다! 무슨 준다?

해결법

  1. ==============================

    1.이유는 사용하는 서브 쿼리하지 않는 것이 좋습니다?

    이유는 사용하는 서브 쿼리하지 않는 것이 좋습니다?

    (관계없이 사용중인 데이터베이스) 데이터베이스 최적화는 항상 제대로 (하위 쿼리와) 같은 쿼리를 최적화 할 수 있습니다. 이 경우, 최적화에 대한 문제는 결과 집합에 가입 할 수있는 올바른 방법을 선택하는 것입니다. 두 개의 결과 집합에 합류하기위한 여러 가지 알고리즘이 있습니다. 알고리즘의 선택은 하나에서 다른 결과 집합에 포함 된 레코드의 수에 따라 달라집니다. 경우에 당신은 (하위 쿼리가 물리적 테이블 없음) 두 개의 물리적 테이블을 조인하는 경우, 데이터베이스는 쉽게 사용 가능한 통계에 의해 두 개의 결과 집합에서 데이터의 양을 확인할 수 있습니다. 결과 집합 중 하나가 하위 쿼리 인 경우,이 반환 매우 어렵 레코드 수를 이해합니다. 즉 쿼리의 성능을 극적으로 감소로 이어질 것 때문에이 경우 데이터베이스는 조인의 잘못된 쿼리 계획을 선택할 수 있습니다.

    임시 테이블을 사용하여 함께 쿼리를 다시 작성하는 데이터베이스 최적화를 단순화하기위한 것입니다. (가) 모든 결과 집합을 쿼리 재 작성에 참여하는 것은 물리적 테이블을 것 조인 데이터베이스가 쉽게 각 결과 세트의 길이를 결정합니다. 이 데이터베이스는 가능한 모든 쿼리 계획의 빠른 보장 선택할 수 있습니다. 또한, 데이터베이스에 상관없이 조건이 무엇인지 올바른 선택을하지 않습니다. 임시 테이블이 데이터베이스에 잘 작동으로 재 작성된 쿼리는이 휴대용 솔루션의 개발에 특히 중요하다. 또한, 다시 쿼리를 이해하고 디버깅하기 쉬운, 쉽게 읽을 수 있습니다.

    임시 테이블의 생성 : 임시 테이블에 쿼리를 다시 작성하기 때문에 추가 비용에 약간의 침체로 이어질 수 있음을 알 수있다. 데이터베이스가 쿼리 계획의 선택과 착각하지 않을 경우, 새보다 더 빨리 기존의 쿼리를 수행합니다. 그러나이 둔화은 항상 무시됩니다. 일반적으로 임시 테이블의 생성은 몇 밀리 초 걸립니다. 즉, 지연은 시스템 성능에 상당한 영향을 미칠 수 없으며, 일반적으로 무시할 수 있습니다.

    중대한! 임시 테이블에 대한 인덱스를 생성하는 것을 잊지 마십시오. 인덱스 필드는 가입 조건에 사용되는 모든 필드를 포함해야한다.

  2. ==============================

    2.등이 여기에 해결하는 일, 인덱스, 실행 계획의 많은 테스트 및 비교 결과를 갈 수있는 방법이 있습니다.

    등이 여기에 해결하는 일, 인덱스, 실행 계획의 많은 테스트 및 비교 결과를 갈 수있는 방법이 있습니다.

    당신은 평소 용의자, 인덱스에 좀 걸릴 수 있습니다. 실행 계획에 봐, 그리고 그것들을 비교한다. 확인 WHERE 절은 올바른 사람을 사용합니다. 당신이 조인 당신에 인덱스를 사용하고 있는지 확인합니다.

    이 대답은 확실히 당신에게 많은 도움이 될 것입니다.

  3. from https://stackoverflow.com/questions/16767645/why-is-there-a-huge-performance-difference-between-temp-table-and-subselect by cc-by-sa and MIT license