select count (*)와 select count (any_non_null_column)의 차이점은 무엇입니까?


58

나는 (Oracle에서) uttering select count(*) from any_tableselect count(any_non_null_column) from any_table.

이 두 진술의 차이점은 무엇입니까?

답변:


72
  • COUNT (*)는 NULLS를 포함합니다
  • COUNT (열 _ 또는 식)은 그렇지 않습니다.

이는 차이를 유발할 NULL 값이 없기 때문에 물론 COUNT(any_non_null_column)동일하게 제공됨을 의미 COUNT(*)합니다.

일반적으로 색인을 생성하거나 SARGable을 COUNT(*)사용할 수 없기 때문에 모든 색인을 사용할 수 있으므로 더 좋습니다COUNT(column_or_expression)

에서 ANSI-92 ( "찾기 Scalar expressions 125")

케이스:

a) COUNT (*)가 지정되면 결과는 T의 카디널리티입니다.

b) 그렇지 않으면 TX가 <값 표현식>을 T의 각 행에 적용하고 널값을 제거한 결과 인 단일 컬럼 테이블이되게하십시오. 하나 이상의 널값이 제거되면 완료 조건이 발생합니다. 경고-설정된 함수에서 널값이 제거됩니다.

동일한 규칙이 너무 SQL Server 및베이스에 적용 적어도

참고 : 1은 널 입력 불가능 표현식이므로 COUNT (1)은 COUNT (*)와 같습니다.


4
완벽을 기하기 위해 : Oracle은 인덱스 된 널이 아닌 열에서 인덱스 스캔을 count(*)사용합니다.
a_horse_with_no_name

나는 세 가지 옵션을 생각했다 COUNT(*), COUNT(<constant>)그리고 COUNT(<column name>)세 가지가 접두어로 될 수 있고 ALL또는 DISTINCT(을 디폴트 ALL생략하는 경우). 나는 당신이 말하는 곳에서 어떤 표현을 사용할 수 있는지 궁금합니다 _or_expression.
언젠가

2
COUNT(1)쓸모없는 예로서 @oneday 와 같습니다 COUNT(*). COUNT(CASE WHEN a>b THEN 1 END)예를 들어 a> b.
ypercubeᵀᴹ

16

Oracle의 최신 버전 (예 : 8.x + ) 에서는 동일한 작업수행합니다 . 다시 말해서 의미 상 유일한 차이점은 다음과 같습니다.

select count(*) from any_table

하고 싶은 일을 쉽게 읽을 수 있고 분명합니다.

select count(any_non_null_column) from any_table

읽기 어렵습니다

  1. 더 길다
  2. 덜 알아볼 수있다
  3. any_non_null_column실제로 다음과 같이 시행 되는지 여부 를 고려해야합니다not null

짧은에서 사용count(*)



1

Oracle8i Certified Professional DBA 인증 시험 가이드 (ISBN 0072130601) , 78 페이지 책에서 COUNT (1)은 모든 열의 Null 허용 여부에 대한 데이터 사전을 확인하기 위해 특정 메커니즘이 작동하기 때문에 COUNT (*) 보다 실제로 더 빠르게 실행됩니다. COUNT (*)를 사용할 때 적어도 null이 아닌 첫 번째 열 ) . COUNT (1)은 이러한 메커니즘을 무시합니다.

MySQL은 'tblname의 SELECT COUNT (1);에 대한 속임수; 테이블 수에 대한 테이블 헤더를 읽어 MyISAM 테이블에서. InnoDB는 매번 계산합니다.

데이터베이스에 관계없이 COUNT (1)이 COUNT (*)보다 빠르게 실행되는지 테스트하려면 다음을 실행하고 실행 시간을 스스로 판단하십시오.

SELECT COUNT(1) FROM tblname WHERE 1 = 1;
SELECT COUNT(*) FROM tblname WHERE 1 = 1;
SELECT COUNT(column-name) FROM tblname WHERE 1 = 1;

이는 COUNT 기능이 스토리지 엔진 또는 RDBMS에 관계없이 동일한 레벨의 경기장에서 작동하게합니다.


8
시험 안내가 잘못되었습니다. Oracle count (*) = count (1) (적어도 버전 7 이후). 참조 asktom.oracle.com/pls/asktom/... (이미 @JackPDouglas에 의해 참조)
레이 Riffel

3
흥미 롭군 COUNT (*)는 ANSI 사양에 따라 열을 전혀 확인하지 않아야합니다. 얼마 전에 SQL Server에 대해 SO에 대해 질문을
받았음

@gbn, @Leigh Riffel, @bernd_k 특히 오라클과 일한 적이 없어서 자세히 읽고 배우도록 상기시켜 주셔서 감사합니다.
RolandoMySQLDBA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.