代码之家  ›  专栏  ›  技术社区  ›  wasatz

为什么max()在解释计划中创建order by?

  •  1
  • wasatz  · 技术社区  · 16 年前

    当我试图做类似的事情

    SELECT Max(ObjectId) FROM Objects;
    

    我在解释计划中看到,这是通过做一种分类来完成的。现在,排序(我想这需要一些复杂的东西 O(nlogn) )一定比扫描每一行并记住最大值(可以在 O(n) )

    我是不是丢了什么东西?Oracle是否真的在执行排序,或者解释计划只是使用描述“排序”来描述objectid列中所有值的简单扫描?如果甲骨文真的执行“真正的排序”,有没有一个很好的理由这样做,我是失踪?

    提前谢谢!

    1 回复  |  直到 16 年前
        1
  •  5
  •   Vincent Malgrat    16 年前

    因为你还没有公布你桌子的详细情况 Objects 我们只能猜测。我猜你有objectid的索引。在这种情况下,您将在解释计划中看到索引完全扫描(min/max)步骤,这意味着将直接从索引中检索数据。键在索引中排序,因此读取第一个或最后一个键可以得到最小/最大值。

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

    更新:

    如果在objectid上没有索引,您将在解释计划中看到排序聚合步骤。这并不意味着整组都会被排序。事实上,数据在读取时将被聚合。这可能需要对每一行进行一次比较,从而得到总的O(N)成本。

    另一个相关的注意事项是,oracle可能使用 O(n) algorithms 对数据进行排序。