在数据库内排序还是在代码后端排序?哪个更好?

12

我的aspx页面中有一个下拉列表。下拉列表的数据源是一个datatable。后端使用的是MySQL,通过使用存储过程将记录传输到datatable中。

我想以升序方式在下拉菜单中显示记录。

我可以通过两种方式实现这个目标。

1)dt是datatable,我正在使用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 ;

如果我使用第二种方法,我可以简单地消除dataview部分。假设这个type_names表有50条记录。而我的页面每分钟被10万个用户查看。就效率和内存处理来考虑,什么是最好的方法?在代码后端获取未排序的记录并过滤,还是在数据库内对其进行排序?


1
如果你每分钟有100,000个用户,你应该将数据缓存起来,而不是每次从数据库中加载。 - Chief Wiggum
2个回答

17
注意 - 只有真正的性能测试才能告诉您真实的数字。以下是理论选项(这就是为什么我在这个答案中经常使用“猜测”一词)。
您至少有3个选项(而不是2个)-
  1. 在数据库中排序 - 如果要排序的列被索引..那么这可能是最有意义的,因为在数据库服务器上进行排序的开销可能是可以忽略的。 SQL服务器自己的数据缓存可以使此操作非常快速..但是每分钟100,000个查询..如果没有排序,则测量是否提供了显着更快的SQL结果。

  2. 在代码后端/中间层中排序 - 可能你没有自己的索引等价物..你将对包含50条记录的列表进行排序,每分钟100,000次..比SQL慢,我会猜测。 仅当数据相对静态或变化非常缓慢时,并且已排序的值可以在内存中缓存几秒钟到几分钟或几小时时,才会产生巨大的好处..

  3. 不在您的清单中的选项 - 将未排序的数据全部发送到客户端,然后使用JavaScript在客户端对其进行排序。这个解决方案可能具有最好的可扩展性... 在浏览器中排序50条记录,不应对您的UX产生明显影响。


好主意,Vikas。我会稍等一下,然后再决定哪个答案适合我。 :) 谢谢 - Prageeth Liyanage

0

SQL 纯粹主义者无疑会告诉你,最好让 SQL 进行排序而不是 C#。尽管如此,除非你处理大量记录集或每秒执行多个查询,否则你不太可能注意到任何真正的差异。

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接