在数据库内部排序还是在代码中排序?哪个最好?

Posted

技术标签:

【中文标题】在数据库内部排序还是在代码中排序?哪个最好?【英文标题】:Sorting inside the database or Sorting in code behind? Which is best? 【发布时间】:2015-01-03 18:48:41 【问题描述】:

我的 aspx 页面中有一个下拉列表。下拉列表的数据源是一个数据表。后端是 mysql,记录通过存储过程到达数据表。

我想在下拉菜单中按升序显示记录。

我可以通过两种方式实现。

1) dt 是数据表,我正在使用 dataview 过滤记录。

dt = objTest_BLL.Get_Names();

dataView = dt.DefaultView; 
dataView.Sort = "name ASC";
dt = dataView.ToTable();

ddown.DataSource = dt;
ddown.DataTextField = dt.Columns[1].ToString();
ddown.DataValueField = dt.Columns[0].ToString();
ddown.DataBind();

2) 或者在选择查询中我可以简单地说

SELECT
`id`,
`name`
FROM `test`.`type_names`
ORDER BY `name` ASC ;

如果我使用第二种方法,我可以简单地消除数据视图部分。假设这个 type_names 表有 50 条记录。我的页面每分钟有 100,000 名用户查看。考虑效率,内存处理的最佳方法是什么?将未排序的记录获取到数据表并在后面的代码中过滤或在数据表中对其进行排序?

【问题讨论】:

如果你一分钟有 100,000 个用户,你真的应该缓存数据,而不是每次都从 db 加载。 【参考方案1】:

注意 - 只有真实的性能测试才能告诉你真实的数字。理论选项如下(这就是为什么我在这个答案中经常使用单词猜测)。 您至少有 3 个(而不是 2 个)选项 -

    在数据库中排序 - 如果要排序的列已编入索引。那么这可能最有意义,因为在数据库服务器上排序的开销可以忽略不计。 SQL 服务器自己的数据缓存可以使这种超快速操作..但每分钟 10 万次查询..衡量 SQL 是否在没有排序的情况下提供明显更快的结果。

    在代码后面/中间层排序 - 可能你不会有自己的索引等价物。你会排序 50 条记录的列表,每分钟 10 万次。会比 SQL 慢,我会猜。 只有当数据相对静态或变化非常缓慢并且排序后的值可以在内存中缓存几秒钟到几分钟或几小时时,才会有很大的好处。..

    不在您的列表中的选项 - 将未排序的数据一直发送到客户端,并在客户端使用 javascript 对其进行排序。此解决方案的规模可能最大……在浏览器中对 50 条记录进行排序,应该不会对您的用户体验产生明显影响。

【讨论】:

好主意维卡斯。我会稍等片刻,然后决定哪个答案适合我。 :) 谢谢【参考方案2】:

SQL 纯粹主义者无疑会告诉您,让 SQL 进行排序比 C# 更好。也就是说,除非您处理大量记录集或每秒执行许多查询,否则您不太可能注意到任何真正的差异。

对于我自己的项目,这些天我倾向于在 C# 上进行排序,除非我在语句上运行某种聚合。原因是它很快,而且如果您在 SQL 服务器上运行任何类型的存储过程或函数,这意味着您不需要找到将 order by 传递到存储过程中的方法。

【讨论】:

感谢您的回复 harvyk。你的意思是“如果你在 SQL 服务器上运行任何类型的存储过程或函数,这意味着你不需要找到将顺序传递到存储过程中的方法。” ?请解释一下。 通常存储过程将完整的 SELECT 语句“硬编码”到其中,包括将返回哪些列、从哪些表和 ORDER BY。 WHERE 几乎是唯一会使用调用存储过程的参数的部分。 ORDER BY 通常需要在设计时定义的列。您可以将 SQL 构建为字符串 (varchar),然后执行该字符串。在这种情况下,您可以按您想要的列的任何顺序组合传递。也就是说,这样做会让您进入 SQL 注入痛苦的世界。 您还可以添加:扩展前端/Web 级别要容易得多(而且更便宜)。数据库的扩展成本更高。在大规模场景中加载数据库可以产生真正的影响。在大多数情况下,这并不重要。 几年前我参加了 Brent Ozar 的性能调优课程,Brent 提到数据库上的排序操作通常更昂贵,并且省略 ORDER BY 而是在数据层中排序通常是更好的。我们正在使用 ASP.NET,因此我们更改了数据层以省略 ORDER BY,而是在 ADO.NET DataTable 中对数据进行排序,然后将该 DataTable 绑定到我们的 UI 对象(例如 gridview)。

以上是关于在数据库内部排序还是在代码中排序?哪个最好?的主要内容,如果未能解决你的问题,请参考以下文章

重温基础算法内部排序之快速排序法

(附代码)动图图解 | 十大经典排序算法Python版实现

八大基本排序

排序---内部排序算法(快排希尔排序归并排序基数排序冒泡选择排序)比较

八大排序算法

1. 冒泡排序 BubbleSort