Select count(*),Count(1)와 Count(열)의 차이 및 실행 방식

SQL Server 에서 Count(*)또는 Count(1)또는 Count([열])는 아마도 가장 자주 사용 하 는 집합 함수 일 것 이다.많은 사람들 이 사실 이 세 사람 사 이 를 구분 하지 못 한다.본 고 는 이 세 사람의 역할,관계 와 배후 의 원 리 를 논술 할 것 이다.
    평소에 저 는 이른바 최적화 제안 이 Count(*)를 사용 하지 않 고 Count(1)를 사용 하여 성능 을 향상 시 키 는 것 을 자주 볼 수 있 습 니 다.이 유 는 Count(*)가 전체 표 스 캔 을 가 져 올 수 있 기 때 문 입 니 다.실제로 Count 를 어떻게 쓰 는 지 는 다 르 지 않다.
    Count(1)와 Count(*)는 실제로 Count()의 표현 식 이 NULL 인지 평가 하고 NULL 이면 NULL 이 아 닌 회계 수 를 계산 하지 않 는 다 는 뜻 이다.예 를 들 어 코드 1 을 보면 Count 에서 NULL 을 지정 합 니 다.(유 틸 리 티 는 NULL 을 명시 적 으로 지정 할 수 없 기 때문에 변수 에 값 을 부여 해 야 지정 할 수 있 습 니 다)

DECLARE @xx INT
SET @xx=NULL
 
SELECT COUNT(@xx) FROM [AdventureWorks2012].[Sales].[SalesOrderHeader]
코드 목록 1.Count 에서 지정 한 NULL
 
모든 줄 이 NULL 이기 때문에 결 과 는 0 으로 계산 되 지 않 습 니 다.결 과 는 그림 1 과 같 습 니 다.
image
그림 1.뻔 하 다.결 과 는 0 이다.
 
    따라서 Count(*)나 Count(1)를 지정 하거나 Count(anything)를 막론하고 결 과 는 똑 같 습 니 다.이 값 들 은 NULL 이 아니 기 때 문 입 니 다.그림 2 참조.
image
그림 2.Count 에서 비 NULL 표현 식 을 지정 하면 결 과 는 다 르 지 않 습 니 다.
 
그럼 카 운 트 는 요?
    Count(열)의 경우 위 규칙 에 도 적용 되 며,열 에 있 는 줄 마다 값 이 NULL 인지,NULL 이면 계수 하지 않 고,NULL 이 아니면 계수 합 니 다.따라서 Count(열)회계 계산 열 이나 이 열의 조합 은 빈 계수 가 아니다.
그럼 Count(*)는 구체 적 으로 어떻게 실행 합 니까?
    앞에서 언급 한 Count()가 NULL 이 아 닌 값 이 있 을 때 SQL Server 에서 구체 적 인 표 에서 NULL 이 아 닌 줄 수 를 찾 으 면 됩 니 다.즉,모든 줄 입 니 다.(한 줄 값 이 모두 NULL 이면 이 줄 은 존재 하지 않 는 것 과 같 습 니 다)그러면 가장 간단 한 실행 방법 은 NOT NULL 열 을 찾 는 것 입 니 다.이 열 에 색인 이 있 으 면 이 색인 을 사용 합 니 다.물론 성능 을 위해 SQL Server 는 IO 를 줄 이기 위해 가장 좁은 색인 을 선택 합 니 다.
    Adventureworks 2012 예제 데이터베이스 의[Person][Address]표 에서 모든 비 집합 색인 을 삭제 하고 Modify Date 라 는 데이터 형식 이 DateTime 열 에 색인 을 만 듭 니 다.실행 계획 을 보 겠 습 니 다.그림 3 참조:
image
그림 3.CreateDate 의 색인 을 사 용 했 습 니 다.
 
    저 희 는 StateProvinceID 열 에 색인 을 계속 만 들 었 습 니 다.이 열 은 4 바이트 로 이전 8 바이트 DateTime 형식의 열 보다 짧 기 때문에 SQL Server 는 StateProvinceID 색인 을 선 택 했 습 니 다.그림 4 참조.
image
그림 4.더 짧 은 StateProvinceID 인덱스 선택
 
따라서 특정한 표 에 Count(*)를 많이 사용 할 때 가장 짧 은 열 에 단일 색인 을 만 드 는 것 을 고려 하면 성능 이 크게 향상 된다.

좋은 웹페이지 즐겨찾기