通过多个来源、书籍和asktom,我发现 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 |
-----------------------------------------------------------------------------------------
因此,它不仅足够聪明,知道它可以使用索引来优化此查询,而且它对不同版本使用完全相同的执行计划(计划的值是相同的)。
关于sql - oracle中count(1)和count(*)的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51460770/