为什么Max()在解释计划中创建订单?

时间:2010-03-05 10:10:56

标签: oracle max sql-execution-plan

当我尝试做类似

的事情
SELECT Max(ObjectId) FROM Objects;

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

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

提前致谢!

1 个答案:

答案 0 :(得分:5)

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

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

更新

如果您没有ObjectId的索引,您将在解释计划中看到SORT AGGREGATE步骤。这并不意味着整个集合将被排序。事实上,数据将在读取时进行汇总。这可能涉及每行的单一比较,从而为您提供总O(n)成本。

同样在相关的说明中,Oracle可能使用O(n) algorithms对数据进行排序。