TSQL 条件与 C# 条件性能
本文关键字:条件 性能 条件性 TSQL | 更新日期: 2023-09-27 18:30:32
我想知道在这样的 tsql 查询中什么执行得更快以及它更可取的条件:
select case 'color' when 'red' then 1 when 'blue' then 2 else 3 end
还是在从数据库获取值后在 C# 代码中执行相同的开关?
switch(color):
{
case "red":
return 1;
case "blue":
return 2;
default:
return 3;
}
为了在我的特定情况下添加更多数据,我们有一个 sql 查询,在某些情况下返回 5800+ 条记录(日期过滤器等),然后在 c# 中连接这些结果(每条记录一个 txt 行)并生成一个 txt。
我们有一台服务器是 sql 服务器 + 网络服务器(asp.net),生成它需要 10 分钟或更长时间......因此,我们考虑在 sql 端执行所有条件,也许在 sql 级别也将字段连接为一个字段,而不是使用 C# 循环与 StringBuilder?
现在 sql 需要 1 秒才能执行,并且在连接循环中花费的所有时间,有 5873 条记录,每条记录有 11 个字段
我认为您过早地进行了优化。"让它工作,让它正确,然后让它变得快速。"
我知道这个陈述(以及其他类似的声明)引起了很多争论,但我认为你应该把这个逻辑放在最合适的层中,比如,重复最少,可重用性最高,最容易维护等。如果此时遇到性能问题,则可以使用自己的负载在环境中进行实际测量。
举个例子,与其像这样的裸开关(必须维护),也许它应该在数据库中的查找表中,并通过连接带回,或者最好将其公开为基于枚举的某个类的属性。 这些可能是更好的模式。
在处理器上所有条件相同的情况下,您的性能可能更多地取决于工作负载和带宽。
您会通过将字符串替换为整数还是简单地添加整数列来节省任何带宽? 是否会对行进行任何过滤,从而导致通过网络的数据显着减少?
如果您有 2 个 Web 服务器和 1 个 sql 服务器,则处理器工作将通过在 Web 服务器上执行来划分。 如果您有数千个胖客户端和 1 个 sql 服务器,则处理器工作将通过在客户端上执行此操作来完全分配。
这真的不可能说,因为有太多未知因素。
例如,这取决于您从数据库返回的数据量、如何处理返回的数据以及数据库服务器或应用程序服务器是否达到容量。
switch
本身会比select
更快,但这很容易被从数据库中返回数字而不是字符串在代码中更快地处理的事实所抵消。