现象:
在开发环境能够正常走索引且执行效率较快,但是同样的sql语句在测试环境不走索引且执行效率较低(A和 B各为2W数据)
步骤:
- 执行效率较低,首先想到的是查看测试和开发的sql语句执行计划,通过查看测试环境的sql执行计划,发现查询B表没有走索引。(执行sql语句所需时间为:1分39秒)
- 因为没有走索引,于是就在sql语句上强制加索引(执行sql语句所需时间为:55秒)
- 查看加索引后的执行时间,加了索引效果并不理想,猜测可能是索引失效,于是重建两个表的索引(执行sql语句所需时间为:55秒)
重建索引语句:
alter index hs_crdt.idx_B rebuild; - 通过2和3步骤,猜测可能不是索引的原因,于是就对A表 和 B表进行数据分析处理,再执行sql语句(执行sql语句所需时间为:小于1秒)
(对于数据量比较大的表,最好定期进行表分析,以使oracle得到正确的统计信息,这样oracle优化器才能正确的选择执行计划)
表数据分析语句:begin dbms_stats.gather_table_stats(ownname => '用户名', tabname => '表名', estimate_percent => 100, no_invalidate => false, --立马生效 degree => 8, granularity => 'ALL', --分区 cascade => true); end; /