专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

oracle COUNT(*)与COUNT(列) 谁快谁慢?

ins518 2024-10-26 12:14:20 技术文章 13 ℃ 0 评论

COUNT(*)与COUNT(列) 要看是否使用到索引以及索引列不为空,

不考虑索引的时候count(*) 反而更加快,因为oracle优化器列偏移算法的原因,越靠后的列越慢,

所以设计应用的时候,经常访问的列应该放在前面

表无索引时,count()的性能

drop table t purge;

create table t as select * from dba_objects;

alter table T modify object_id null;

update t set object_id =rownum ;

set timing on

set linesize 1000

set autotrace on

表无索引时,count(*)的性能更好

SELECT count(*) from t;

表无索引时,count(列)的性能,这个列如果越靠后,性能越不好

select count(object_id) from t;


表有object_id列索引时,count(列)的性能很好

select count(object_id) from t;


--------------------------------------------------------------------------------------------

表有索引且索引列非空时,count(*)的结果与count(object_id)查询结果一致,优化器自动把count(*)优化成count(object_id),所以这时候count(*)实质就是count(object_id),如果object_id允许为空,这时候count(*)的结果与count(object_id)查询结果可能不一致,优化器改写的前提是保证结果不出错,会出错的话,优化器绝对不会改写。(object_id为空时不进行计数),这时候count(*)不会优化成count(object_id),查询没有count(object_id)快。

alter table T modify object_id not null;

select count(*) from t;--与下面的count(object_id)效果一致

表有索引且索引列非空时,count(列)的性能

select count(object_id) from t;

具体可以看看 《不止sql优化》最后一章节


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表