发生了什么事
1)我运行了一些优化不是很好的查询-它在16秒内执行(10次测试运行后的平均稳定数);执行计划显示为- dynamic sampling used for this statement (level=2)
,因此该查询没有统计信息。
2)我运行exec DBMS_STATS.GATHER_DATABASE_STATS
3)我再次运行相同的查询-它在46秒(再次为平均数)内执行,并且没有降低;这次执行计划没有说- dynamic sampling used for this statement (level=2)
,因此它具有供该查询使用的统计信息。
4)我假装很奇怪,因为查询执行的时间比没有统计信息的时间长,所以我尝试通过运行来恢复问题
exec DBMS_STATS.DELETE_DATABASE_STATS;
exec DBMS_STATS.DELETE_DATABASE_STATS(NULL, NULL, NULL, DBMS_STATS.AUTO_INVALIDATE, 'ALL', TRUE);
或对于旧版本的Oracle SQL Server:
exec DBMS_STATS.DELETE_DATABASE_STATS(NULL, NULL, NULL, DBMS_STATS.AUTO_INVALIDATE, TRUE);
5)我再次运行相同的查询-祝您好运。尽管执行计划再次说出- dynamic sampling used for this statement'(level=2)
,但查询仍然在46秒内执行。执行计划不同于1和3。因此,显然Oracle尚未清除一些统计信息。
6)我放弃并运行Oracle的Restore Database工具。之后,我再次处于第1点,可以一次又一次可靠地重现此场景。
所有测试都是通过Oracle SQL Developer进行的,该SQL Developer连接到Windows x64(在Windows 10上)实例的本地Oracle Database 11gR2 Express Edition,该实例在SSD,i7 CPU,16GB RAM上运行。测试期间没有其他系统使用此数据库。
问题是:如果我不想从备份中完全还原数据库,那么如何通过不顾一切地执行exec DBMS_STATS.GATHER_DATABASE_STATS
而完全恢复Oracle数据库? < / p>
我丢失了DELETE_DATABASE_STATS
的某些参数还是发生了其他事情,并且运行一次统计信息后数据库以某种方式重新排列,所以执行计划者无法再恢复到第一个计划了吗?