programing

Oracle 페이지 번호 매기기 베스트 프랙티스

skycolor 2023. 3. 13. 20:19
반응형

Oracle 페이지 번호 매기기 베스트 프랙티스

문제:의 한 페이지 결과 집합과 총 행 수를 반환하는 저장 프로시저가 필요합니다.

솔루션 A: 2개의 저장 프로시저를 만듭니다.하나는 1페이지의 결과 세트를 반환하고 다른 하나는 스칼라(총 행)를 반환합니다.설명 계획에 따르면 첫 번째 스프로치의 가격은 9이고 두 번째 스프로치의 가격은 3입니다.

SELECT  *
FROM    ( SELECT ROW_NUMBER() OVER ( ORDER BY D.ID DESC ) AS RowNum, ...
        ) AS PageResult
WHERE   RowNum >= @from
    AND RowNum < @to
ORDER BY RowNum

SELECT  COUNT(*)
FROM    ...

B:는 모든 , B: 1을 더한다.TotalRows결과 세트의 모든 행에 번호를 지정합니다.이 솔루션은 해킹적인 느낌이 들지만 비용이 9달러이고 1스프로치밖에 들지 않기 때문에 이 솔루션을 사용하고 싶습니다.

SELECT * 
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY D.ID DESC  ) RowNum, COUNT(*) OVER () TotalRows,
WHERE RowNum >= from
        AND RowNum < to
ORDER BY RowNum;

Oracle 페이지 번호 부여에 대한 모범 사례가 있습니까?전술한 솔루션 중 실제로 가장 많이 사용되는 솔루션은 무엇입니까?그들 중 누구라도 명백히 잘못되었다고 생각되는 사람이 있나요?내 DB는 비교적 작은 크기(10GB 미만)로 유지됩니다.

Oracle 11g과 최신 ODP를 사용하고 있습니다.VS2010 SP1 및 Entity Framework 4.4를 갖춘 NET.EF 4.4 내에서 작동하려면 최종 솔루션이 필요합니다.일반적으로 페이지 번호부여를 위한 더 나은 방법이 있을 거라고 확신하지만 EF와 협력해야 합니다.

( 「」 「 」 「 」 「 。ROW_NUMBER() OVER ...를 사용하면 에 다른 함수를 이 거의 를 사용하면 동일한 파티션에 다른 분석 함수를 추가하면 쿼리에 비용이 거의 들지 않습니다.

페이지 매기는 방법에는 , 그 중 , 이, 른, 른, 른, 그, 그, 그, 그, 그, 그, 그, 그, 그, 그, on, on, on, on, on, on, on, on, on, on, on, on, on, on, on, on,rownum:

SELECT * 
  FROM (SELECT A.*, rownum rn
          FROM (SELECT *
                  FROM your_table
                 ORDER BY col) A
         WHERE rownum <= :Y)
 WHERE rn >= :X

이 방법은 주문 열에 적절한 인덱스가 있는 경우 더 우수합니다.이 경우 두 개의 쿼리(총 행 수, 결과 값)를 사용하는 것이 더 효율적일 수 있습니다.

두 가지 방법 모두 적절하지만 일반적으로 행 수와 페이지 지정 세트를 모두 원하는 경우 행을 한 번만 쿼리하므로 분석을 사용하는 것이 더 효율적입니다.

다음과 같은 이점이 있습니다.

   SELECT * FROM 
     ( SELECT deptno, ename, sal, ROW_NUMBER() OVER (ORDER BY ename) Row_Num FROM emp)
     WHERE Row_Num BETWEEN 5 and 10;

Oracle 12C를 할 수 .LIMIT ★★★★★★★★★★★★★★★★★」OFFSET페이지 번호부여를 위해.

- 표가 해 보겠습니다.tab가 있습니까?DATE 컬럼 " " " "dt페이지 번호를 사용하여 내림차순으로 정렬합니다.

page_size:=5

select * from tab
order by dt desc
OFFSET nvl(page_no-1,1)*page_size ROWS FETCH NEXT page_size ROWS ONLY;

설명:

page_no=1 page_size=5

OFFSET 0 ROWS FETCH NEXT 5 ROWS ONLY첫만 가져오기 - 5행만 가져오기

page_no=2 page_size=5

OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY - 5행 가져오기

기타 등등.

참조 페이지 -

https://dba-presents.com/index.php/databases/oracle/31-new-pagination-method-in-oracle-12c-offset-fetch

https://oracle-base.com/articles/12c/row-limiting-clause-for-top-n-queries-12cr1#paging

SQL 코드를 깔끔하게 정리하는 방법은 다음과 같습니다.WITH진술.

축소판 구현에서는 총 결과 와 총 페이지 수도 표시됩니다.

예를들면

WITH SELECTION AS (
    SELECT FIELDA, FIELDB, FIELDC FROM TABLE), 
NUMBERED AS (
    SELECT 
    ROW_NUMBER() OVER (ORDER BY FIELDA) RN, 
    SELECTION.*
    FROM SELECTION)
SELECT
    (SELECT COUNT(*) FROM NUMBERED) TOTAL_ROWS,
    NUMBERED.*
FROM NUMBERED
WHERE 
    RN BETWEEN ((:page_size*:page_number)-:page_size+1) AND (:page_size*:page_number)

이 코드는 다음 두 개의 필드가 포함된 페이지 결과 세트를 제공합니다.

  • TOTAL_ROWS의 전체 행과 함께SELECTION
  • RN레코드의 행 번호

여기에는 2개의 파라미터가 필요합니다.:page_size그리고.:page_number자르다SELECTION

축소판

선택 항목이 이미 구현되었습니다.ROW_NUMBER()들판

WITH SELECTION AS (
    SELECT 
        ROW_NUMBER() OVER (ORDER BY FIELDA) RN,
        FIELDA, 
        FIELDB, 
        FIELDC 
    FROM TABLE) 
SELECT
    :page_number PAGE_NUMBER,
    CEIL((SELECT COUNT(*) FROM SELECTION ) / :page_size) TOTAL_PAGES,
    :page_size PAGE_SIZE,
    (SELECT COUNT(*) FROM SELECTION ) TOTAL_ROWS,
    SELECTION.*
FROM SELECTION 
WHERE 
    RN BETWEEN ((:page_size*:page_number)-:page_size+1) AND (:page_size*:page_number)

이것을 시험해 보세요.

select * from ( select * from "table" order by "column" desc ) where ROWNUM > 0 and ROWNUM <= 5;

나도 비슷한 문제에 직면했다.위의 모든 솔루션을 시도해 봤지만 이보다 더 나은 성능을 제공하는 솔루션은 없었습니다.수백만 장의 레코드가 있는 테이블이 있는데 20페이지 단위로 화면에 표시해야 합니다.저는 이 문제를 해결하기 위해 다음과 같이 했습니다.

  1. 테이블에 새 열 ROW_NUMBER를 추가합니다.
  2. 열을 기본 키로 만들거나 고유한 인덱스를 추가합니다.
  3. 인구 프로그램(내 경우 Informatica)을 사용하여 열을 로넘으로 채웁니다.
  4. between 문을 사용하여 테이블에서 레코드를 가져옵니다(ROW_NUMBER WHERE WHER_RANGE와 UPER_RANGE 사이의 테이블에서 선택).

이 메서드는 큰 테이블에서 무조건 페이지 페치를 수행해야 하는 경우에 효과적입니다.

죄송합니다. 이것은 정렬과 함께 작동합니다.

SELECT * FROM (SELECT ROWNUM rnum,a.* FROM (SELECT * FROM "tabla" order by "column" asc) a) WHERE rnum BETWEEN "firstrange" AND "lastrange";

언급URL : https://stackoverflow.com/questions/13738181/best-practice-for-pagination-in-oracle

반응형