有没有办法在共享池中修复Oracle查询

时间:2011-02-04 08:54:14

标签: performance oracle sql-execution-plan

我有一个报表引擎,在Oracle 11上执行PreparedStatements,这是一个高度优先的任务。

我看到的是,第一次查询调用通常比之后的同一查询执行的时间长得多(查询具有不同的参数并返回不同的数据)。

我想这是由于Oracle在第一次查询调用时进行的硬解析。

我想知道,有没有办法暗示Oracle,这个查询是高度优先的查询,它会经常执行,哪个性能很关键,所以它应该保留在共享池中,无论如何?

我知道我可以在Oracle 11中修复执行计划,但我不想修复它,我希望Oracle仍然可以更改它,因为系统更改,我想要的只是排除查询硬解析。

3 个答案:

答案 0 :(得分:4)

也许你应该把你的“我想......”改成“我经过测试并且已经确定......”:)

查询性能可能不仅仅受到解析的影响;当它执行时,它必须从磁盘中取出块到缓冲区缓存中 - 后续执行很可能利用内存中找到的块,因此更快。

编辑:回答您的直接问题 - 解决方法可能是定期运行一个解析查询但不执行它的作业。您甚至可以使用它来确定解析或提取是否是问题的基因座。

答案 1 :(得分:1)

安东, 如果您的查询使用绑定变量,它将被重用。光标将被缓存,只要重新使用它,它将保留在光标缓存中。确保它使用绑定变量。这增加了可重用性和可扩展性。

如果您不信任rdbms,可以使用dbms_shared_pool.keep将其固定。 见http://psoug.org/reference/dbms_shared_pool.html

您需要找到光标才能这样做。 通常还有一个问题需要解决。

罗纳德。 http://ronr.blogspot.com

答案 2 :(得分:1)

您可以尝试使用dbms_shared_pool.keep

固定到共享池

但我首先要确保你有一个老化问题