在DBMS_STATS.GATHER_DATABASE_STATS和DBMS_STATS.DELETE_DATABASE_STATS之后,无法获取初始查询性能

时间:2018-10-31 23:04:08

标签: oracle sql-execution-plan revert

发生了什么事

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的某些参数还是发生了其他事情,并且运行一次统计信息后数据库以某种方式重新排列,所以执行计划者无法再恢复到第一个计划了吗?

0 个答案:

没有答案