【问题标题】:rownum very slow after a particular valuerownum 在特定值之后非常慢
【发布时间】:2016-05-31 13:41:09
【问题描述】:

我正在 Oracle SQL 开发人员中运行一个查询,看起来像这样:

select * from dummy_table where col1 rownum

查询大约需要 3 秒,如果 x 的值

但如果将 x 替换为大于 12 的任何值,则查询耗时超过 7 秒,并且只返回 12 个结果(换句话说,只有 12 行满足 where 子句)。

为什么 rownum 会这样?如果 x 的值从 12 更改为 13,我希望此查询花费几乎相同的时间。

编辑: 我注意到的另一件事是 col1、col2 和 col3 上有一个复合索引。如果我删除索引(或使用提示禁用它),查询会运行得非常快。

【问题讨论】:

    标签: oracle rownum


    【解决方案1】:

    不了解表结构、索引等,很难给出完整的解释。

    但是,为了简单起见,如果您的表只有 12 行符合您的条件,则要求前 12 行意味着 Oracle 只需查找 12 行并返回它们,无论有多少行不符合您的条件条件。

    如果你要求,比如说,13 行,Orace 需要扫描整个表,以检查是否存在第 13 行。

    因此,在没有索引和提示的情况下,请求前 13 行(其中仅存在 12 行)可能需要全表扫描,这可能会很慢。

    请认为这是一个非常简单的解释,不考虑索引、缓存、提示。例如,我们没有考虑到即使只是通过运行来检查查询的性能也可能会产生误导,因为 Oracle 可能会使用缓存,而您在第一次运行后可以获得更好的性能。

    【讨论】:

    • 你给我的答案听起来很合理。事实上,我还假设预言机会在幕后做类似的事情。但我找不到任何支持这一理论的参考资料。您能否引用任何可以证实您的答案的参考资料?
    猜你喜欢
    • 2015-06-27
    • 2012-02-10
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2015-05-22
    相关资源
    最近更新 更多