SQL订单的成本有多高?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我不太明白SQL命令如何对大型结果集进行排序。它是否在内存中动态完成(即当查询完成时)?

使用SQL中的ORDERBY排序比在SQL中使用ORDERBY排序要快吗?比如说,一个包含像Java这样的语言的对象链接列表(假设一个快速内置排序,可能使用快速排序)吗?

提问于
用户回答回答于

对数据库中的数据进行排序几乎肯定会更有效。数据库设计用于处理大数据量。而且,对于数据库来说,有各种可供中间层使用的优化。如果计划在中间层中编写一个高效的排序例程,利用数据库没有的数据信息(例如,将数据转移到由数十台中间层计算机组成的集群中,以便该数据不会溢出到磁盘上),则可以利用以下事实:数据大多被命令选择一个通常不是特别重要的算法。),可能会超过数据库的排序速度。但这往往是罕见的。

例如,根据查询的不同,数据库优化器可以选择一个按顺序返回数据的查询计划,而不执行排序。例如,数据库知道索引中的数据是排序的,所以它可以选择执行索引扫描来按顺序返回数据,而不必对整个结果集进行物化和排序。如果它必须实现整个结果,那么它只需要排序的列和某种类型的行标识符(即Oracle中的ROWID),而不是像简单的中间层实现那样对整行数据进行排序。例如,如果在(col1,col2)上有一个复合索引,并且决定在上面(Col2)、低(Col1)上排序,数据库可以从索引中读取col1&col2值,对行标识符进行排序,然后从表中获取数据。当然,数据库不必这样做--优化器将考虑到根据从表或各种索引获取数据的成本进行排序的成本。数据库很可能得出结论,最有效的方法是进行表扫描,将整行读入内存,并对其进行排序。可以得出结论,利用索引可以获得更多的I/O,但通过减少或消除排序成本来弥补数据。

用户回答回答于

答案是...这取决于。如果可以使用数据库中的索引来执行ORDERBY部分,那么查询的执行计划将使用该索引,结果将直接从DB返回。如果不是,那么数据库将执行排序,但它可能比将所有结果读入内存更好(当然,比将结果读入连系名单)。

扫码关注云+社区