1

当我尝试做类似的事情时

SELECT Max(ObjectId) FROM Objects;

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

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

提前致谢!

4

1 回答 1

5

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

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

更新:

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

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

于 2010-03-05T10:36:28.407 回答