往期回顾
国产数据库创新集锦——小count也有大智慧⓵顺其自然 ,性能很拉垮
彬老师:我们加个 B树索引再来看效果:
drop table t purge; create table t as select * from dba_objects; alter table T modify OBJECT_NAME not null; create index idx_object_name on t(object_name); set autotrace traceonly; set timing on ; select count(*) from t; 执行计划 --------------------------------- Plan hash value: 1178070731 -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Cost (%CPU)| Time | -------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 105 (1)| 00:00:02 | | 1 | SORT AGGREGATE | | 1 | | | | 2 | INDEX FAST FULL SCAN| IDX_OBJECT_NAME | 92256 | 105 (1)| 00:00:02 | -------------------------------------------------------------------------------------- 统计信息 --------------------------------- 0 recursive calls 0 db block gets 372 consistent gets
大饼: 执行计划从 全表扫描变成了 全索引扫描,逻辑读从1048降到372,单车变摩托了!

小渣:效果很炸裂啊!不过,count(*) 这种遍历所有记录的查询,不是一般不建议使用索引吗?
弘老师: 这个问题问得好。索引的本质是索引列值加上对应的 rowid。当我们只需要计数时,访问索引比访问完整的表数据要小得多,IO开销自然大幅降低。
小渣: 原来如此!通过访问更小的数据结构来完成相同任务,确实是个聪明的方法。
彬老师:不过要特别注意,这里的索引列必须是非空约束或者主键,否则索引中不会包含NULL值的行,统计结果就会不准确,这时数据库会自动拒绝使用索引。
大饼:学到了!还有更快的方法吗?
未完待续... 国产数据库创新集锦——小count也有大智慧⓷位图索引,摩托变赛车
公众号:收获不止数据库
微信:ljbyxl1213
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9091385/viewspace-3080008/ ,如需转载,请注明出处,否则将追究法律责任。