Oracle에서 count(1)와 count(*)의 차이
여러 출처, 책, 그리고 질문을 통해 저는 차이가 없다는 것을 알았습니다.count(1)
그리고.count(*)
내가 찾은 곳count(1)
보다 빠름count(*)
하지만 나는 정말 방법을 몰라요?내가 아는 바로는count(*)
세어 보다rowid
그리고.count(1)
에서는 1을 행 수로 계산합니다.부터rowid
18자리 문자입니까? 시간이 더 걸리나요?사이즈가 2인지 38인지 제가 알기로는 속도는 상관없습니다.
여러분 중 누구라도 제 의심을 풀어주실 수 있나요?
믿어요count(1)
이전 버전의 Oracle에서는 더 빠릅니다.하지만 지금쯤이면 옵티마이저는 똑똑해서 이 사실을 알고 있을 겁니다.count(*)
그리고.count(1)
즉, 행 수를 원하는 경우 적절한 실행 계획을 생성합니다.
여기 있습니다.
create table t as select * from all_objects;
Table T created.
create index tindx on t( object_name );
Index TINDX created.
select count(*) from t;
COUNT(*)
----------
21534
select * from table(dbms_xplan.display_cursor( NULL, NULL, 'allstats last' ));
Plan hash value: 2940353011
--------------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads |
--------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 100 | 93 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 100 | 93 |
| 2 | INDEX FAST FULL SCAN| TINDX | 1 | 18459 | 21534 |00:00:00.01 | 100 | 93 |
--------------------------------------------------------------------------------------------------
select count(1) from t;
COUNT(1)
----------
21534
Plan hash value: 2940353011
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 100 |
| 1 | SORT AGGREGATE | | 1 | 1 | 1 |00:00:00.01 | 100 |
| 2 | INDEX FAST FULL SCAN| TINDX | 1 | 18459 | 21534 |00:00:00.01 | 100 |
-----------------------------------------------------------------------------------------
따라서 인덱스를 사용하여 이 쿼리를 최적화할 수 있다는 것을 알 수 있을 정도로 현명할 뿐만 아니라 여러 버전에 대해 정확히 동일한 실행 계획을 사용합니다(계획의 값은 동일합니다).
이 소문의 근원은 데이터베이스가 내부적으로 확장되어야 한다는 가정이라고 생각합니다.*
전체 열 목록으로, 그래서 문자 그대로 대체.count('Dracula')
이 오버헤드를 교묘하게 방지합니다.하지만 그렇지도 않고, 결코 그렇지도 않습니다.1990년 Oracle 6에서 처음 들었을 때(또 다른 변화는 PK 열을 사용해야 한다는 것이었습니다), 그때는 사실이 아니었습니다.
표준 증거 중 하나는 실행 계획의 '예언' 섹션을 확인하는 것입니다.count(1)
는 술어에서 사용됩니다.
SQL> select dummy from dual group by dummy having count(1) = 1
SQL> @xplan
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Compatibility is set to 12.2.0.0.0
Plan hash value: 795860295
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 | 3 (34)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | SORT GROUP BY NOSORT| | 1 | 2 | 3 (34)| 00:00:01 |
| 3 | TABLE ACCESS FULL | DUAL | 1 | 2 | 2 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(COUNT(*)=1)
옵티마이저가 교체되었음을 알립니다.COUNT(*)
.
모든.count(1)
입력할 수 있는 키 입력을 더 많이 해주고 소문을 믿는 사람처럼 보이게 해줍니다.
두 개의 간단한 쿼리를 테스트했습니다.COUNT(*)
또는COUNT(1)
Oracle 및 기타 몇 가지 RDBMS의 1M 행에서 Oracle의 차이점을 찾을 수 없습니다.자세한 내용은 이 게시물을 참조하십시오.
하지만, Postgre에서.SQL 11.3은 다음과 같습니다.COUNT(1)
약 10% 느립니다, 왜냐하면 포스트그레 때문입니다.SQL은 식을 다음으로 변환하지 않습니다.COUNT(*)
따라서 실행 시 각 행에서 null 여부를 확인합니다.COUNT(1)
.
이제 Oracle에서는 count(1)와 count(*)가 모두 인덱스를 사용하고 null도 카운트합니다. count(1)는 단순히 행 데이터를 1로 바꾼 다음 1과 count(*)의 카운트 수 행은 행 ID를 기준으로 할 수 있습니다.
언급URL : https://stackoverflow.com/questions/51460770/difference-between-count1-and-count-in-oracle
'prosource' 카테고리의 다른 글
+=의 정확한 기능은 무엇입니까? (0) | 2023.07.02 |
---|---|
c# 코드에서 dapper를 사용하여 출력 매개 변수를 저장 프로시저에 전달 (0) | 2023.07.02 |
웹 스트림과 Node.js 스트림 API의 차이점 (0) | 2023.07.02 |
유형 스크립트 확장 서드 파티 선언 파일 (0) | 2023.07.02 |
Pandas DataFrame에 대한 행을 열 헤더로 변환합니다. (0) | 2023.07.02 |