Oracle 상위 10개 레코드 선택: 필터링, 정렬 및 최적화
Oracle에서 상위 10개 레코드를 검색하는 것은 일반적으로 간단하지만 필터를 추가하고 성능 우선 순위를 지정하는 것은 어려운 일입니다. 최근 스택 오버플로 질문에서는 특정 조건을 충족하는 레코드를 제외하고 특정 열을 기준으로 상위 10개 레코드를 선택하는 데 초점을 맞춰 이를 강조했습니다.
원래 쿼리와 단점
초기 SQL 쿼리는 Null이 아닌 저장 용량, 특정 날짜의 레코드 제외, 저장 용량별 내림차순 등 여러 기준에 따라 고유한 레코드를 선택하는 것을 목표로 했습니다. 그러나 쿼리는 결과를 상위 10개로 올바르게 제한하지 못했습니다.
<code class="language-sql">SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') </code>
ROWNUM <= 10
절이 처리되기 ROWNUM
전에 가 할당되기 때문에 이 쿼리에 ORDER BY
를 추가하는 것만으로는 올바른 상위 10개가 생성되지 않습니다.
해결책: 하위 쿼리 접근 방식
필터링과 정렬을 올바르게 적용하기 위해 하위 쿼리를 사용하는 효과적인 솔루션은 다음과 같습니다.
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009') ORDER BY STORAGE_GB DESC ) WHERE ROWNUM <= 10</code>
이 중첩 구조는 레코드가 먼저 정렬된 다음 상위 10개가 선택되도록 보장합니다.
성능 개선
순서 수정 외에도 EXISTS
대신 NOT IN
을 사용하면 성능이 크게 향상됩니다. EXISTS
일반적으로 더 나은 최적화 기회를 제공하여 조인을 최소화하고 쿼리 실행 속도를 향상시킵니다.
위 내용은 필터링 및 정렬을 통해 Oracle에서 상위 10개 레코드를 효율적으로 선택하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!