数据库表的记录数为:
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(*)快
如果有主键的话,那主键(联合主键)作为count的条件也比count(*)要快
如果你的表只有一个字段的话那count(*)就是最快的啦
count(*) count(1) 两者比较。主要还是要count(1)所相对应的数据字段。
如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化的
因此:count(1)和count(*)基本没有差别!
sql调优,主要是考虑降低:consistent gets和physical reads的数量。
分享到:
相关推荐
介绍完了COUNT(*),接下来看看COUNT(1),对于,这者到底有没有区别,上的说法众说纷纭。有的说 COUNT(*) 执时会转换成 COUNT(1) ,所
在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述这三者的作用,关系以及背后的原理。 往常我经常会看到一些所谓的优化建议不使用...
当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了! 从执行计划来看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),...
在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述这三者的作用,关系以及背后的原理。 往常我经常会看到一些所谓的优化建议不使用...
count()函数是用来统计表中记录的一个函数,返回匹配条件的行数,下面这篇文章主要给大家总结介绍了关于MySQL中count(*)、count(1)和count(col)的区别,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
BLOG_Oracle_lhr_【优化】COUNT(1)、COUNT()、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)、COUNT(允许为空列)、COUNT(DISTINCT 列名).pdf
基本职场上的程序员用来统计数据库表的行数都会使用count(*),count(1)或者count(主键),那么它们之间的区别和性能你又是否了解呢? 其实程序员在开发的过程中,在一张大表上统计总行数是非常耗时的一个操作,那么...
在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述这三者的作用,关系以及背后的原理。 往常我经常会看到一些所谓的优化建议不使用Count...
Leetcode原题Count and Say count-and-say序列是整数序列,前五个术语如下: 1. 1 2. 11 3. 21 1211 5. 111221 1被读作“1”或11。 11被读作“两个1”或21。 21被读作“一个2,然后一个1”或1211。 给定整数n,...
layui laypage插件如何通过ajax返回动态count值,然后重置laypage count值
SourceCount代码统计工具,可以统计出代码行数。方便实用,无需注册。 SourceCount代码行数统计工具
定义count变量是全局变量,定义temp变量是局部变量, 函数func1中引用全局变量count,函数func1中调用函数func2
block db 0,1,0,1,1,1,0,1,1,1 man db ? woman db ? count equ 0ah data ends code segment assume cs:code,ds:data org 1000h start: mov ax,data mov ds,ax mov cx,count mov si,0 mov man,0 mov woman,0 a:...
android-count-the-days android project in kotlin to count the days from a time point. MIT licensed. I needed an app that would count days since a date and days until. The current apps on the market, ...
数据库中Count的使用: ...select count(*) as 人数,count(phone) as 有电话的人数 from student 其中:count(*) 表示student表中所有记录的个数 count(phone)表示student表中phone不空null的记录个数
主要介绍了MongoDB教程之聚合,MongoDB除了基本的查询功能之外,还提供了强大的聚合功能,这里主要介绍count、distinct和group,需要的朋友可以参考下
统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from tSQL 语句来完成。随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什么它会变慢呢? 为什么会变慢?...