关于count
来源:互联网 发布:ubuntu 软件安装位置 编辑:程序博客网 时间:2024/05/19 15:23
关于count(*)的执行计划的分析
一. RULE优化器(RBO)
此时表上无任何索引,所以无论怎么样都是进行的全表扫描
2, 表上有索引
1, 索引中存在null值
a, 非主键索引
b, 主键索引
二. COST优化器(CBO)
此时表上无任何索引,所以无论怎么样都是进行的全表扫描
2, 索引中不存在null值
c, 非主键索引
d, 主键索引
如果单独的没有where条件的select count(*)语句想要用上索引,那么必须满足以下两个条件
1, cbo
2, 存在not null属性的列
一. RULE优化器(RBO)
1, 表上无索引
SQL> create table test01 as select * from dba_objects;Table createdSQL> select count(*) from test01;已用时间: 00: 00: 00.05Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'TEST01'SQL> select count(*) from test01 where object_id > 0;已用时间: 00: 00: 00.03Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'TEST01'
此时表上无任何索引,所以无论怎么样都是进行的全表扫描
2, 表上有索引
1, 索引中存在null值
SQL> create index ind_test01 on test01(object_id);Index createdSQL> select count(*) from test01;已用时间: 00: 00: 00.02Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'TEST01'SQL> select count(*) from test01 where object_id > 0;已用时间: 00: 00: 00.01Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (AGGREGATE) 2 1 INDEX (RANGE SCAN) OF 'IND_TEST01' (NON-UNIQUE)
2, 索引中不存在null值
SQL> delete test01 where object_id is null;4 rows deletedSQL> commit;Commit complete
a, 非主键索引
SQL> drop index ind_test01;Index droppedSQL> create index ind_test01 on test01(object_id);Index createdSQL> select count(*) from test01;已用时间: 00: 00: 00.03Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'TEST01'SQL> select count(*) from test01 where object_id > 0;已用时间: 00: 00: 01.01Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (AGGREGATE) 2 1 INDEX (RANGE SCAN) OF 'IND_TEST01' (NON-UNIQUE)
b, 主键索引
SQL> drop index ind_test01;Index droppedSQL> alter table test01 2 add constraint pk_test01 primary key (object_id);Table alteredSQL> select count(*) from test01;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'TEST01'SQL> select count(*) from test01 where object_id > 0;已用时间: 00: 00: 00.05Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (AGGREGATE) 2 1 INDEX (RANGE SCAN) OF 'PK_TEST01' (UNIQUE)
二. COST优化器(CBO)
3, 表上无索引
SQL> create table test02 as select * from dba_objects;Table created(略)
此时表上无任何索引,所以无论怎么样都是进行的全表扫描
4, 表上有索引
1, 索引中存在null值
SQL> create index ind_test02 on test02(object_id);Index createdSQL> analyze table test02 compute statistics;Table analyzedSQL> select count(*) from test02;已用时间: 00: 00: 00.05Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=41 Card=1) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'TEST02' (Cost=41 Card=30154)SQL> select count(*) from test02 where object_id > 0;已用时间: 00: 00: 00.02Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=8 Card=1 Bytes=4) 1 0 SORT (AGGREGATE) 2 1 INDEX (FAST FULL SCAN) OF 'IND_TEST02' (NON-UNIQUE) (Cos
2, 索引中不存在null值
SQL> delete test02 where object_id is null;4 rows deletedSQL> commit;Commit complete
c, 非主键索引
SQL> drop index ind_test02;Index droppedSQL> create index ind_test02 on test02(object_id);Index createdSQL> analyze table test02 compute statistics;Table analyzedSQL> select count(*) from test02;已用时间: 00: 00: 00.03Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=41 Card=1) 1 0 SORT (AGGREGATE) 2 1 TABLE ACCESS (FULL) OF 'TEST02' (Cost=41 Card=30150)SQL> select count(*) from test02 where object_id > 0;已用时间: 00: 00: 00.01Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=8 Card=1 Bytes=4) 1 0 SORT (AGGREGATE) 2 1 INDEX (FAST FULL SCAN) OF 'IND_TEST02' (NON-UNIQUE) (Cos
d, 主键索引
SQL> drop index ind_test02;Index droppedSQL> alter table test02 2 add constraint pk_test02primary key (object_id);Table alteredSQL> analyze table test02 compute statistics;Table analyzedSQL> select count(*) from test02;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=8 Card=1) 1 0 SORT (AGGREGATE) 2 1 INDEX (FAST FULL SCAN) OF 'PK_TEST02' (UNIQUE) (Cost=8 CSQL> select count(*) from test01 where object_id > 0;Execution Plan---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE 1 0 SORT (AGGREGATE) 2 1 INDEX (RANGE SCAN) OF 'PK_TEST01' (UNIQUE)
如果单独的没有where条件的select count(*)语句想要用上索引,那么必须满足以下两个条件
1, cbo
2, 存在not null属性的列
0 0
- 关于count
- 关于count(*),count(1),count(column)
- 关于count(1)和count(*)
- 关于SQL_CALC_FOUND_ROWS和COUNT(*)
- 关于sql中的count
- 关于mybatis中的count(*)
- 【mysql】关于count(*)与count(col)
- 关于select count(*)的讨论
- 关于count()函数一些问题
- 关于count的一点疑问
- 关于mysql中的count()函数
- 关于count(1)和count(*)效率区别和差异
- oracle中关于count(1)、count(*)、count(rowid)、count(某个字段)使用上的区别和性能问题
- oracle中关于count(1)、count(*)、count(rowid)、count(某个字段)使用上的区别和性能问题
- 学习关于聚合FUNCTION(count(*|fieldname))
- 关于SQL Server的COUNT()指令
- SQL_关于count函数说明一
- SQL_关于count函数说明二
- oracle恢复
- Java栈和局部变量操作(一)
- 关于JVM的几道面试题
- 关于虚拟主机你要知道的十件事
- android系统源码目录system/framework下各个jar包的用途
- 关于count
- ARM开发历程
- android sensor之重力小球
- 地十己土生天九辛金
- 如何使 SQL Server高效 --T-SQL
- 策略模式+反射
- 利用findmaven.net解决ClassNotFoundException
- findmaven.net vs findjar.com-find jar,find maven
- findmaven.net vs findjar.com-查看源码功能