2011-02-11 5 views
2

oracle에서 UNION을 사용하여 두 테이블을 암시 적으로 정렬합니까? 설명 계획 창에 표시된 바와 같이 'SORT UNIQUE'가 표시되기 때문에 나타납니다.UNION에서 정렬

제 질문은 기본적으로 어떻게 또는 어떤 열을 기준으로 정렬합니까?

답변

0

네 종류 당신은 일종의 보장이 필요하지

+2

이렇게하면 주문 기준을 사용하지 않아도 결과가 정렬되는 기본 열이나 프로세스가 없습니다. 왜냐하면 나는 그것이 당신이 검색 한 첫 번째 컬럼을 사용하여 먼저 정렬 된 다음 다른 컬럼이 먼저 정렬 된 것처럼 SELECT 문의 배열을 사용하여 정렬 된 것으로 생각했기 때문입니다. 이거 잘못 생각하고 있니? – Jenny

+0

-1 "예는 중복을 제거하기 위해 정렬이 암시 적입니다"최적화 프로그램은 중복을 제거하기 위해 해시 테이블을 사용하기로 결정할 수 있습니다. –

+0

@ 제니 : 네, 틀 렸습니다. 'order by'가 없으면 데이터베이스는 임의의 순서로 행을 반환 할 수 있으며 매번 같은 순서로 반환 할 것이라고 보장 할 수 없습니다. 당신은 자신에 대한 이전의 주장을 확인할 수 있습니다 :'select table_name from dictionary' (또는 다른 큰 시스템 테이블)을 시도하십시오. – Allan

8

정렬 당신이 원하는 얻을 수 있도록 모든 노동 조합 후 ORDER BY를 사용하려는 그러나 경우, UNION ALL 같은 중복 포함되지 않습니다 UNION 때문에 중복을 제거하기 위해 암시 적 유일성을 강화하여 적어도 부분적으로 정렬을 수행해야합니다. 이론상으로, 다른 메커니즘 (예 : 파티션 키가 겹침을 보장하지 않는 지정된 파티션에서 선택)에 의해 고유성을 보장 할 수있는 경우, 그렇지 않을 수도 있지만 아직 그 예를 보지 못했습니다.

그러나 해시 정렬을 사용할 수 있으므로 정렬 된 출력을 생성 할 필요가 없습니다. 즉, 모든 'A'단어를 하나의 양동이에, 모든 'B'단어를 다음 단어에 붙여 넣는 식입니다. 개별 버킷의 내용은 정렬되지만 쿼리는 'A'버킷 앞에 'B'버킷의 결과를 반환 할 수 있습니다.

9i에서 10g 사이 인 Oracle은 GROUP BY를 수정하여 종종 해시 정렬을 수행했습니다. 결과적으로 GROUP BY가 분류 된 결과물을 의미한다는 것을 당연한 것으로 받아 들인 많은 사람들이 잡혔습니다.

+2

+1하지만, "해시 정렬"대신에 "해시 그룹화"를 의미 할 것입니다. –

4

옵티마이 저는 union, group bydistinct과 같은 일을 수행 할 때 고유성을 보장하는 다양한 방법을 제공합니다. 시간이 지남에 따라 오라클이 옵티 마이저를 개선함에 따라 새로운 방법이 도입 될 것입니다. 가끔은 일종의 것입니다. 그러나 그것이 일종의 보장 일지는 모르겠지만, 오늘 일종의 정렬을 사용하더라도 내일이 아닐 수도 있습니다.

출력을 정렬해야하는 경우이를 보장하는 유일한 방법은 order by 절입니다. order by 오라클이 없으면 (모든 SQL 데이터베이스와 관련하여) 임의의 순서로 행을 반환 할 수 있습니다.

+0

@cyberkiwi : 학자가되어서 죄송합니다. 오라클은 그룹화 할 추가 방법을 추가했습니다. 옵티마이 저가 적은 자원으로 계획을 실행할 것으로 판단하면 오라클은 해시 테이블 대신 일반 정렬을 계속 사용할 수 있습니다. 나는 해쉬 테이블로 대체 된 정렬을 제거하는 스위치를 사용한다. 따라서 쿼리는 오늘 그룹화/합집합/기타 정렬 할 수 있으며 내일 해시 테이블로 변경되며 2013 년 12gR2로 업그레이드 할 때 아직 빌드되지 않은 항목이 변경됩니다. –

+0

12cR2를 의미합니까? ;-) –