首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQL ORDER BY有多贵?

SQL ORDER BY有多贵?
EN

Stack Overflow用户
提问于 2011-02-24 06:19:30
回答 3查看 13.6K关注 0票数 21

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

在SQL中使用ORDER BY进行排序是否会比在Java等语言中使用包含结果的对象链表进行排序更快(假设使用快速内置排序,可能使用快速排序)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-02-24 06:27:28

几乎可以肯定的是,对数据库中的数据进行排序会更有效。数据库是为处理大数据量而设计的。并且有各种可用于数据库的优化,而这些优化对于中间层则不可用。如果您计划在中间层编写一个超级高效的排序例程,该例程利用数据库没有的有关数据的信息(例如,将数据分派到由数十台中间层机器组成的集群中,这样排序就不会溢出到磁盘,从而利用这样一个事实,即您的数据大多被排序,以选择一种通常效率不是特别高的算法),那么您可能可以超越数据库的排序速度。但这种情况往往很少见。

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

票数 20
EN

Stack Overflow用户

发布于 2011-02-24 06:26:43

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-08-05 02:38:33

除非排序是基于索引的,否则如果您使用数据库排序,您可以保证您将等待整个结果集在数据库中解析和排序,然后才能看到结果集的任何一行。

如果你自己排序,数据可能会被增量地流式传输(更适合于网络受限的环境),并且可能会逐渐对应用程序有用,即使排序操作消耗了相同的总时间,也会减少执行延迟。

根据部署场景的不同,与排序相关的额外成本应该在哪里支付,这可能会产生很大的不同。在我使用的场景中,中间层是一次性和可伸缩的,而数据层向外扩展的成本更高。如果它的CPU成本相同,但数据库CPU的运营成本是它的5倍或10倍,那么在数据库之外做这件事实际上就更便宜了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5097942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档