본문 바로가기
Dev. Cookbook/SQL, Oracle, MariaDB

[Oracle] Select count(*), count(1), count(column_name), count(DISTINCT column_name) 차이점

by breezyday 2022. 5. 12.

Oracle에서 조건에 맞는 행의 숫자를 세는 COUNT 함수가 있습니다.

 

일반적으로 테이블 전체 혹은 조건에 맞는 ROW(행)의 수를 파악하기 위해서 SELECT COUNT(*) FROM 문을 많이 사용합니다. 그런데 가끔 COUNT(*) 대신 COUNT(1)을 사용하는 것이 성능이 더 좋다는 얘기가 있어서 확인해보고, COUNT문 사용 시 컬럼명을 적용하는 것에 대해서 찾아보고 정리하였습니다. 

1. COUNT(*) vs COUNT(1)

COUNT(*)과 COUNT(1)에 대한 논쟁은 그동안 많은 포럼에서 차이점에 대한 논쟁이 있었습니다만, 결론부터 얘기하자면 실제 성능에는 차이가 없으므로 보편적인 COUNT(*)을 사용할 것을 언급하고 있습니다. 실제로 제가 실행계획을 분석해봐도 동일했습니다. 

 

-- 아래 문장은 모두 동일한 값을 반환

SELECT COUNT(*) FROM employees;
SELECT COUNT(1) FROM employees;
SELECT COUNT(-13) FROM employees;
SELECT COUNT('count diffenence') FROM employees;

 

실제로 과거 ORACLE 8 이전 버전에서는 차이가 있었다고 하지만, ORACLE 8을 포함한 이후 버전에서는 실행계획이 동일하므로 성능에 차이가 없는 것으로 밝혀졌습니다. 보다 상세한 근거는 아래 참고란에 링크 된 부분을 열람해보면 알 수 있습니다.

 

2. COUNT(*) vs COUNT(column_name)

COUNT(*)은 NULL을 포함한 모든 행의 수를 계산하여 값을 반환합니다.

COUNT(column_name)은 컬럼 명의 값이 NULL인 행은 제외행의 수를 반환합니다.

 

3. COUNT(column_name) vs COUNT(DISTINCT column_name)

COUNT(column_name)은 값이 NULL인 행을 제외한 행의 수를 반환하지만 중복도 포함해서 반환합니다.

COUNT(DISTINCT column_name)은 값이 NULL인 행을 제외하고 중복을 제거행의 수를 반환합니다.

 

 

 

참고

Oracle: Count(*) or Count(1) – that is the question

https://pretius.com/blog/difference-between-count-vs-count1-oracle/

difference between count(1) and count(*)

https://asktom.oracle.com/pls/apex/f?p=100:11:0::NO::P11_QUESTION_ID:1156159920245​

 

What is the Difference Between COUNT(*), COUNT(1), COUNT(column name), and COUNT(DISTINCT column name)?

https://learnsql.com/blog/difference-between-count-distinct/

 

 

 

 

 

background 이미지

댓글