`
can_do
  • 浏览: 263956 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

count(*)与count(1)的区别有多大?

阅读更多
数据库表的记录数为:

SQL> select count(*) from table_name t;

COUNT(*)
----------
      6873

1、使用count(*)的统计结果:

SQL> alter session set nls_language = "American";

Session altered.

SQL> set timing on;
SQL> set autotrace on;
SQL> select a.document_id,count(*) from table_name a group by a.document_id having count(a.document_id) >1;

DOCUMENT_ID   COUNT(*)
----------- ----------
          0         71

Elapsed: 00:00:05.20

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=90 Card=339 Bytes=16
          95)

   1    0   FILTER
   2    1     SORT (GROUP BY) (Cost=90 Card=339 Bytes=1695)
   3    2       TABLE ACCESS (FULL) OF 'table_name' (Cost=78 Card=6828
           Bytes=34140)

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

SQL>
2、使用count(1)的统计结果:

SQL> alter session set nls_language = "American";

Session altered.

SQL> set timing on;
SQL> set autotrace on;
SQL> select a.document_id,count(1) from table_name a group by a.document_id having count(a.document_id) >1;

DOCUMENT_ID   COUNT(1)
----------- ----------
          0         71

Elapsed: 00:00:05.57

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=90 Card=339 Bytes=16
          95)

   1    0   FILTER
   2    1     SORT (GROUP BY) (Cost=90 Card=339 Bytes=1695)
   3    2       TABLE ACCESS (FULL) OF 'table_name' (Cost=78 Card=6828
           Bytes=34140)

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

SQL>

其实:两个并没有多大差别!使用count(1)要比count(*)的用时多些!

对数据库表作分析之后的比较:

3、使用count(*)的结果:

SQL> analyze table table_name compute statistics;

Table analyzed.

Elapsed: 00:00:02.92
SQL> select a.document_id,count(*) from table_name a group by a.document_id having count(a.document_i

DOCUMENT_ID   COUNT(*)
----------- ----------
          0         71

Elapsed: 00:00:05.43

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=93 Card=341 Bytes=13
          64)

   1    0   FILTER
   2    1     SORT (GROUP BY) (Cost=93 Card=341 Bytes=1364)
   3    2       TABLE ACCESS (FULL) OF 'table_name' (Cost=82 Card=6873
           Bytes=27492)

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

SQL>

4、使用count(1)的结果:

SQL> analyze table table_name compute statistics;

Table analyzed.

Elapsed: 00:00:02.89
SQL> select a.document_id,count(1) from table_name a group by a.document_id having count(a.document_id) >1;

DOCUMENT_ID   COUNT(1)
----------- ----------
          0         71

Elapsed: 00:00:04.95

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=93 Card=341 Bytes=13
          64)

   1    0   FILTER
   2    1     SORT (GROUP BY) (Cost=93 Card=341 Bytes=1364)
   3    2       TABLE ACCESS (FULL) OF 'table_name' (Cost=82 Card=6873
           Bytes=27492)

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

SQL>

由此可见,对表作分析之后,使用count(1)要比count(*)的用时少些!

而且:表分析前后:count(*)分析后比count(*)分析前用时多了;count(1)分析后比count(1)分析前用时少了;对于提高性能来说,首先对表作分析,然后再使用count(1)就会省更多的时间。

后话:但是当表的数据量再大些时:

SQL> select count(*) from table_name;

COUNT(*)
----------
     37054

5、使用count(*)的结果:

SQL> alter session set nls_language = "American";

Session altered.

SQL> set timing on;
SQL> set autotrace on;
SQL> analyze table table_name compute statistics;

Table analyzed.

Elapsed: 00:00:28.28
SQL> select a.document_id,count(*) from table_name a group by a.document_id having count(a.document_id) >1;

DOCUMENT_ID   COUNT(*)
----------- ----------
          0        187
     317994          2

Elapsed: 00:00:05.98

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=457 Card=1844 Bytes=
          7376)

   1    0   FILTER
   2    1     SORT (GROUP BY) (Cost=457 Card=1844 Bytes=7376)
   3    2       TABLE ACCESS (FULL) OF 'table_name' (Cost=416 Card=37
          054 Bytes=148216)

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

SQL>

6、使用count(1)的结果:

SQL> alter session set nls_language = "American";

Session altered.

SQL> set timing on;
SQL> set autotrace on;
SQL> analyze table table_name compute statistics;

Table analyzed.

Elapsed: 00:00:26.57
SQL> select a.document_id,count(1) from table_name a group by a.document_id having count(a.document_id) >1;

DOCUMENT_ID   COUNT(1)
----------- ----------
          0        187
     317994          2

Elapsed: 00:00:06.03

Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=457 Card=1844 Bytes=
          7376)

   1    0   FILTER
   2    1     SORT (GROUP BY) (Cost=457 Card=1844 Bytes=7376)
   3    2       TABLE ACCESS (FULL) OF 'table_name' (Cost=416 Card=37
          054 Bytes=148216)

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

SQL>
当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!

从执行计划来看,count(1)和count(*)的效果是一样的。
但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),不过差不了多少。
这个也与表的记录数多少有关!如果1w以外的数据量,做过表分析之后,反而count(1)的用时比count(*)多了。

另外,当数据量达到10w多的时候,使用count(1)要比使用count(*)的用时稍微少点!
因此:count(1)和count(*)基本没有差别!

sql调优,主要是考虑降低:consistent gets和physical reads的数量。

【编写于 2009-01-20】
分享到:
评论

相关推荐

    为什么阿里巴巴禁止使用 count(列名)或 count(常量)来替代 count(*)1

    `COUNT(常量)`,例如`COUNT(1)`,虽然在某些数据库系统中与`COUNT(*)`的行为相似,但并不完全相同。它通常被视为一个非空表达式,因此与`COUNT(*)`一样,会计算所有行。然而,不是所有的数据库系统都会对`COUNT(常量...

    MySQL中count(*)、count(1)和count(col)的区别汇总

    COUNT(1)看起来与COUNT(*)相似,但实际上它们在内部处理上略有不同。COUNT(1)表示统计每一行,无论该行的任何列的值是否为NULL。尽管在大多数情况下,COUNT(*)和COUNT(1)的结果相同,但理论上COUNT(1)可能会稍快一些...

    sql server中Select count(*)和Count(1)的区别和执行方式

    而`COUNT(1)` 的工作方式稍微不同,但结果通常与 `COUNT(*)` 相同。这里的数字1被视为一个常量表达式,SQL Server在评估`COUNT(1)`时,也会检查这个表达式是否为NULL。由于1显然不是NULL,所以每行都将被计数,不论...

    count(1)、count(*)与count(列名)的执行区别详解

    当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!  从执行计划来看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),...

    MySQL常见面试题(表连接类型,count(*),count(列),count(1)的区别,索引,存储引擎,锁,优化)

    - **COUNT(1)**:在InnoDB引擎中,与COUNT(*)性能相似,都用于统计行数,包括NULL值。但在某些场景下,如统计非空特定列,COUNT(列)会更快,因为它仅计算特定列的非NULL值。 3. **索引** - **聚集索引(Clustered...

    【优化】COUNT(1)、COUNT()、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)等

    BLOG_Oracle_lhr_【优化】COUNT(1)、COUNT()、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名).pdf

    SourceCount代码统计工具

    这对于评估项目的复杂度、进行代码审查或优化代码结构都有很大帮助。 使用SourceCount,开发者无需进行复杂的配置或注册流程,简单易用是其一大亮点。只需将需要分析的源代码目录指定给SourceCount,工具便会自动...

    CountV1-4(count).zip_CAD 统计_CountV1-4._CountV1-4.lsp_count.lsp_s

    压缩包中没有提到的其他文件,如 `CountV1-4(count).lsp`,可能是已经编译的版本,或者是一个与主脚本协同工作的辅助脚本,提供特定功能或优化性能。 使用这些LISP程序时,用户需要在AutoCAD环境中加载它们。这通常...

    Select count(*)、Count(1)和Count(列)的区别及执行方式

    综上所述,`COUNT(*)`、`COUNT(1)` 和 `COUNT([列])` 在功能上有细微差别,但它们的主要目标都是统计非NULL值的数量。在实际应用中,关注索引的优化和选择合适的列进行计数,是提升查询性能的关键。对于 `COUNT(*)`...

    mysql SELECT FOUND_ROWS()与COUNT()用法区别1

    在MySQL数据库中,`SELECT FOUND_ROWS()` 和 `COUNT(*)` 都是用来获取数据表中记录数量的方法,但它们之间存在一些关键的区别。了解这些差异对于优化查询性能和满足特定需求至关重要。 首先,`COUNT(*)` 是一个标准...

    sql的left join和count应用

    练习的目标是根据 `fuid` 查询节点是否有子节点,并利用 `COUNT` 函数来确定节点的子节点数量。 首先,我们需要理解 `LEFT JOIN` 的工作原理。`LEFT JOIN` 是一种联接(JOIN)类型,它返回所有左表(在本例中是 `...

    S7-1500 工艺模块 TM Count 2x24V 计数功能使用入门.docx

    工艺模块 TM Count 2x24V 的接线方式是将两个 24V 脉冲信号编码器接到模块的 1 号端子和 2 号端子上。 本文档还详细介绍了计数功能的概述,计数是指对事件进行记录和统计,工艺模块的计数器捕获编码器信号和脉冲,...

    聊聊MySQL的COUNT(*)的性能

    基本职场上的程序员用来统计数据库表的行数都会使用count(*),count(1)或者count(主键),那么它们之间的区别和性能你又是否了解呢? 其实程序员在开发的过程中,在一张大表上统计总行数是非常耗时的一个操作,那么...

    IPCount V2.2.7

    《IPCount V2.2.7:世纪网通公话计费系统的详解与应用》 IPCount V2.2.7是一款专为世纪网通设计的公话计费系统,旨在高效、精准地管理公共电话服务的计费过程。该系统集成了先进的计费算法和稳定的数据处理能力,为...

    全局变量的使用,函数func1中引用全局变量count,函数func1中调用函数func2

    在函数`func1`中,对全局变量`count`的操作可能会有增减或者读取,这取决于具体的功能需求。同时,`func1`调用了另一个函数`func2`。在这种情况下,如果`func2`也需要访问`count`,那么它可以直接使用,因为`count`...

    sql中null值对count的影响

    #### COUNT函数与NULL值 `COUNT`函数用于统计表中特定列的行数。根据其参数的不同,`COUNT`函数的行为也会有所不同: - `COUNT(*)`: 统计所有行的数量,包括那些包含`NULL`值的行。 - `COUNT(column_name)`: 统计...

    countlines,代码统计工具

    《代码统计工具CountLines详解与应用》 在软件开发过程中,代码量的统计是一项重要的工作,它可以帮助开发者了解项目的规模,评估开发进度,甚至作为衡量工作效率的一种方式。今天我们要介绍的是一款名为“count...

Global site tag (gtag.js) - Google Analytics