gpt4 book ai didi

database - oracle多久修改一次查询计划?

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:10 25 4
gpt4 key购买 nike

在为我们的数据处理应用程序运行性能基准时,我们从一个空的 FOO_TABLE 开始,然后从一个线程插入记录,而在另一个线程中,我们使用如下查询从处理中选择相同的记录:

select * from FOO_TABLE where ID > ?

连同:

stmt.setMaxRows(5000);

在 Java 中限制在一个 block 中选择的记录数。 (我们不想在这里使用 BETWEEN,因为 ID 有间隙)。我们会继续处理 5000 个 block ,直到测试停止。

现在,我们的应用程序的性能随着时间的推移而下降,当我检查 Oracle 端发生的情况时,我惊讶地注意到“select * from FOO_TABLE where ID > ?”的查询计划执行表扫描而不是使用 ID 上的 PK 索引。

重新启动我们的应用程序(但没有截断表)后,Oracle 恢复了理性并使用了 PK 索引。

因此,我的解释是 Oracle 认为在表几乎为空时扫描表是个好主意,但从未修改过此查询计划。这让我想到了我的问题:Oracle 多久修改一次查询计划?

是因为我重新启动了我们的应用程序吗?我对此有些怀疑,因为我们会在 1 小时后回收我们的池连接(因此任何连接都不能超过 1 小时)。

是不是因为过了一定的时间?

即使表几乎为空,您如何强制 oracle 不进行扫描?

环境信息: - 甲骨文11克 -jdbc 客户端(java 6)

2011 年 10 月 25 日更新:我对 Oracle 10g 进行了回归测试,问题是一样的,所以它既不是由动态游标共享引起的,也不是由动态游标共享引起的,也没有修复。正如 Mark 最初提到的,除非发生重大事件,如结构变化或重新计算表统计数据,否则该计划不会得到修改。

最后我添加了一个提示来强制 PK 访问,但我认为优化器应该能够解决这个问题。如果有符合搜索条件的主键,则继续使用,即使是小表(无论如何性能差异都不显着)。

最佳答案

什么版本的甲骨文?

一般来说,

select * from FOO_TABLE where ID > ?

如果语句不在共享池中,将被硬解析。这将是生成执行计划的时间。

在那之后,执行计划不会改变,除非有什么原因导致它失效。 (在表中删除/添加索引,从表中删除列,重新计算表的统计信息等)。

11g 具有自适应游标共享(这就是我询问 Oracle 版本的原因),无需深入了解很多细节,它会查看绑定(bind)变量值并确定是否需要根据新的计划更改绑定(bind)值。

关于database - oracle多久修改一次查询计划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7760690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com