2013-10-16 2 views
0

Oracle 11g를 사용하고 있습니다.오라클보기에서 외부 조인 최적화

나는 1016736 개의 큰 테이블과 2007 개의 로우가있는 작은 테이블을 가지고있다. 이 두 테이블을 하나의보기에 결합하려고합니다.

아래 표와 같이 가입합니다.

나는 가정이,이 작은 테이블에 1,016,736 번보고하여보기를 형성 할 big_table.id = small_table.id (+)

. 이를 위해보다 최적화 된 방법이 있습니까?

쿼리가 현재와 같이 느리고 쿼리를 더 빨리 만들고 싶습니다.

오라클을 처음 접했을 때 어떤 생각이라도 반가워 할 것입니다.

--- EDIT --- 이것은 내 관점의 스크립트입니다.

select a.col1, a.col2, a.col100, b.col1, b.col2, b.col3 
from big_table a, small_table b where a.col1 = b.col1 (+) 
+4

당신이 더 빠른 것을 만들고 싶다면, 전체 쿼리, 테이블의 인덱스 및 쿼리의 설명 계획을 게시해야합니다 .... 그것 없이는 효과적으로 당신을 도울 수 없습니다. – Ben

+0

특정 검색어를 더 빨리 만들려하지 않습니다. 나는보기 '에서 간단한'선택 횟수 (*)를 더 빨리 만들려고 노력하고있다. u가 뷰의 쿼리를 원한다면, 모든 컬럼을 가진 두 테이블의 select이다. bug_table.id = small_table.id (+) – Jeevan

+0

그래서 쿼리는 _just_'big_table에서 카운트 선택 (*)이다. 왼쪽 외부 조인 small_table s on b.id = s.id'? – Ben

답변

0

가입은 OK입니다. 각 테이블의 "Id"에 대한 색인을 만드십시오.

시도 업데이트 통계 : 각 테이블

는 :

당신이 중 하나를 테이블에 배치 어떤 조건없이보기에서 선택하기 위하여려고하는 경우
ANALYZE TABLE XXXX_TABLE DELETE STATISTICS; 

ANALYZE TABLE XXXX_TABLE COMPUTE STATISTICS; 
+0

두 테이블에 대한 인덱스가 이미 있습니다 – Jeevan

+0

이것은 오히려 빠르지 만 1 백만 레코드가 그렇게 많이는 아닙니다. 통계 업데이트 (내 업데이트 된 답변 확인) –

+0

EXEC DBMS_STATS.GATHER_TABLE_STATS ('schema', 'table'); '이미했습니다. 사실, 지금 예정되어 있으며 모든 중반 밤에 실행됩니다. 네가 내 것과 다르니? – Jeevan

2

는 오라클은 카디널리티 조인 추정하는 것입니다 고유 값의 수와 조인 열의 최대 값과 최소값 및 히스토그램이있는 경우 - 투영 된 행 수는 0에서 1016736 x 2007까지입니다 (결합 열이 각각 동일한 단일 값을 갖는 경우). 모든 행)

조인 유형은이 추정에 따라 달라집니다.

일반적으로이 유형의 쿼리에 대한 해시 외부 조인은 쿼리 프로젝션에 필요한 데이터를 읽는 것보다 매우 효율적이며 간신히 비용이 많이들 것입니다.

간단한 계수 (*)의 경우 조인 열에 인덱스가 있고 큰 테이블의 조인 열이 NOT NULL로 제한되거나 (널 값이 인덱스에 포함되도록 일부 방법 사용) 그들은 각각 빠르게 전체 스캔 할 수 있고 그 결과 해시 외부 조인. 성능은 매우 좋을 것입니다.

특정 쿼리가 느린 경우 최적화를 돕기 위해 실행 계획이 필요합니다.