当我尝试做类似
的事情SELECT Max(ObjectId) FROM Objects;
我在解释计划中看到这是通过排序来执行的。现在,排序(我想这需要复杂的O(nlogn)
)必须比扫描每一行并记住最大值(可以在O(n)
中完成)花费更多。
我在这里遗漏了什么吗? oracle是真的执行排序还是解释计划只是使用描述“sort”来描述ObjectId列中所有值的简单扫描?如果oracle确实执行了“真正的排序”,那么我有理由这么做吗?
提前致谢!
答案 0 :(得分:5)
由于您尚未发布有关您的论坛Objects
的详细信息,我们将不得不猜测。我的猜测是你有一个关于ObjectId的索引。在这种情况下,您将在解释计划中看到INDEX FULL SCAN(MIN / MAX)步骤,这意味着将直接从索引中检索数据。键在索引中排序,因此读取第一个或最后一个键可以得到MIN / MAX。
这是一个O(log n)操作(因为它取决于索引的深度)。
如果您没有ObjectId的索引,您将在解释计划中看到SORT AGGREGATE步骤。这并不意味着整个集合将被排序。事实上,数据将在读取时进行汇总。这可能涉及每行的单一比较,从而为您提供总O(n)成本。
同样在相关的说明中,Oracle可能使用O(n) algorithms对数据进行排序。