count(*)与count(1)有区别吗?

本文通过实测对比了SQL中使用count(*)和count(1)时的资源消耗情况,发现两者在资源消耗上几乎一致,揭示了SQL查询性能的常见误区。

一直以为sql中count(*)会比count(1)更消耗资源,今天实际分析比较下发现其实是一样的!

先看count(*):


[oracle@single bdump]$ sqlplus '/as sysdba'


SQL*Plus: Release 9.2.0.4.0 - Production on Sat Mar 21 10:21:21 2009


Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to an idle instance.


idle>startup
ORACLE instance started.


Total System Global Area  120017880 bytes
Fixed Size                   451544 bytes
Variable Size              67108864 bytes
Database Buffers           50331648 bytes
Redo Buffers                2125824 bytes
Database mounted.
Database opened.
idle>set autot on
idle>select count(*) from scott.test;


  COUNT(*)
----------
    282912




Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE
   1    0   SORT (AGGREGATE)
   2    1     TABLE ACCESS (FULL) OF 'TEST'


 




Statistics
----------------------------------------------------------
        164  recursive calls
          0  db block gets
       3462  consistent gets
       3439  physical reads
          0  redo size
        381  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
          1  rows processed




再看count(1):


SQL*Plus: Release 9.2.0.4.0 - Production on Sat Mar 21 10:22:29 2009


Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


Connected to an idle instance.


idle>startup
ORACLE instance started.


Total System Global Area  120017880 bytes
Fixed Size                   451544 bytes
Variable Size              67108864 bytes
Database Buffers           50331648 bytes
Redo Buffers                2125824 bytes
Database mounted.
Database opened.
idle>set autot on
idle>select count(1) from scott.test;


  COUNT(1)
----------
    282912




Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT ptimizer=CHOOSE
   1    0   SORT (AGGREGATE)
   2    1     TABLE ACCESS (FULL) OF 'TEST'


 




Statistics
----------------------------------------------------------
        164  recursive calls
          0  db block gets
       3462  consistent gets
       3439  physical reads
          0  redo size
        381  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
          1  rows processed


二者的资源消耗是一致的,没看出有多大区别。

SQL中,`COUNT(*)` `COUNT(1)` 是两种常见的用法,它们在大多数数据库系统中(如Oracle、MySQLSQL Server)的行为是相同的,但理解它们的设计意图潜在区别对于深入掌握SQL查询是有帮助的。 ### `COUNT(*)` 的含义 `COUNT(*)` 用于计算查询返回的所有行数,包括所有列中的 `NULL` 值重复行。它不关心某列是否有值,只要该行存在,就会被计入总数。例如: ```sql SELECT COUNT(*) "Total" FROM employees; ``` 这条语句将返回 `employees` 表中的总记录数,无论任何列是否有值[^2]。 ### `COUNT(1)` 的含义 `COUNT(1)` 实际上 `COUNT(*)` 是等效的。这里的 `1` 是一个常量表达式,表示每一行都会被计数,而不论表中实际列的内容如何。数据库优化器通常会将 `COUNT(1)` 转换为 `COUNT(*)` 来执行。例如: ```sql SELECT COUNT(1) "Total" FROM employees; ``` 这条语句同样返回 `employees` 表中的总记录数[^1]。 ### `COUNT(*)` `COUNT(1)` 的区别 尽管两者在功能上是相同的,但在语义可读性方面存在细微差异: - **语义清晰性**:`COUNT(*)` 更加直观,明确表示“统计所有行”,而 `COUNT(1)` 则可能让初学者困惑,不知道 `1` 的意义。 - **性能差异**:在大多数现代数据库系统中,`COUNT(*)` `COUNT(1)` 的执行计划是相同的,因此性能上没有显著差异。然而,某些旧版本的数据库可能会对两者有不同的处理方式,但这在当前主流系统中已不常见[^1]。 ### 使用场景建议 - 如果你的目标是统计表中的总行数,推荐使用 `COUNT(*)`,因为它更具可读性语义清晰性。 - 如果出于某种原因需要使用常量表达式(如在某些复杂查询中作为子查询的一部分),可以使用 `COUNT(1)`,但这种情况较为少见。 ### 示例代码 以下是一个简单的对比示例: ```sql -- 使用 COUNT(*) SELECT COUNT(*) AS total_rows FROM employees; -- 使用 COUNT(1) SELECT COUNT(1) AS total_rows FROM employees; ``` 两个查询将返回相同的结果。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值