sql - oracle中count(1)和count(*)的区别

标签 sql oracle

通过多个来源、书籍和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/

相关文章:

mysql - 从 SQL 到 HQL 连接和删除

oracle hibernate + maven dependenciesm dbcp.basicdatasource 异常

oracle - oracle错误程序pl-sql

oracle - Oracle 中否定的 OR 与 IN 条件

java - 索引和分页

mysql - SQL 查询显示相反的值

sql - GROUP BY 子句不返回每个组 ID 中的获胜者

sql - 需要帮助编写在(sql server 2008 和另外 3 个文件中执行 sql 脚本)的 bat 文件。?

sql - Postgresql 中的 hash(#) 运算符有何作用

sql - Oracle 中的 View 扩展