prosource

Oracle에서 count(1)와 count(*)의 차이

probook 2023. 7. 2. 20:50
반응형

Oracle에서 count(1)와 count(*)의 차이

여러 출처, 책, 그리고 질문을 통해 저는 차이가 없다는 것을 알았습니다.count(1)그리고.count(*)내가 찾은 곳count(1)보다 빠름count(*)하지만 나는 정말 방법을 몰라요?내가 아는 바로는count(*)세어 보다rowid그리고.count(1)에서는 1을 행 수로 계산합니다.부터rowid18자리 문자입니까? 시간이 더 걸리나요?사이즈가 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

반응형