2014-06-30 5 views
0

9 (!) 테이블을 조인하는 다른 사람의 코드가 부여되었습니다 - 이전에는 아무 문제없이 사용했지만 지금은 모든 테이블이 커지므로 이상한 공간 오류가 생겼어.단일 문에서 다중 내부 조인 대 쌍별 조인

조인을 분리하고 여러 개의 쌍으로 된 조인을 수행하는 데 대한 조언을 받았습니다. 모든 조인이 내부이고 모든 것이 읽히는 순서가이 경우에는 아무런 차이가 없어야 함을 알기 때문에 간단해야합니다. 그러나 내가해야하는 것보다 다른 수의 사례를 얻고 있습니다. 특정 매우 복잡한 예제를 제공하지 않고 이것에 대한 가능한 이유는 무엇입니까?

감사

+0

페어 조인에 의해 무슨 뜻 이죠. – Hogan

+2

9 개의 테이블에 가입하는 것은 그리 많지 않습니다. – Hogan

+0

"별난 공간 오류"란 무엇입니까? – Hogan

답변

0

To me, joining 9 tables in a single statement is a lot! Pairwise may have been imprecise - I mean joining two tables then joining that result to another table, then that result to another table. Obviously they are ordered to the degree that the necessary key is available at each point.

이 나에게 명확하지 않다. 사실, 사실이 아닙니다. MOST SQL 플랫폼 (아직 사용중인 SQL 컴파일러가 없음)은 SQL 문을 컴파일하고 실행 계획을 구성합니다. 이 계획은 조인이 실행될 때 최적화되고 이동합니다. 병렬로 실행되는 많은 시스템에서 동시에 조인을 실행합니다.

명령문의 "순서"를 이해하는 방법은 실행 계획을 보는 것입니다.

많은 시스템에서 순서를 제어하는 ​​방법은 CTE를 사용하는 것입니다. 이런 식으로 뭔가 :

WITH subsetofbigtable AS 
(
    SELECT * 
    FROM reallybigtable 
    WHERE date = '2014-01-01' 
) 
SELECT * 
FROM subsetofbigtable 
JOIN anothertable1 ... 
JOIN anothertable2 ... 
JOIN anothertable3 ... 
JOIN anothertable4 ... 
JOIN anothertable5 ... 

또한 열팽창 계수가 "순서"조인하는 체인 수 있습니다

WITH subsetofbigtable AS 
(
    SELECT * 
    FROM reallybigtable 
    WHERE date = '2014-01-01' 
), chain1 AS 
(
    SELECT * 
    FROM subsetofbigtable 
    JOIN anothertable1 ... 
), chain2 AS 
(
    SELECT * 
    FROM chain1 
    JOIN anothertable2 ... 
) 
SELECT * 
FROM chain2 
JOIN anothertable3 ... 
JOIN anothertable4 ... 
JOIN anothertable5 ... 
+0

플랫폼은 UNIX입니다. 최적화가 단일 명령문 내에서 발생하므로 여러 조인이 최적화된다는 것을 이해합니다. 그렇다고하더라도 공간 문제가 있습니다. 따라서 조인을 중단하고 여러 문을 사용하려고하면 그 시점에서 키가있는 테이블 만 조인 할 수 있습니다. – user3791254

+0

@ user3791254 - 유닉스 .. 멋지다. 그러나 도움이되지 않습니다. DB2, Oracle, mysql을 사용하고 있습니까? ** SQL ** 플랫폼은 무엇입니까? – Hogan

+0

DB2 ... "체인 연결"에 익숙하지 않음 – user3791254