SQL ORDER BY的价格有多贵?

Jod*_*aki 19 sql sorting

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

在SQL中使用ORDER BY进行排序会更快,而不是像Java那样排序包含结果的链接列表(假设快速内置排序,可能使用quicksort)?

Jus*_*ave 16

在数据库中对数据进行排序几乎肯定会更有效.数据库旨在处理大量数据.并且数据库可以使用各种中间层无法使用的优化.如果您计划在中间层编写一个超高效的排序例程,该例程利用您拥有的数据库中没有的数据(即将数据输出到数十个中间层计算机的集群中,以便sort永远不会溢出到磁盘,利用你的数据主要被命令选择通常不会特别有效的算法这一事实,你可能会超过数据库的排序速度.但这往往很少见.

例如,根据查询,数据库优化器可以选择按顺序返回数据而不执行排序的查询计划.例如,数据库知道索引中的数据已排序,因此它可以选择执行索引扫描以按顺序返回数据,而无需实现和排序整个结果集.如果它必须具体化整个结果,它只需要你要排序的列和某种行标识符(即Oracle中的ROWID)而不是像一个天真的中间层实现那样排序整行数据可能会做.例如,如果在(col1,col2)上有复合索引并且您决定对UPPER(col2),LOWER(col1)进行排序,则数据库可以从索引中读取col1和col2值,对行标识符进行排序,以及然后从表中获取数据.当然,数据库不必这样做 - 优化器将考虑对从表或从各种索引获取数据的成本进行排序的成本.数据库很可能得出结论,最有效的方法是进行表扫描,将整行读入内存并对其进行排序.可以得出结论,利用索引会导致更多的I/O来获取数据,但通过减少或消除排序成本来弥补它.


Chr*_*ash 7

答案是......这取决于.如果ORDER BY部分可以通过使用数据库中的索引来完成,那么查询的执行计划将使用该索引,结果将直接从DB返回正确的顺序.如果没有,那么数据库将执行排序,但它可能比将所有结果读入内存更好(当然比将结果读入链表更好).

  • 排序等任务是数据库擅长的事情,因此数据结构旨在提高效率 - 例如,平衡的二进制树,每个记录插入都会保持更新.索引不包含整个行,只包含记录ID,主键,DB中的位置.当您要求排序结果时,它可以按您要求的顺序快速返回这些位置,然后查找结果集的完整行. (2认同)