Oracle에서 row_number 속도를 높이려면 어떻게 해야 합니까?
다음과 같은 SQL 쿼리가 있습니다.
SELECT * FROM(
SELECT
...,
row_number() OVER(ORDER BY ID) rn
FROM
...
) WHERE rn between :start and :end
본질적으로, 일의 속도를 늦추는 것은 부품별 주문입니다.제거할 경우 EXPLAINE 비용이 10배 이상(1000배 이상) 낮아집니다.나는 이것을 시도해 봤습니다.
SELECT
...
FROM
...
WHERE
rownum between :start and :end
하지만 이것은 정확한 결과를 주지 못합니다.이것의 속도를 높일 수 있는 쉬운 방법이 있습니까?아니면 EXPLAINE 도구를 사용하는 데 시간을 좀 더 써야 합니까?
ROW_NUMBER상당히 비효율적입니다.Oracle.
성능에 대한 자세한 내용은 블로그의 기사를 참조하십시오.
특정 쿼리를 위해 다음으로 대체하는 것이 좋습니다.ROWNUM인덱스가 사용되는지 확인합니다.
SELECT *
FROM (
SELECT /*+ INDEX_ASC(t index_on_column) NOPARALLEL_INDEX(t index_on_column) */
t.*, ROWNUM AS rn
FROM table t
ORDER BY
column
)
WHERE rn >= :start
AND rownum <= :end - :start + 1
이 쿼리는 다음을 사용합니다.COUNT STOPKEY
또한 당신을 확인하든지.columnnull 또는 add가 아닙니다.WHERE column IS NOT NULL조건.
그렇지 않으면 인덱스를 사용하여 모든 값을 검색할 수 없습니다.
사용할 수 없습니다.ROWNUM BETWEEN :start and :end재조회 없이
ROWNUM항상 맨 마지막에 할당되고 맨 마지막에 확인됩니다.ROWNUM항상 빈틈없이 질서를 유지하고 있습니다
사용하는 경우ROWNUM BETWEEN 10 and 20, 다른 모든 조건을 만족하는 첫번째 행은 일시적으로 다음과 같이 할당된 반환 후보가 됩니다.ROWNUM = 1의 테스트를 통과하지 못합니다.ROWNUM BETWEEN 10 AND 20.
다음 행은 다음 행으로 할당된 후보입니다.ROWNUM = 1실패 등의 이유로, 마지막으로 행이 반환되지 않습니다.
이것은 퍼팅으로 해결해야 합니다.ROWNUM서브쿼리에 들어가 있습니다.
제가 보기엔 페이지 조회 같아요.
이 ASKTOM 기사(페이지 내 약 90%)에서:
ROW_NUMBER가 매번 행에 결정적으로 할당되도록 이러한 페이지 쿼리에 대해 고유한 순서를 지정해야 합니다.
또한 당신의 문의는 거의 같은 수준이 아니기 때문에 하나와 다른 하나의 비용을 비교하면 어떤 이점이 있는지 잘 모르겠습니다.
열별 주문 색인이 작성되어 있습니까?그렇지 않다면 거기서부터 시작하는 것이 좋습니다.
문제의 일부는 '시작'부터 '끝'까지의 기간이 얼마나 크고 그들이 '어디에' 사느냐는 것입니다.테이블에 100만개의 행이 있는데 567,890개에서 567,900개의 행을 원한다면 전체 테이블을 통과하고 id로 거의 모든 것을 분류하고 어떤 행이 그 범위에 속하는지 계산해야 합니다.
간단히 말해서, 작업량이 많기 때문에 옵티마이저는 비용이 많이 듭니다.
그것은 또한 지수가 많은 도움을 줄 수 있는 것이 아닙니다.지수는 순서를 알려주겠지만, 기껏해야 시작할 수 있는 곳을 제공하고 나서 567,900번째 엔트리에 도달할 때까지 계속해서 읽게 됩니다.
최종 사용자에게 한 번에 10개의 항목을 보여주는 경우 DB에서 상위 100개를 잡고 앱이 100개를 10개의 청크로 분해하도록 하는 것이 가치가 있을 수 있습니다.
EXPLAINE PLAN 도구를 사용하여 더 많은 시간을 보냅니다.TABLE SCAN이 나타나면 쿼리를 변경해야 합니다.
당신의 질문은 저에게는 별 의미가 없습니다.ROWID를 조회하는 것은 문제를 요청하는 것 같습니다.그 쿼리에는 관계 정보가 없습니다.문제가 있는 것이 실제 쿼리입니까, 아니면 문제를 설명하기 위해 만든 예시입니까?
언급URL : https://stackoverflow.com/questions/827108/how-can-i-speed-up-row-number-in-oracle
'programing' 카테고리의 다른 글
| Android 내장 메모리에서 비트맵/이미지 저장 및 읽기 (0) | 2023.09.06 |
|---|---|
| mysql에서 time_format을 선택하는 이유(DATE_ADD(time('23:30')), INTERVAL 50MINET, "%k:%i") 반환은 0:20이 아닌 24:20입니다. (0) | 2023.09.06 |
| LabVIEW를 MySQL Maria에 연결하려면 어떻게 해야 합니까?DB (0) | 2023.09.06 |
| SQL providerweb.config의 이름 (0) | 2023.09.06 |
| 약속 가져오기 본문 읽기 (0) | 2023.09.06 |