在 C# 的 ToUpper 或 SQL 中的 Upper 函数的性能方面哪个更好
Posted
技术标签:
【中文标题】在 C# 的 ToUpper 或 SQL 中的 Upper 函数的性能方面哪个更好【英文标题】:Which is better in terms of performance ToUpper of C# or Upper function in SQL 【发布时间】:2011-08-03 08:54:17 【问题描述】:我有一种情况,我可以在代码隐藏中使用 ToUpper(),或者我可以在存储过程中使用 SQL 的 Upper。它让我思考使用哪个会更好?我不认为这将是一个重大的性能改进,但我想知道使用哪个会更好以及何时使用
【问题讨论】:
在这种情况下,您应该进行基准测试/分析以确定哪个更好。 你有多少个字符串是大写的?要做出任何改变,都必须付出很多…… 我建议在 MSSQL 中使用 Upper 函数 我不知道它是否对您有帮助:我们有一个长存储过程的案例,其中包含大量字符串操作,例如替换(大量意味着每次调用大约 10 个)数据库性能受到影响。我们将 SP 中的逻辑放到后面的代码中,性能提高了 10 倍(非常主观的规模)。 @Matten,我同意从性能的角度来看(因为数据库已经处理了这么多,为什么还要让它做更多的事情)和从设计的角度来看 【参考方案1】:我就是其中之一,数据库应该只做数据类型的人。就个人而言,我更喜欢 C# 中的 ToUpper() ,因为那是您的逻辑不属于数据库的地方。唯一的性能损失是必须解析 sql 中的 toupper,但我很确定 SPROC 已经过优化,所以据我所知,甚至可能没有区别。
根据我的经验,不要让数据库比它必须的更努力,执行大量这些操作可能会对数据库产生性能影响(对于大量字符串,对于少量字符串可能可以忽略不计)
【讨论】:
终于有人获得了 3-tier/n-tier 架构:D【参考方案2】:我不会去看看哪个是正确的,因为那是主观的,并且取决于你的应用程序的架构和你的内部标准。
根据场景和数据,对数据库执行操作可能会对性能产生影响。
假设您有一个 ORDER
表,其中有一列 STATUS_CODE
将只有大写值(假设是从主表引用)。现在,如果您想获取所有在1 Apr 2011
上的处于“已关闭”状态的订单,并且此“已关闭”来自 UI 下拉菜单,并且可以有小写和大写(无论出于何种原因)。
这里在数据库上做upper还是用C#应该没什么区别。
select *
from order
where order_date = '1 Apr 2011'
and status_code = upper(:status_code)
但是让我们说您的(好的,我的)order
表不引用任何主表,并且可能同时具有大小写值(这不是好的数据库设计)。您可以执行以下操作:
select *
from order
where order_date = '1 Apr 2011'
and upper(status_code) = upper(:status_code)
根据表中的数据可能会有严重的性能问题。
对于一个 oracle 将无法使用status_code
列上的索引(如果有的话)。
【讨论】:
【参考方案3】:1) 如果您在 C# 中使用 ToUpper,并且不想在 SP 中使用 UPPER,您可能会遇到 C# 中的另一部分在执行此 SP 时不使用 ToUpper 并且您可能会收到错误结果的情况 2)字符串操作非常繁重;如果你的服务器真的很忙,字符串操作将是第一个将它们从服务器移动到客户端的候选者。
【讨论】:
以上是关于在 C# 的 ToUpper 或 SQL 中的 Upper 函数的性能方面哪个更好的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# EF Core 中使用 join 子句中的条件编写 SQL 命令
linq 不区分大小写(没有 toUpper 或 toLower)