求执行计划变动的可能原因和解决方案
1. 数据库版本:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
2. 操作系统版本:Red Hat Enterprise Linux AS release 4 (Nahant Update 4)
内核 2.6.9-42.ELsmp
3. 问题现象,SQL的执行计划有的时候会随机变动,某个分区表上的SQL执行计划会突然变动,系统通过调用 dbms_stats 包定期收集该分区表的统计信息和表上索引的统计信息,表上索引较多,在执行计划发生变动的时候,通常是使用了一个预料中不应该使用的索引。通过hints能够保证SQL一直走正确的执行计划,但是需要应用做调整,并且加hints不是特别放心。发生执行计划变动的时候,通过flush shared pool来重新生成执行计划就能解决问题,生成正确的执行计划,囧囧的。
请各位大大帮忙想想有啥可能会导致执行计划的变动,目前想到的可能:
1. 执行计划定期失效后或者由于share pool大小不足导致重新生成执行计划,而重新生成执行计划的时候,bind的值比较偏,导致生成执行计划糟糕;目前已经考虑增加shared pool的大小,pink绑定变量的值这个在10g没有什么好方法来确认和解决。
2. dbms_stats 先更新表的统计信息,后更新索引的统计信息,而重新生成执行计划正好在更新表的统计信息之后,更新索引的统计信息之前,导致CBO生成执行计划的时候选择了错误的索引?
3. 木知,发愁ing
求各位大大帮忙分析