通过经典的select count(*) from table_name;从不同角度来分析其性能。
首先准备6张表,其表结构一致,记录数一致:
表的记录数如下所示:
TEST04的ID字段为唯一索引;
TEST05无任何索引以及约束;
TEST06的ID字段有非空约束;
TEST07的ID字段有主键约束;
TEST08的id02字段有位图索引;
对这几个表均做如下查询,将autotrace打开
:
1.首先ID字段只有普通索引的TEST03表,如果没有指定id is not null,那么他的执行计划是'全表扫描'(table access full)。如果指定了id is not null,那么其执行计划是'索引快速全扫描'(index fast full scan)。
通过比较执行计划中的COST CPU和TIME以及统计信息中的CONSISTENT GETS和PHYSICAL READS我们可以看出两者的性能差距:
2.对ID列有唯一索引的TEST04表进行分析,和上述一样,通过指定id is not null可看出差距,不过,这里因为唯一索引的'索引快速全扫描'要比之前的普通索引的代价更低:
3.对于没有任何约束以及索引的test05表,条件id is not null指定与不指定没区别:
4.对于ID列有非空约束的TEST06表,指定与不指定ID is not null性能均是一样的:
5.对于ID列有主键的test07表 ,指定与不指定id is not null都是一样的,因为oracle的CBO优化器都会选择这一列来作为过滤条件,因为我们知道,'主键'就是'非空+唯一+唯一索引':
6.对于ID02列有位图索引的test08表,指定ID02 is not null,其性能是最优的,这与位图索引的组织结构有关,因为其只存储0和1,那么只需统计某一列0和1的总数就行:
通过上述实验,对于count(*)的查询让我们知道了非空对于索引查询的重要性。在指定非空的条件下,按照上述实验我们可以知道,性能趋势为:位图索引>唯一索引>普通索引>无索引。
我们也可以知道非空和唯一值的重要性,这就要我们对数据库整体有一个良好的架构。
另外强调一点,位图索引对更新操作非常敏感,在update以及delete操作频繁的数据表中,避免使用位图索引。
——————————————————————————————————————————
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/27119553/viewspace-1373235/
,如需转载,请注明出处,否则将追究法律责任。