【问题标题】:Is there a way to fix Oracle query in shared pool有没有办法修复共享池中的 Oracle 查询
【发布时间】:2011-06-21 05:37:25
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: performance oracle sql-execution-plan


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 它确实使用了绑定变量。但是如果缓存过载,它会保留吗?正如我所看到的,问题是缓存在白天删除了这个查询,然后再次对其进行硬解析。
    • 在这种情况下,shared_pool 太小或应用程序的其他部分触发了太多不可共享的 sql。通常,rdbms 会尝试重用和缓存所有它可以使用的东西,而不是删除它认为有价值的东西。
    • 是的,这是最初的问题。我想知道,我可以提示 Oracle 不要从 shared_pool 中删除此查询。换句话说,将其设置为共享池中最“有价值”的查询,关于可用性等等。
    【解决方案2】:

    也许你应该把你的“我想……”改成“我测试并确定……”:)

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

    编辑:回答您的直接问题 - 一种解决方法可能是定期运行解析查询但不执行查询的作业。您甚至可以使用它来确定是解析还是获取是问题所在。

    【讨论】:

    • 我不能说我测试过,因为我没有 DBA 访问数据库,也看不到任何 Oracle 技术表,所以我只能假设那里的东西。我什至不能使用自动跟踪。我对缓存也有猜测,这就是为什么我用不同的参数进行测试,以前日期的参数等,不应该被提取到缓存中,以排除缓存影响,但仍然没有效果。
    • 甚至还有一种工具可以用于这种方法的 Quest SQL Optimizer 8.0.0 for Oracle。这是我的第一个选择:)
    【解决方案3】:

    您可以尝试使用dbms_shared_pool.keep 固定到共享池

    但我首先要确定你是否有老化问题

    【讨论】:

    • 谢谢,看起来很有趣。根据规范,我需要为它创建一个函数,以这种方式将其放入池中,对吗?,或者简单的查询也可以?又应该是什么样的功能呢?
    • 可以通过 DBMS_SHARED_POOL.KEEP('0034CDFF, 20348871') 保存游标。完整的十六进制地址必须在前 8 个字符中 是这样吗?
    • 如果你要使用 pinning,我会加入一个函数/程序
    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 2018-08-26
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多