SQL ORDER BY的价格有多贵?

时间:2011-02-23 22:19:30

标签: sql sorting

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

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

4 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:2)

确切的方法取决于您使用的产品,但通常功能齐全的DBMS可以使用多种排序算法。一些在磁盘上工作,随着时间的推移优化空间,一些在内存中工作,优化速度。如果您对血腥细节感兴趣,请查看可用的开源代码的源代码。

您不可能通过自己进行排序或使用其他库来获得更好的结果,尽管可能存在病态情况,例如某些操作系统的qsort()在某些数据分布方面存在问题。如果必须,请尝试使用,但更喜欢使用DBMS来管理数据,因为这是他们擅长的。

答案 3 :(得分:0)

如果使用数据库排序,除非sort是基于索引的,否则您将保证在查看结果集的单行之前等待整个结果集在数据库中解析和排序。

如果您自己对数据进行排序,则可以逐步对数据进行排序(对于网络受限环境更好),并且即使排序操作消耗相同的总时间,也可能逐渐增加应用程序以减少执行延迟。

根据部署方案,如果支付与分拣相关的额外成本,可能会产生很大的不同。在我使用中间层的情况下,一次性和可扩展,而数据层的扩展成本更高。如果它的成本相同,但数据库CPU的运营成本为5倍或10倍,那么在数据库外部实现这一目标会更便宜。