sql - 오라클 - 페이징 쿼리 튜닝




오라클과 페이징 (4)

저는 오라클에 익숙하지 않습니다. 250k 레코드가 있는데 페이지 당 100 개씩 표시하고 싶습니다. 현재 데이터 어댑터, 데이터 세트 및 저장된 proc의 결과에 대한 dataadapter.Fill (dataset) 메소드를 사용하여 백만 개의 레코드를 모두 데이터 세트로 검색하는 하나의 저장 프로 시저가 있습니다. "페이지 번호"와 "페이지 당 레코드 수"를 매개 변수로 전달할 수있는 정수 값으로 사용하면 특정 섹션 만 다시 얻는 가장 좋은 방법은 무엇입니까? 예를 들어, 10을 페이지 번호로, 120을 페이지 수로 전달하면 select 문에서 1880부터 1200까지 나올 것입니다. 그런 식으로 내 머리 속의 수학이 꺼져있을 수 있습니다.

.NET에서 C #을 사용하여이 작업을 수행하고 있는데, 중요하지 않다고 생각했습니다. SQL 측에서 올바르게 처리 할 수 ​​있다면 멋지게 될 것입니다.

업데이트 : 나는 Brian의 제안을 사용할 수 있었고 잘 작동하고 있습니다. 몇 가지 최적화 작업을하고 싶지만, 페이지가 1 분에서 4 초에서 5 초 사이에 오르고 내 페이징 컨트롤이 새로운 저장된 procs와 잘 통합 될 수있었습니다.


그냥 대답과 의견을 요약하고 싶습니다. 페이지 매김을하는 데는 여러 가지 방법이 있습니다.

오라클 12c 이전에는 OFFSET / FETCH 기능이 없었기 때문에 @jasonk이 제안한 whitepaper 를 살펴보십시오. 장점과 단점에 대한 자세한 설명과 함께 다른 방법에 대해 내가 찾은 가장 완벽한 기사입니다. 여기에 복사하여 붙여 넣는 데 상당한 시간이 걸릴 것이므로 그렇게하지 않을 것입니다.

또한 jooq 작성자가 Oracle 및 다른 데이터베이스 페이지 매김에 대한 몇 가지 공통적 인주의 사항을 설명하는 좋은 기사가 있습니다. 주크의 블로그 포스트

좋은 소식은 oracle 12c에 새로운 OFFSET / FETCH 기능이 있기 때문입니다. OracleMagazine 12c의 새로운 기능 . "Top-N 쿼리 및 페이지 매김"을 참조하십시오.

다음 명령문을 실행하여 oracle 버전을 확인할 수 있습니다.

SELECT * FROM V$VERSION

다음을 시도하십시오.

SELECT *
FROM
  (SELECT FIELDA,
    FIELDB,
    FIELDC,
    ROW_NUMBER() OVER (ORDER BY FIELDC) R
  FROM TABLE_NAME
  WHERE FIELDA = 10
  )
WHERE R >= 10
AND R   <= 15;

via [tecnicume]


Tom에게 페이지 매김과 매우 유용한 분석 함수에 대해 질문하십시오.

이것은 해당 페이지에서 발췌 한 것입니다.

select * from (
    select /*+ first_rows(25) */
     object_id,object_name,
     row_number() over
    (order by object_id) rn
        from all_objects)
    where rn between :n and :m
        order by rn;

오라클 12c 에는 최신 솔루션을 원하는 사람들을 위해 완벽한 페이징 및 최고의 처리 기능을 포함한 몇 가지 새로운 기능이 있습니다.

페이징

페이징은 다음과 같습니다.

SELECT *
FROM user
ORDER BY first_name
OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;

상위 N 개의 레코드

최상위 레코드를 얻는 방법은 다음과 같습니다.

SELECT *
FROM user
ORDER BY first_name
FETCH FIRST 5 ROWS ONLY

위의 쿼리 예제 모두에 ORDER BY 절이있는 것에 주목하십시오. 새로운 명령은이를 존중하며 정렬 된 데이터에서 실행됩니다.

FETCH 또는 OFFSET 대한 좋은 Oracle 참조 페이지를 찾을 수 없지만 이 페이지 에는 이러한 새로운 기능에 대한 개요가 있습니다.





stored-procedures