oracle - 在 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
或者是否发生了其他事情,并且在运行一次统计信息后数据库以某种方式重新排列,因此执行计划程序无法再恢复到第一个计划?
解决方案
推荐阅读
- javascript - 如何过滤出对象可能存在或不存在的数组元素?
- firebase - 从 Firestore 文档颤动创建一个对象
- lua - 我如何在 roblox studio 中制作投票系统?
- c# - 循环遍历列表
分批,同时确保每批项目是唯一的 - firebase - 无法使用提供者和获取数据:尝试调用 Provider.of
- react-native - “Yourapp”尚未注册 - 世博会
- json - Spring REST将对象返回到json中,并附加了额外的行
- kubernetes - 如何在 kubernetes 集群外将 metrics-server 抓取到 prometheus
- c - 如何跟踪指针在哪一侧
- python - 第一次安装 Django 时遇到问题