2011-07-28 3 views
2

오라클 테이블에서 상위 N 개의 행을 날짜순으로 정렬하고 싶습니다.오라클 상위 N 개의 정렬 된 행

일반적인 방법으로이 솔루션은 내가 찾은 모든 질문에 대해/google을 반환합니다. myTable에 오라클에 리드가 하위 쿼리의 모든 행을 반환하는 데 시간이 너무 오래 복용 할 행의 거대한 액수가 포함되어 있기 때문에

Select * 
from 
(select * from 
myTable 
ordered by Date desc) 
where rownum < N 

이 솔루션은 내 경우에는 불가능하다.

질문 : 하위 쿼리에서 반환 된 ORDERED 행의 수를 제한하는 방법이 있습니까?

답변

12

첫 번째 N을 필터링하기 전에 오라클이 부질의 모든 행을 반환해야한다는 추측이 잘못되었습니다. 은 하위 쿼리에서 행을 가져 오는이고, N 행을 반환하면 입니다.

그런 의미에서, 일 수 있습니다. 오라클은 테이블에서 모든 행을 선택하고 정렬하여 반환해야합니다. 그러나 ORDER BY 절에서 사용되는 열의 색인이있는 경우 그렇지 않을 수 있습니다.

오라클은 다른 DBMS와 같은 위치에 있습니다. 주문하는 열에 인덱스가없는 큰 테이블이있는 경우, 먼저 모든 행을 가져 오지 않고 어떤 행이 최상위 N인지 알 수 있습니다. 그들을 정렬?

1

많은 양의 데이터가있는 경우 주문이 많이 걸릴 수 있습니다. 실행 계획을 살펴보십시오. 데이터가 실시간이 아닌 경우에 당신은 ...

2

질문은, 서브 쿼리에서 반환 ORDERED 행 의 수를 제한하는 방법이 선택의 이러한 종류에 중대한보기를 만들 수 있을까?

select * from (
    select a.*, rownum r 
    from (
    select * 
    from your_table 
    where ... 
    order by ... 
) a 
    where rownum <= :upperBound 
) 
where r >= :lowerBound; 

내가 일반적으로 내부 쿼리에서 정렬 인덱스 컬럼을 사용하고, 사용 :

다음

내가 일반적으로 상위 n 형 쿼리 (매김이 경우 쿼리)를 사용하는 것입니다 rownum은 오라클이 카운트 (스톱 키) 최적화를 사용할 수 있음을 의미합니다. 그러므로 반드시 전체 테이블 스캔을 할 필요는 없습니다 :

create table t3 as select * from all_objects; 
alter table t3 add constraint t_pk primary key(object_id); 
analyze table t3 compute statistics; 

delete from plan_table; 
commit; 
explain plan for 
select * from (
    select a.*, rownum r 
    from (
    select object_id, object_name 
    from t3 
    order by object_id 
) a 
    where rownum <= 2000 
) 
where r >= 1; 

select operation, options, object_name, id, parent_id, position, cost, cardinality, other_tag, optimizer 
from plan_table 
order by id; 

오라클은 t_pk를 사용하여 전체 인덱스 스캔을 수행합니다. 또한 stopkey 옵션 사용에 유의하십시오.

내 대답을 설명하는 희망 :

+1

왜이 질문에 대한 적절한 대답이라고 생각하는지 설명해야합니다. – Allan