가능한 큰 결과 집합의 하위 집합 만 표시하는 탐색 패널을 만들어야합니다. 이 서브 세트는 결과 레코드 세트 전 20 레코드 및 20 레코드입니다. 탐색 패널을 통해 결과를 탐색 할 때 ROWNUM을 사용하여 슬라이딩 윈도우 디자인을 적용하여 다음 하위 집합을 가져옵니다. 내 질문은 Oracle의 ROWNUM은 원하는 행을 추출하기 전에 전체 테이블을 작성합니까? 아니면 내가 필요로하는 행을 생성하는 것만으로도 지능적입니까? 나는 봤는데 나는 이것에 대한 설명을 찾을 수 없었다.오라클의 ROWNUM은 원하는 행을 추출하기 전에 전체 테이블을 구축합니까?
답변
될 것이다 이러한 작업을 수행하기위한 사전 분석 기능 방법 :
select col1, col2 from (
select col1, col2, rownum rn from (
select col1, col2 from the_table order by sort_column
)
where rownum <= 20
)
where rn > 10
오라클 최적화 단지 내부 쿼리를 만족시키기 위해 상위 20 행을 얻을 필요가있다이 경우에 인식합니다. 예를 들어 정렬 열이 정렬을 완전히 피할 수있는 방식으로 인덱싱되지 않는 한 모든 행을 조사해야하지만 모든 행을 전체 정렬 할 필요는 없습니다.
귀하의 디자인이 계획대로 진행될 것으로 생각하지 않습니다. 오라클은 쿼리에 의해 생성 된 순서대로 ROWNUM에 값을 할당합니다. 생성 된 첫 번째 행에는 ROWNUM = 1이 할당되고 두 번째 행에는 ROWNUM = 2 등이 할당됩니다. ROWNUM = 21이 할당되도록하려면 먼저 쿼리가 먼저 실행되어야합니다 첫 번째 스무 행을 반환 당신은> = 21 쿼리가 먼저 ROWNUM < 모든 행을 반환해야 ROWNUM과 행이있을 위해
SELECT *
FROM MY_TABLE
WHERE ROWNUM >= 21 AND
ROWNUM <= 40
행이 때문에 순서로 반환되지 않습니다라는 쿼리를 작성하여 경우 = 20.
이 정보가 도움이되기를 바랍니다.
귀하의 솔루션은 작동하지 않습니다 (밥은 제대로 지적) 그러나 당신은 당신이 원하는 것을 할 row_number()
을 사용할 수 있습니다 :이 솔루션을 사용하면 최종 결과에 주문할 수 있습니다 추가 혜택을 가지고
SELECT col1,
col2
FROM (
SELECT col1,
col2,
row_number() over (order by some_column) as rn
FROM your_table
) t
WHERE rn BETWEEN 10 AND 20
하는 것으로 원하는 경우 다른 기준.
편집 : 최초의 질문에 대답하는 것을 잊었다 : 위의 솔루션을
을, 예 오라클이 올바른 번호를 찾기 위해 전체 결과를 구축해야합니다.
11g 이상인 경우 query cache을 사용하여 검색어를 개선 할 수 있습니다.
이 솔루션은 대형 테이블에서 페이징하기에는 너무 느립니다. – Vadzim
질문 제목에 대해.
톰 키테 (Tom Kyte)의 http://www.orafaq.com/wiki/ROWNUM 및 this에 대한 자세한 설명을 참조하십시오.
질문의 목표에 관해서.
이 당신을 위해 무엇을 찾고있는 사람이어야한다 : Paging with Oracle
* Tom Kyte * 링크 +1. –
그것은 오래된 질문하지만 당신이 시도해야 - 그것에 대해 http://www.inf.unideb.hu/~gabora/pagination/results.html
네, 감사합니다. 업계 전문가가 특정 문제를 해결하는 데 사용하는 방법을 계속 찾아 볼 것입니다. 내가하려는 일에 대한 정보의 좋은 원천을 알고 있다면 그것을 자유롭게 전달하십시오. – enamrik