【问题标题】:Oracle query speed drastically changes with new connectionsOracle 查询速度随着新连接而发生巨大变化
【发布时间】:2020-02-20 12:30:33
【问题描述】:

我有一个数据库查询,在 2 个表(2 个自连接)上进行了 3 个连接,并在末尾按子句排序。数据库服务器位于另一个数据库服务器 Oracle11g 上。我们有一个在内部运行此查询的工具,速度很慢(最多 11 小时而不是 1 小时)。

我从日志中获取了这个查询并在 Toad 11.5 中运行它,起初需要 10 秒(早上 - 数据库在晚上保持不变)。然后我转到数据库服务器并运行该工具,将其杀死或让它完成,然后我回到 Toad 并运行此查询,大约需要 2-3 小时才能完成,相同的查询没有任何更改。

请帮我解决这个奇怪的行为。此外,当查询需要 10 秒时,在删除 order by 时,如果此信息有帮助,则需要大约 500 毫秒。

【问题讨论】:

    标签: oracle11g database-performance query-performance toad


    【解决方案1】:

    TOAD 骗了你。它确实返回了前 500 行(或什么),但不是整个数据集。尝试转到数据集的末尾(Ctrl + End),你会看到它需要多少(阅读:ages)。

    我能想到的两个选项:

    • 使用driving_site 提示,这将强制在数据库服务器上执行,而不是在您当前连接的计算机上执行
    • 将过程移至数据库服务器本身并从本地连接调用它

    【讨论】:

    • 没有过程,只有一个选择语句。有没有办法在蟾蜍中禁用这种缓存行为?另外,为什么运行该工具后它的行为方式不同?蟾蜍的行为应该保持不变
    • 您使用哪个 TOAD 版本?查看您的版本中的“选项”是否提供“OCI Array Buffer Size”;如果是这样,看看它可以设置为。我知道它在 12.5 中不存在,但(正如 Google 所说)早在 12.7 中。
    • Toad 11.5 。我阅读了有关 OCI 缓冲区大小的更多信息,我返回了 250 万条记录。我无法将蟾蜍的缓冲区大小设置为该值(不切实际,每次提取都会分配大缓冲区)。我只需要弄清楚 db 需要多少时间来运行给定的查询,甚至不需要查看数据。请建议是否有其他方法。
    • 您有疑问;假设它看起来像select many_columns from many_tables where some_conditions。为了强制 TOAD 获取它们,请从中选择计数,例如select count(*) from (select many_columns from many_tables where some_conditions),即让您的查询 source 用于计数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多