很久以前,我被建议在应用层对数据进行排序,而不是在SQL中使用ORDER BY
子句。原因是.Net将更有效地排序SQL引擎。
与此建议冲突的是我遇到的SSIS最佳实践建议在SQL中对数据进行排序,可以避免排序转换。
SSIS建议对我有意义。所以现在我想知道避免ORDER BY
的最初建议是否是虚假的。
鉴于查询不太复杂,ORDER BY是否一定意味着性能受损?
感谢。
答案 0 :(得分:6)
Brent Ozar的argument for avoiding ORDER BY归结为SQL Server许可证价格昂贵且应用程序服务器许可证价格便宜。事实上,SSIS中的“应用程序服务器”是SQL Server,因此“更便宜的服务器”参数不适用。
我从未见过.NET排序本质上比SQL Server排序更快的论点,但如果一般情况下我会非常惊讶(特别是考虑到可用的基础数据的元信息量)到SQL Server查询优化器,但不可用于通用.NET Sort()方法)。我知道SSIS排序转换可以对数据流产生很大的性能影响,因为所有数据必须在排序开始之前由SSIS缓存。
因此,在选择使用T-SQL ORDER BY子句对数据进行排序或SSIS排序转换的特定情况下,我总是选择ORDER BY子句来开始。
答案 1 :(得分:4)
首先,如果您真的想知道给定的数据集,那么您应该对其进行测试。
也就是说,我认为你应该在服务器端进行排序有几个原因。
首先,服务器可以利用更多硬件 - 多个线程,多个磁盘,多个处理器 - 进行排序。这可以对性能产生重大影响。
其次,可能没有必要进行排序。在某些情况下,查询实际上不必对结果进行排序,因为它们已经排序。例如,可以根据已排序的索引返回结果。
第三,内存使用问题和内存泄漏往往在客户端更普遍。 (好吧,你没有说你正在使用java,所以你对此有点安全。)数据库服务器知道如何管理内存。
第四,我认为在服务器端进行数据操作是个好主意。如果您尝试对每个操作进行微优化,编码会变得非常复杂,其中一些在服务器上,一些在客户端。除非某些内容与数据的表示有关,否则请在服务器上进行。
所有这一切,如果你只是为了一个页面排序20个项目用于演示目的,那么它没有什么区别。如果您对此感到满意,请在客户端进行。