IT

주문 기준으로 카운트 선택(*)

itgroup 2023. 10. 15. 17:13
반응형

주문 기준으로 카운트 선택(*)

다음의 두 쿼리는 같은 방식으로 실행됩니까?

SELECT COUNT(*) from person ORDER BY last_name;

그리고.

SELECT COUNT(*) from person;

어느 쪽이든 동일한 결과를 표시해야 하므로, 저는 그 결과가 궁금했습니다.ORDER BY그냥 무시당합니다.

제가 질문하는 이유는 데이터베이스에서 한 번에 20개의 레코드를 얻을 수 있는 페이지가 표시된 테이블을 표시한 다음 총 레코드 수를 세는 두 번째 쿼리를 실행하고 있기 때문입니다.처음 쿼리에서 사용한 것과 동일한 기준을 사용해야 하는지 아니면 기준에서 모든 정렬을 제거해야 하는지 알고 싶습니다.

실행 계획에 따르면 두 쿼리는 다릅니다.예를 들어, 다음과 같은 쿼리가 있습니다.

select count(*) from USER

다음을 제공합니다.

INDEX (FAST FULL SCAN)  3.0 3   453812  3457        1   TPMDBO  USER_PK FAST FULL SCAN  INDEX (UNIQUE)  ANALYZED

보시다시피 해당 테이블의 기본 키인 USER_PK를 누릅니다.

색인되지 않은 열로 정렬하는 경우:

select count(*) from USER ORDER BY FIRSTNAME --No Index on FIRSTNAME

알아보겠습니다.

TABLE ACCESS (FULL) 19.0    19  1124488 3457    24199   1   TPMDBO  USER    FULL    TABLE   ANALYZED    1

즉, 전체 테이블 검색을 수행했습니다(노드 비용이 훨씬 높음).

기본 키(이미 인덱스)로 정렬하면 Oracle은 인덱스를 사용하여 다음과 같이 정렬할 수 있습니다.

INDEX (FAST FULL SCAN)  3.0 3   453812  3457    13828   1   TPMDBO  USER_PK FAST FULL SCAN  INDEX (UNIQUE)  ANALYZED

첫 번째 실행 계획과 매우 비슷해 보입니다.

그래서, 여러분의 질문에 대한 답은 절대 아닙니다. 그들은 같지 않습니다.그러나 Oracle이 이미 찾고 있는 인덱스를 기준으로 주문하면 동일한 쿼리 계획이 생성될 수 있습니다.

물론 그렇지 않습니다.성이 기본 키이고 사용자가 이미 명령을 받은 경우가 아니라면요.

Oracle 쿼리 옵티마이저는 실제로 첫 번째 버전에 대해 정렬을 수행하지만(설명 계획을 보고 확인했습니다), 두 쿼리 모두 하나의 행만 반환하므로 성능 차이가 매우 적을 것입니다.

편집:

마이크의 대답은 정확합니다.성능 차이가 상당할 수 있습니다.

언급URL : https://stackoverflow.com/questions/9070527/select-count-with-an-order-by

반응형