昨天下班前收到开发的邮件,一个执行sql语句执行的很慢,看了执行计划,为未走索引。
收到邮件后,登入到开发环境devdb,执行语句,果真很慢。登入到测试环境uatdb,执行同样的语句,速度很快。
开发和测试的为同一份生产数据导入过来的(都是我做的数据同步),查看了下两边的执行计划,测试的走了索引,开发的未走。此时比较纳闷,为什么一样的语句会走不同的执行计划。
1. 查看两边的索引情况,两边的的索引都一样。
select * from dba_indexes where table_name='tabname'
2. 查看两边的统计信息情况,发现开发环境的统计信息有过更新,测试环境没有。 找到了不一样的地方~~
select table_name,num_rows,a.blocks,a.last_analyzed from dba_tables a where a.table_name='tabname';
3. 在开发环境想办法导入以前的统计信息,但是经过查找没有历史统计信息,此路不通。
4. 经过尝试,最后删除了开发环境的统计信息,发现开始走索引了,执行速度变快。
SQL>dbms_stats.delete_table_stats(ownname => 'xxxxx',tabname => 'tabname') ;
5. 在网上找到了一篇比较好的文章。
http://blog.itpub.net/26892340/viewspace-721935/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21374452/viewspace-2129358/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/21374452/viewspace-2129358/