数据库表的记录数为:
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(1)`,虽然在某些数据库系统中与`COUNT(*)`的行为相似,但并不完全相同。它通常被视为一个非空表达式,因此与`COUNT(*)`一样,会计算所有行。然而,不是所有的数据库系统都会对`COUNT(常量...
COUNT(1)看起来与COUNT(*)相似,但实际上它们在内部处理上略有不同。COUNT(1)表示统计每一行,无论该行的任何列的值是否为NULL。尽管在大多数情况下,COUNT(*)和COUNT(1)的结果相同,但理论上COUNT(1)可能会稍快一些...
而`COUNT(1)` 的工作方式稍微不同,但结果通常与 `COUNT(*)` 相同。这里的数字1被视为一个常量表达式,SQL Server在评估`COUNT(1)`时,也会检查这个表达式是否为NULL。由于1显然不是NULL,所以每行都将被计数,不论...
当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),...
- **COUNT(1)**:在InnoDB引擎中,与COUNT(*)性能相似,都用于统计行数,包括NULL值。但在某些场景下,如统计非空特定列,COUNT(列)会更快,因为它仅计算特定列的非NULL值。 3. **索引** - **聚集索引(Clustered...
BLOG_Oracle_lhr_【优化】COUNT(1)、COUNT()、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名).pdf
这对于评估项目的复杂度、进行代码审查或优化代码结构都有很大帮助。 使用SourceCount,开发者无需进行复杂的配置或注册流程,简单易用是其一大亮点。只需将需要分析的源代码目录指定给SourceCount,工具便会自动...
压缩包中没有提到的其他文件,如 `CountV1-4(count).lsp`,可能是已经编译的版本,或者是一个与主脚本协同工作的辅助脚本,提供特定功能或优化性能。 使用这些LISP程序时,用户需要在AutoCAD环境中加载它们。这通常...
综上所述,`COUNT(*)`、`COUNT(1)` 和 `COUNT([列])` 在功能上有细微差别,但它们的主要目标都是统计非NULL值的数量。在实际应用中,关注索引的优化和选择合适的列进行计数,是提升查询性能的关键。对于 `COUNT(*)`...
在MySQL数据库中,`SELECT FOUND_ROWS()` 和 `COUNT(*)` 都是用来获取数据表中记录数量的方法,但它们之间存在一些关键的区别。了解这些差异对于优化查询性能和满足特定需求至关重要。 首先,`COUNT(*)` 是一个标准...
练习的目标是根据 `fuid` 查询节点是否有子节点,并利用 `COUNT` 函数来确定节点的子节点数量。 首先,我们需要理解 `LEFT JOIN` 的工作原理。`LEFT JOIN` 是一种联接(JOIN)类型,它返回所有左表(在本例中是 `...
工艺模块 TM Count 2x24V 的接线方式是将两个 24V 脉冲信号编码器接到模块的 1 号端子和 2 号端子上。 本文档还详细介绍了计数功能的概述,计数是指对事件进行记录和统计,工艺模块的计数器捕获编码器信号和脉冲,...
基本职场上的程序员用来统计数据库表的行数都会使用count(*),count(1)或者count(主键),那么它们之间的区别和性能你又是否了解呢? 其实程序员在开发的过程中,在一张大表上统计总行数是非常耗时的一个操作,那么...
《IPCount V2.2.7:世纪网通公话计费系统的详解与应用》 IPCount V2.2.7是一款专为世纪网通设计的公话计费系统,旨在高效、精准地管理公共电话服务的计费过程。该系统集成了先进的计费算法和稳定的数据处理能力,为...
在函数`func1`中,对全局变量`count`的操作可能会有增减或者读取,这取决于具体的功能需求。同时,`func1`调用了另一个函数`func2`。在这种情况下,如果`func2`也需要访问`count`,那么它可以直接使用,因为`count`...
#### COUNT函数与NULL值 `COUNT`函数用于统计表中特定列的行数。根据其参数的不同,`COUNT`函数的行为也会有所不同: - `COUNT(*)`: 统计所有行的数量,包括那些包含`NULL`值的行。 - `COUNT(column_name)`: 统计...
《代码统计工具CountLines详解与应用》 在软件开发过程中,代码量的统计是一项重要的工作,它可以帮助开发者了解项目的规模,评估开发进度,甚至作为衡量工作效率的一种方式。今天我们要介绍的是一款名为“count...