Best answer
여기에 이미 좋은 답변이 있지만 불행히도 일부는 잘못되었습니다.
COUNT (1)의 1은 리터럴 상수 표현식 일 뿐이며 테이블의 열 1과 관련이 없습니다. COUNT (*)와 동일한 응답을 제공하고 동일한 실행 계획을 갖습니다. 쿼리는 필요한 I / O를 최소화하기 위해 가장 작은 비 클러스터형 인덱스의 행을 계산합니다.
COUNT (Col) (null 허용 열의 경우)는 Col을 포함하는 가장 작은 인덱스의 행을 계산하여 찾습니다. 인덱스에없는 경우 테이블 스캔이 필요합니다. Col이 클러스터링 된 키 또는 인덱스에 있으면 다른 모든 인덱스의 일부이기도하므로 클러스터링 된 테이블 스캔이 아닌 가장 작은 비 클러스터형 인덱스가 스캔됩니다.
대상 열이 NULL이 아니면 COUNT (Col)은 COUNT (*)와 동일하며 Col이 인덱스에없는 경우에도 가장 작은 비 클러스터형 인덱스를 스캔하여 다시 찾습니다.
이러한 문은 다양한 쿼리의 예상 실행 계획을 기반으로합니다. SQL 2014 서버의 경우 이전 또는 최신 버전의 쿼리 최적화 프로그램이 다르게 작동 할 수 있습니다. 실행 계획을 읽는 방법을 배우면 여기에 게시 된 답변이 더 정확한지 알아내는 것보다 쿼리 실행 방법에 대해 더 많은 것을 배울 수 있습니다.
답변
매개 변수 COUNT 함수에는 각 행에 대해 평가되는 표현식이 있습니다. COUNT 함수는 표현식이 널이 아닌 값으로 평가되는 행 수를 리턴합니다. (*는 평가되지 않는 특수 표현식이며 단순히 행 수를 반환합니다.)
이 표현식에는 ALL과 DISTINCT의 두 가지 추가 수정자가 있습니다. 중복 항목을 삭제할지 여부를 결정합니다. ALL이 기본값이므로 예제는 count (ALL 1)과 동일하며 이는 중복이 유지됨을 의미합니다.
표현식 “1”은 모든 행에 대해 널이 아닌 값으로 평가되기 때문에 중복을 제거하지 않습니다. COUNT (1)은 항상 COUNT (*)와 동일한 숫자를 반환해야합니다.