sql server 에서 Select count(*)와 Count(1)의 차이 점 과 실행 방식
평소에 저 는 이른바 최적화 제안 이 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 과 같 습 니 다.
그림 1.뻔 하 다.결 과 는 0 이다.
따라서 Count(*)나 Count(1)를 지정 하거나 Count(anything)를 막론하고 결 과 는 똑 같 습 니 다.이 값 들 은 NULL 이 아니 기 때 문 입 니 다.그림 2 참조.
그림 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 참조:
그림 3.CreateDate 의 색인 을 사 용 했 습 니 다.
저 희 는 StateProvinceID 열 에 색인 을 계속 만 들 었 습 니 다.이 열 은 4 바이트 로 이전 8 바이트 DateTime 형식의 열 보다 짧 기 때문에 SQL Server 는 StateProvinceID 색인 을 선 택 했 습 니 다.그림 4 참조.
그림 4.더 짧 은 StateProvinceID 인덱스 선택
따라서 특정한 표 에 Count(*)를 많이 사용 할 때 가장 짧 은 열 에 단일 색인 을 만 드 는 것 을 고려 하면 성능 이 크게 향상 된다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
sql server 에서 Select count(*)와 Count(1)의 차이 점 과 실행 방식Count(1)와 Count(*)는 실제로 Count()의 표현 식 이 NULL 인지 평가 하고 NULL 이면 NULL 이 아 닌 회계 수 를 계산 하지 않 는 다 는 뜻 이다.예 를 들 어 코드 1 을 보면 Cou...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.