2013-08-30 4 views
1

내가 모든 행의 반환하는 초 소요 (여러 개의 데이터베이스 링크를 통해 뷰의 여러 레이어를 사용하여) 매우 복잡 볼 수 있습니다. 그러나 별개의 행을 요구할 때 상당히 많은 시간이 걸립니다. 4 분 후 나는 기다리지 않았다. 즉,이 방법은, 헤이별개의 마지막

select a, b from compicated_view; -- takes 1 sec (returns 6 rows) 
select distinct a, b from compicated_view; -- takes at least 4 minutes 

내가 꽤 이상한 것을 발견,하지만 :

가능한 한 내 자신을 명확하게합니다. 오라클은 그 쿼리를 계획 할 때 뭔가를 망쳤다 고 생각합니다. 오라클이 뚜렷한 선택없이 먼저 선택을 완료하도록 한 다음, 결과에서 "select distinct *"를 수행하는 방법이 있습니까? 최적화 도구에 대한 힌트를 살펴 보았지만 고유가 적용되는 순서를 암시하는 것에 대해서는 아무 것도 찾을 수 없습니다 (처음으로 쿼리를 최적화하는 것은 처음입니다 : - /).

나는 오라클 10g EE에서 Oracle SQL Developer를 사용하고 있습니다.

+2

는 "모든"행은 1 초 실행에서 반환 된 당신에게 확실합니까? SQL 개발자와 작업 할 때 엔진은 부분 레코드 집합을 반환하고 표시합니다. 아래로 스크롤하면 더 많은 레코드를 사용할 수있게되고 디스플레이로 수정됩니다. 따라서 레코드가 반환 된 것처럼 보입니다. 실제로는 부분 집합 만 있습니다. – xQbert

+0

@xQbert 그래, 그냥 6 행이야. – dijxtra

+1

둘 다 실행 계획이 어떻게됩니까? – xQbert

답변

2

시도 :

SELECT DISTINCT A,B FROM (
    SELECT A,B FROM COMPLICATED_VIEW 
    WHERE rownum > 0); 

이 힘은 하위 쿼리를 실현하고 밀어보기 병합/술어에서 방지하고 보기의 원래 계획을 바꿀 가능성이 있습니다.

또한 NO_MERGE 힌트를 시도 할 수 있습니다 :

SELECT /*+ NO_MERGE(alias) */ 
    DISTINCT a,b 
FROM ( 
    SELECT a,b FROM COMPLICATED_VIEW 
) alias 
+0

rownum 트릭이 작동하는 곳. NO_MERGE가 도움이되지 않았습니다. 귀하의 답변 주셔서 감사합니다! – dijxtra

0

당신이 세부 사항을 게시하지 않은 때문에 ... 다음을 시도해보십시오 :

SELECT DISTINCT A,B 
FROM 
(SELECT A,B FROM COMPLICATED_VIEW); 
+0

시도해 보니 영원히 실행됩니다. 어떤 종류의 세부 사항을 원하십니까? 원하는 경우 pastebin에 실행 계획을 게시 할 수 있습니다. – dijxtra

+1

'구별 A, B를 선택 해보 (A를 선택 B FROM COMPLICATED_VIEW WHERE ROWNUM> 0) '이 힘 부질 구체화 및 추진 뷰 병합/술어로부터 방지하고 뷰의 원래 계획을 변경하는 것으로한다. 또한 NO_MERGE 힌트를 시도 할 수 있습니다 : 'SELECT/* + NO_MERGE 복합 뷰 병합을 비활성화하면 거의 확실히 올바른 접근 방식이다 @kordirko – krokodilko

+0

alias' (별칭) (COMPLICATED_VIEW에서 선택 *) FROM */DISTINCT *. 그 의견을 답으로 게시해야합니다. –