문제

Oracle에서 행 존재에 대한 쿼리를 할 때 SELECT가 Select Count (*)보다 빠른 이유는 무엇입니까?

도움이 되었습니까?

해결책

Oracle은 PL/SQL에 존재하는 경우 지원하지 않기 때문에 CodeBymidnight의 사용 제안은 일반적으로 다음과 같은 것으로 수행됩니다.

SELECT 1 
  INTO l_local_variable 
  FROM dual 
 WHERE EXISTS( 
    SELECT 1 
      FROM some_table 
     WHERE some_column = some_condition ); 

Oracle은 한 행을 발견하자마자 위치 조항 처리를 중지 할 수 있다는 것을 알고 있으므로 기준과 일치하는 많은 수의 행을 잠재적으로 계산할 필요가 없습니다. 물론 이것은 특정 키가있는 행이 존재하지 않는 열과 관련된 조건을 확인하거나 많은 수의 행이 반환 될 수있는 조건을 확인하는 것보다 특정 키가있는 행이 있는지 확인하는 경우 문제가 아닙니다.

(참고 : codebymidnight의 게시물에 댓글로 이것을 게시 할 수 있기를 바랍니다. 그러나 주석에는 형식화 된 코드가 포함될 수 없습니다).

업데이트 : 설명에 대한 설명이 주석으로 작성된 원래 포스터를 설명하면 짧고 결정적인 대답은 다음과 같습니다. SELECT 1 또는 SELECT COUNT(1) a보다 빠르지 않습니다 SELECT COUNT(*). 보고있는 코딩 가이드 라인과는 달리 COUNT(*) 모든 행을 계산하는 선호하는 방법입니다. a COUNT(1) 더 빨랐습니다. 최소한, 그것은 지난 10 년 동안 출시 된 Oracle 버전에서는 사실이 아니며 사실이었을 것 같지는 않습니다. 그러나 그것은 널리 알려진 믿음이었습니다. 오늘날, 코드 COUNT(1) a보다는 COUNT(*) 일반적으로 저자가 다양한 오라클 신화를 믿기 쉬운 것으로 의심합니다. COUNT(*).

다른 팁

RDBMS가 지원하는 경우에도 여전히 사용되는 것이 좋습니다. 또는 동등한 일을 찾는 즉시 행을 처리하지 않기 때문입니다.

Select Count (*)가 올바르게 최적화되지 않았다면 열 관련 처리가 없으므로 모든 열에로드 할 필요가 없습니다.

별은 모든 콜을 카운트로 가져 가기 때문에 "1"은 기본 데이터 유형입니다.

MySQL에서 "select count (name_of_the_primary_key)"는 선택 1. 계산 된 색인만큼 빠르야합니다. 인덱스의 카운트 ()는 매우 빠르야합니다.)

나는 이것이 Oracle에게 사실이라고 생각하지 않습니다.http://justoracle.blogspot.com/2006/12/count-vs-count1.html

그러나 일부 데이터베이스에서 그 이유는 '*'가 테이블 메타 데이터를 방문해야하기 때문입니다. 이것은 필요없는 오버 헤드를 추가하는 경향이 있습니다. 여기서 1은 단지 문자 그대로입니다.

다른 모든 것들이 평등합니다. "select 1 from my_table" 반환합니다 첫 번째 결과보다 빠르게 결과 "select count(*) from my_table", 그러나 쿼리에서 모든 결과를 검색하면 count(*) 하나는 훨씬 적은 데이터가 필요하기 때문에 더 빠릅니다 (테이블의 각 행당 1 정수와 달리 1 정수).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top