今天开始查找一个打印功能响应慢的问题,用jprofiler做了一个简单跟踪,发现有条SQL语句,执行时间相对较长。oracle数据库是刚导进去的,不存在碎片和行迁移、行链接、统计信息没更新的可能,这条SQL语句也不是做的全表扫描,看来可能是索引丢失或使用有问题。检查数据表索引,设了一个组合索引。拿索引和SQL语句一对比,SQL语句where字句中第一个查询列不在索引列的第一列,看来这个索引对这条SQL语句是无效的。为了证明这一点,做了索引监控:
alter index index_name monitoring usage;
重新做了一遍打印操作。
select * from V$object_usage;
查询结果为空,证明了这一点。正好,借此机会总结一下索引的使用和优化。
- 索引的创建是需要代价的,进行删除、更新、插入操作时同步进行索引的删除、更新、插入,会导致删除、更新、插入效率的降低,所以用不到的索引不建。不用的索引及时删除;
- 数据列上创建索引时,如果该列没有重复值,创建唯一单一索引,如果该列存在重复值,但和另一个或几个列组合可以确定唯一性,和这几个列一起创建组合索引,查询列中用到的第一查询列做为组合索引的第一个列;
- 避免出现包含共享列的重叠索引;
- 连接查询中要使用索引,必须使用Nested loop join,这样可以使用内表的索引;
- 如果where字句中的查询列存在潜在的类型转换,该列上的索引无效;
- 增、删、改频繁的表需要定期对表和索引进行分析,才能保证索引的有效。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15011739/viewspace-414940/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15011739/viewspace-414940/