首页 > 解决方案 > 在 DBMS_STATS.GATHER_DATABASE_STATS 和 DBMS_STATS.DELETE_DATABASE_STATS 之后无法恢复初始查询性能

问题描述

这是发生的事情:

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;很明显,甲骨文并没有清除一些统计数据。

6) 我放弃并运行Oracle 的Restore Database 工具。在那之后,我又回到了第 1 点,并且可以一次又一次地可靠地重现这个场景。

所有测试均通过连接到本地 Oracle Database 11gR2 Express Edition for Windows x64(Windows 10)实例的 Oracle SQL Developer 完成,该实例在 SSD、i7 CPU、16GB RAM 上运行。在测试期间没有其他系统使用此数据库。

exec DBMS_STATS.GATHER_DATABASE_STATS问题是:如果我不想从备份中完全恢复数据库,如何完全恢复 Oracle 数据库免受鲁莽执行造成的伤害?

我是否遗漏了一些参数,DELETE_DATABASE_STATS或者是否发生了其他事情,并且在运行一次统计信息后数据库以某种方式重新排列,因此执行计划程序无法再恢复到第一个计划?

标签: oraclesql-execution-planrevert

解决方案


推荐阅读