복붙노트

[SQL] 오라클과 페이징

SQL

오라클과 페이징

내가 싶습니다 나는 오라클을 잘 알고로 아닙니다. 좀 250K 기록을 가지고 있고, 나는 그들에게 페이지 당 100을 표시합니다. 현재 나는 데이터 어댑터를 사용하여 데이터 세트 및 데이터 세트 및 저장된 프로 시저의 결과에 dataadapter.Fill (세트) 방법으로 만 기록의 모든 분기를 검색 한 저장 프로 시저가 있습니다. 내가 정수 값으로 "페이지 번호"와 "페이지 당 레코드 수"가 있다면 내가 다시 그냥 특정 섹션을 얻을 수있는 가장 좋은 방법이 될 것입니다 무엇을 매개 변수로 전달할 수 있습니다. 내가 선택 문에서, 페이지 수와 같은 페이지 번호로 10, 120을 전달하면 말, 그것은 나에게 그와 같은 1,200번째을 통해 1천8백80번째, 또는 무언가를 줄 것이다, 내 머리에 내 수학이 꺼져있을 수 있습니다.

그때 나는 멋진해야한다, 내가 바로 SQL 측에 그것을 얻을 수있는 경우 즉, 중요하지 않아 생각의 C #과 .NET에서이 일을하고 있습니다.

업데이트 : 브라이언의 제안을 사용할 수 있었고, 그것은 큰 노력하고 있습니다. 나는 몇 가지 최적화 작업 할 싶지만 페이지가 4 ~ 5 초보다는 분에오고, 내 페이징 제어 나의 새로운 저장 발동 매우 잘 통합 할 수 있었다.

해결법

  1. ==============================

    1.이런 식으로 뭔가 작업을해야합니다 : 프랑스어 보우마의 블로그에서

    이런 식으로 뭔가 작업을해야합니다 : 프랑스어 보우마의 블로그에서

    SELECT * FROM
    (
        SELECT a.*, rownum r__
        FROM
        (
            SELECT * FROM ORDERS WHERE CustomerID LIKE 'A%'
            ORDER BY OrderDate DESC, ShippingDate DESC
        ) a
        WHERE rownum < ((pageNumber * pageSize) + 1 )
    )
    WHERE r__ >= (((pageNumber-1) * pageSize) + 1)
    
  2. ==============================

    2.페이지 매김하고 매우 유용한 분석 기능에 톰에게 문의하십시오.

    페이지 매김하고 매우 유용한 분석 기능에 톰에게 문의하십시오.

    이는 해당 페이지에서 발췌 한 것입니다 :

    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;
    
  3. ==============================

    3.보다 현대적인 솔루션을 찾는 사람들을위한 완전성의 관심에서, 오라클 12C 더 나은 페이징과 최고의 핸들링을 포함한 몇 가지 새로운 기능이 있습니다.

    보다 현대적인 솔루션을 찾는 사람들을위한 완전성의 관심에서, 오라클 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 또는 오프셋에 대한 좋은 오라클 참조 페이지를 찾을 수 없습니다하지만이 페이지는 이러한 새로운 기능의 훌륭한 개요를 가지고있다.

    공연

    아래의 코멘트에 밖으로 @wweicker 점으로, 성능은 12C의 새로운 구문 문제입니다. 오라클은 이후 개선 된 경우 나 시험에 18C의 사본을 가지고 있지 않았다.

    흥미롭게도, 내 실제 결과는 약간 내 테이블에 새로운 방법 (113,000,000 + 행)에 쿼리를 실행 한 첫 번째 시간을 빨리만큼 반환 된 :

    @wweicker가 언급 한 바와 같이 그러나이 계획 외모 새로운 방법에 대한 훨씬 더 설명 :

    새로운 구문은 전체 비용이었다 내 컬럼에 인덱스의 전체 검사를 일으켰습니다. 인덱싱되지 않은 데이터를 제한 할 때 기회는 상황이 더 악화.

    하자의 이전 데이터 세트의 단일 인덱싱되지 않은 열을 포함하여 보라 :

    요약 :주의 사용 오라클이 처리를 개선 할 때까지. 당신이 작업에 대한 색인이있는 경우, 아마 당신은 새로운 방법을 사용하여 멀리 얻을 수 있습니다.

    다행스럽게도 필자는 곧 놀 18C의 사본을해야하고 업데이트 할 수 있습니다

  4. ==============================

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

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

    오라클 12C 이전에 더 그래서 @jasonk이 제안 백서에서 살펴보고, 기능을 FETCH / 오프셋되지 않았다있다. 내가 장점과 단점에 대한 자세한 설명과 다른 방법에 대해 발견 된 가장 완벽한 기사입니다. 나는 그것을하지 않습니다 그래서, 여기에 복사 - 붙여 상당한 시간이 걸릴 것입니다.

    Oracle 및 다른 데이터베이스 매김 몇 가지 일반적인주의 사항을 설명 jooq 제작자에서 좋은 기사가있다. jooq의 블로그 게시물

    우리는 오프셋 새가 오라클 12C 이후 좋은 소식 / 기능을 가져옵니다. OracleMagazine의 12C 새로운 기능을 제공합니다. "최고-N 쿼리 및 페이지 매김"을 참조하십시오

    다음 문을 발행하여 오라클 버전을 확인할 수 있습니다

    SELECT * FROM V$VERSION
    
  5. ==============================

    5.다음을 시도해보십시오

    다음을 시도해보십시오

    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;
    

    비아 [tecnicume]

  6. from https://stackoverflow.com/questions/241622/paging-with-oracle by cc-by-sa and MIT license