was*_*atz 1 oracle max sql-execution-plan
当我尝试做类似的事情
SELECT Max(ObjectId) FROM Objects;
Run Code Online (Sandbox Code Playgroud)
我在解释计划中看到这是通过排序来执行的.现在,排序(我认为需要复杂性的东西O(nlogn))必须比扫描每一行并记住最大值(可以在其中完成O(n))花费更多.
我在这里错过了什么吗?oracle是真的执行排序还是解释计划只是使用描述"sort"来描述ObjectId列中所有值的简单扫描?如果oracle确实执行了"真正的排序",那么我有理由这样做吗?
提前致谢!
由于您尚未公布有关您的桌子的详细信息,Objects我们将不得不猜测.我的猜测是你有一个关于ObjectId的索引.在这种情况下,您将在解释计划中看到INDEX FULL SCAN(MIN/MAX)步骤,这意味着将直接从索引中检索数据.键在索引中排序,因此读取第一个或最后一个键可以获得MIN/MAX.
这是一个O(log n)操作(因为它取决于索引的深度).
如果您没有ObjectId的索引,您将在解释计划中看到SORT AGGREGATE步骤.这并不意味着整个集合将被排序.事实上,数据将在读取时进行汇总.这可能涉及每行的单一比较,从而为您提供总O(n)成本.
另外在相关的说明中,Oracle可能使用O(n)算法对数据进行排序.