我有一个报表引擎,在Oracle 11上执行PreparedStatements,这是一个高度优先的任务。
我看到的是,第一次查询调用通常比之后的同一查询执行的时间长得多(查询具有不同的参数并返回不同的数据)。
我想这是由于Oracle在第一次查询调用时进行的硬解析。
我想知道,有没有办法暗示Oracle,这个查询是高度优先的查询,它会经常执行,哪个性能很关键,所以它应该保留在共享池中,无论如何?
我知道我可以在Oracle 11中修复执行计划,但我不想修复它,我希望Oracle仍然可以更改它,因为系统更改,我想要的只是排除查询硬解析。
答案 0 :(得分:4)
也许你应该把你的“我想......”改成“我经过测试并且已经确定......”:)
查询性能可能不仅仅受到解析的影响;当它执行时,它必须从磁盘中取出块到缓冲区缓存中 - 后续执行很可能利用内存中找到的块,因此更快。
编辑:回答您的直接问题 - 解决方法可能是定期运行一个解析查询但不执行它的作业。您甚至可以使用它来确定解析或提取是否是问题的基因座。
答案 1 :(得分:1)
安东, 如果您的查询使用绑定变量,它将被重用。光标将被缓存,只要重新使用它,它将保留在光标缓存中。确保它使用绑定变量。这增加了可重用性和可扩展性。
如果您不信任rdbms,可以使用dbms_shared_pool.keep将其固定。 见http://psoug.org/reference/dbms_shared_pool.html
您需要找到光标才能这样做。 通常还有一个问题需要解决。
答案 2 :(得分:1)
您可以尝试使用dbms_shared_pool.keep
固定到共享池但我首先要确保你有一个老化问题