数据库
首页 > 数据库> > 【DB笔试面试134】在Oracle中,COUNT(1)比COUNT(*)在执行效率上要快吗?

【DB笔试面试134】在Oracle中,COUNT(1)比COUNT(*)在执行效率上要快吗?

作者:互联网

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


Q          题目如下所示:

在Oracle中,COUNT(1)比COUNT(*)在执行效率上要快吗?


     
A          答案如下所示:          



错。COUNT(1)和COUNT(*)在执行效率上是一样的。COUNT()函数是Oracle中的聚合函数,用于统计结果集的行数。其语法形式如下所示:

COUNT({ * | [ DISTINCT | ALL ] expr }) [ OVER (analytic_clause) ]

可以把COUNT的使用情况分为以下3类:

① COUNT(1)、COUNT(*)、COUNT(常量)、COUNT(主键)、COUNT(ROWID)、COUNT(非空列)

② COUNT(允许为空列)

③ COUNT(DISTINCT 列名)

下面分别从查询结果和效率方面做个比较:

(一)结果区别

① COUNT(1)、COUNT(*)、COUNT(ROWID)、COUNT(常量)、COUNT(主键)、COUNT(非空列)这几种方式统计的行数是表中所有存在的行的总数,包括值为NULL的行和非空行。所以,这几种方式的执行结果相同。这里的常量可以为数字或字符串,例如,COUNT(2)、COUNT(333)、COUNT('x')、COUNT('xiaomaimiao')。需要注意的是:这里的COUNT(1)中的“1”并不表示表中的第一列,它其实是一个表达式,可以换成任意数字或字符或表达式。

② COUNT(允许为空列) 这种方式统计的行数不会包括字段值为NULL的行。

③ COUNT(DISTINCT 列名) 得到的结果是除去值为NULL和重复数据后的结果。

④ “SELECT COUNT(''),COUNT(NULL) FROM T_COUNT_LHR;”返回0行。

(二)效率、索引

① 如果存在主键或非空列上的索引,那么COUNT(1)、COUNT(*)、COUNT(ROWID)、COUNT(常量)、COUNT(主键)、COUNT(非空列)会首先选择主键上的索引快速全扫描(INDEX FAST FULL SCAN)。若主键不存在则会选择非空列上的索引。若非空列上没有索引则肯定走全表扫描(TABLE ACCESS FULL)。其中,COUNT(ROWID)在走索引的时候比其它几种方式要慢。通过10053事件可以看到这几种方式除了COUNT(ROWID)之外,其它最终都会转换成COUNT(*)的方式来执行。需要注意的是,在以下几种情况下,Oracle会选择全表扫描:

l 主键索引或非空列上的索引所占用的块数比表的块数大,此时选择全表扫描的COST会比选择索引的COST小,所以,Oracle会选择全表扫描。当索引碎片过多、收集表的统计信息与收集索引的统计信息之间隔了很久、或手动使用DBMS_STATS包不正确地设置了表或索引的统计信息的时候,可能会出现这种情况。但是,在一般情况下不会出现这种情况,所以需要及时地、正确地收集统计信息。

l 主键索引或非空列上的索引处于无效状态。在此种情况下,Oracle必然选择全表扫描。

② 对于COUNT(COL1)来说,只要列字段上有索引则会选择索引快速全扫描(INDEX FAST FULL SCAN)。而对于“SELECT COL1”来说,除非列上有NOT NULL约束,否则执行计划会选择全表扫描。

③ 对于COUNT(列)来说,随着列的偏移位置越大,COUNT(列)的速度越来越慢。在设计表时,把经常访问的列尽量设计在表的前几列。

④ COUNT(DISTINCT 列名) 若列上有索引,且有非空约束或在WHERE子句中使用IS NOT NULL,则会选择索引快速全扫描。其余情况选择全表扫描。

& 说明:

有关COUNT(1)、COUNT(*)、COUNT(ROWID)、COUNT(常量)、COUNT(主键)、COUNT(非空列)的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2136339/。


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


DB笔试面试历史连接  

http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

About Me:小麦苗      

● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● QQ:646634621  QQ群:230161599

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


本文分享自微信公众号 - DB宝(lhrdba)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签:COUNT,DB,扫描,主键,索引,全表,空列,上要
来源: https://blog.51cto.com/lhrbest/2709637