【问题标题】:Why does Max() create an order by in the explain plan?为什么 Max() 会在解释计划中创建 order by?
【发布时间】:2010-03-05 10:10:56
【问题描述】:

当我尝试做类似的事情时

SELECT Max(ObjectId) FROM Objects;

我在解释计划中看到这是通过排序来执行的。现在,排序(我猜这需要O(nlogn) 的复杂性)必须比仅扫描每一行并记住最大值(可以在O(n) 中完成)要昂贵得多。

我在这里遗漏了什么吗? oracle 真的在执行排序还是解释计划只是使用描述“排序”来描述对 ObjectId 列中所有值的简单扫描?如果 oracle 确实执行了“真正的排序”,那么我是否有充分的理由这样做?

提前致谢!

【问题讨论】:

    标签: oracle max sql-execution-plan


    【解决方案1】:

    由于您尚未发布有关您的桌子Objects 的详细信息,我们将不得不猜测。我的猜测是您在 ObjectId 上有一个索引。在这种情况下,您将在解释计划中看到一个 INDEX FULL SCAN (MIN/MAX) 步骤,这意味着数据将直接从索引中检索。键在索引中排序,因此读取第一个或最后一个键可以得到 MIN/MAX。

    这是一个 O(log n) 操作(因为它取决于索引的深度)。

    更新:

    如果您在 ObjectId 上没有索引,您将在说明计划中看到 SORT AGGREGATE 步骤。这并不意味着整个集合都会被排序。事实上,数据将在读取时聚合。这可能需要对每一行进行一次比较,总成本为 O(n)。

    另外,Oracle 可能使用O(n) algorithms 对数据进行排序。

    【讨论】:

    • 就运行时要求而言,Oracle 在排序方面不会比 O(nlogn) 做得更好,除非数据已经通过索引进行了排序。
    猜你喜欢
    • 2012-10-07
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2012-09-13
    • 2010-09-30
    相关资源
    最近更新 更多