2009-08-20 8 views
2

EDIT 9-3-10 : 최근이 블로그 항목이 매우 계몽적 인 것으로 나타났습니다. http://optimizermagic.blogspot.com/2007/12/outerjoins-in-oracle.html오라클 외부 조인 - 성능

하나 또는 다른 조인 구문이 실제로 더 잘 수행되는 경우가 있습니다. 또한 ANSI보다 Oracle 조인 구문을 선택할 때 약간의 성능 향상 (VLDB에서만 눈에 띄는)이 나타났습니다. 아마 까다로운 일은 아니지만 Oracle DB를 마스터하는 사람들에게는 기사를 검토하는 것이 도움이 될 수 있습니다.


나는 바깥이 오라클에 대한 구문을 조인 알고 : (. 내가 두 번째 샘플 권리의 구문을 가지고 가정)

select a, b 
from table1 
left outer join table2 
on table2.foo = table1.foo 

또는

select a, b 
from table1, table2 
where table2.foo(+) = table1.foo 

이들간에 성능 차이가 있습니까? 처음에는 개발자의 스타일 선호도에 불과하다고 생각했지만 그 다음에는 다른 스타일 대신 하나의 스타일을 사용하는 이유가 있을지 모른다고 생각한 내용을 읽었습니다.

+1

(+)는 비 ANSI 조인의 WHERE 절에 들어갑니다. –

+0

고맙습니다. 아마도 오래된 오라클 방식을 사용하지 않았을 것입니다. SQL Server 세계에서 왔습니다. 나는 그것을 바로 잡을 것이다. 자세한 내용은 – user158017

답변

4

. "어쩌면 다른 대신 한 스타일을 사용하는 이유가 될 것"

이유가 있습니다 만 성능과 관련된 것은 아닙니다. 표준이면서 ANSI 스타일의 외부 조인은 FULL OUTER JOIN과 외부 조인을 여러 테이블에 제공합니다.

+0

에게 감사드립니다. 필자는 표준을 사용하는 아이디어를 선호하지만, ANSI 조인 대신 전통적인 Oracle 조인을 사용할 때 교육하는 주제 목록으로 나열된 일부 교육 자료를 선호합니다. 그것은 나를 궁금하게했다. ANSI 조인을 고수하는 것과 같은 소리는 이식성과 유연성을 위해 아마도 더 의미가 있습니다. – user158017

1

성능 차이는 없습니다. 두 쿼리의 실행 계획을 비교하여 비교할 수도 있습니다.

1

이론적으로 두 번째 쿼리는 두 테이블의 카디 전 곱을 수행 한 다음 조인 조건을 충족하는 테이블을 선택합니다. 실제로는 데이터베이스 엔진이 첫 번째 엔진과 정확히 동일하게 최적화합니다.

2

Oracle9i 이전의 ANSI 구문을 지원하지 않았습니다.

해당 버전 이후로 이러한 쿼리는 동일하게 수행되고 동일한 계획을 산출합니다.

올바른 사전 9i 구문은 이것이다 :

SELECT a, b 
FROM table1, table2 
WHERE table2.foo(+) = table1.foo 
0

내 자신의 질문에 대한 답변으로 몇 가지 추가 정보를 발견했습니다. 3 년 전부터이 문서 에서처럼 오래된 스타일이 매우 제한적인 것처럼 보입니다.

http://www.freelists.org/post/oracle-l/should-one-use-ANSI-join-syntax-when-writing-an-Oracle-application,2

나는 단지 어떤 이유로 쿼리는 오라클의 오래된 버전에서 실행할 수 있습니다 경우 기존 스타일을 사용하는 것이 나을 아마 생각한다.

직장에서 볼 때 거의 모든 것들이 구식이지만, 컨설턴트가 9i 이전부터 오라클에서 일해 왔기 때문에 아마 모든 오래된 것들을 업데이트해야 할 이유가 없을 것입니다.

감사합니다.

0

동일하지 않습니다. 첫 번째 경우에는 테이블을이 순서대로 조인해야합니다. 두 번째 경우 Oracle Planner는 쿼리를 실행하기위한 최상의 옵션을 선택할 수 있습니다.

이 간단한 경우 결과는 모든 실행에서 동일하지만 아마 더 복잡한 경우에 해당 sintax를 사용하면 차이가 표시됩니다.

+1

당신은 옵티마이 저가 더 많은 자유를 누릴 수 있기 때문에 전통적인 오라클 조인 구문이 더 좋다고 말하고 있습니까? ANSI 구문에 합류하면 명령을 받았다는 것을 보여주는 문서가 있습니까? 나는 SQL Server에서 작업했을 때 생각했다. 그러나 오라클에서는 지금까지 "힌트 (hint)"를 추가하지 않는 한 순서대로 물건을 넣는 순서를 보지 못했다. 이것은 흥미로운 생각이지만, 나는 그것을 더 추구 할 것입니다. – user158017