c# - SQL 代码比 C# 代码快吗?

标签 c# sql sql-server

<分区>

几个月前,我开始在这家编程公司工作。他们使用的做法之一是尽可能多地使用 SQL 而不是 C# 完成工作。

所以,假设我有一个编写一些文件列表的简单示例:

是这样的:

string SQL = @"
    SELECT f.FileID,
           f.FileName,
           f.FileExtension,
           '/files/' + CAST(u.UserGuid AS VARCHAR(MAX)) + '/' + (f.FileName + f.FileExtension) AS FileSrc,
           FileSize=
           CASE
               WHEN f.FileSizeB < 1048576 THEN CAST(CAST((f.FileSizeB / 1024) AS DECIMAL(6, 2)) AS VARCHAR(8)) + ' KB'
               ELSE CAST(CAST((f.FileSizeB / 1048576) AS DECIMAL(6, 2)) AS VARCHAR(8)) + ' MB'
           END
      FROM Files f
INNER JOIN Users u
        ON f.UserID = u.UserID
";

// some loop for writing results {
//     write...
// }

比这样的东西更快或更好:

string SQL = @"
    SELECT u.UserGuid,
           f.FileID,
           f.FileName,
           f.FileExtension,
           f.FileSizeB
      FROM Files f
INNER JOIN Users u
        ON f.UserID = u.UserID";

// some loop for writing results {
       string FileSrc = "/Files/" + result["UserGuid"] + "/" + result["FileName"] + result["FileExtension"];
       string FileSize = ConvertToKbOrMb(result["FileSizeB"]);  
//     write...
// }

这个特定的代码并不重要(它只是一些基本的例子)...问题是关于一般的这种事情 ...是给 SQL 增加更多负载更好还是“正常”代码?

最佳答案

这只是一个糟糕的编程习惯。您应该分离和隔离程序的不同部分,以便于将来维护(想想下一个程序员!)

性能

许多解决方案的数据库性能不佳,因此大多数开发人员通常将 SQL 数据库访问限制为尽可能小的事务。理想情况下,原始数据到人类可读形式的转换应该在最后可能发生。此外,非格式化数据的内存使用量要小得多,虽然内存很便宜,但你不应该浪费它。缓冲、缓存和传输的每个额外字节都会占用时间,并减少可用的服务器资源

例如对于 Web 应用程序,格式化应该由来自 JSON 数据包的本地 JavaScript 模板完成。这减少了后端SQL数据库和应用服务器的工作量,减少了需要通过网络传输的数据,所有这些都加快了服务器性能

格式和本地化

许多解决方案对同一交易有不同的输出需求,例如不同的 View 、不同的本地化等。通过将格式嵌入到 SQL 事务中,您将不得不为每个本地化创建一个新事务,这将成为维护的噩梦

格式化的交易也不能用于 API 接口(interface),您将需要另一组没有格式化的 API 接口(interface)交易

对于 C#,您应该使用经过良好测试的模板或字符串处理库,或者至少使用 string.Format(),不要对字符串使用 '+' 运算符,它非常慢

分担负载

大多数解决方案为一个数据库提供多个客户端,因此客户端格式化负载由多个客户端 CPU 共享,而不是单个 SQL 数据库 CPU

我严重怀疑 SQL 是否比 c# 快,您应该执行一个简单的基准测试并在此处发布结果:-)

关于c# - SQL 代码比 C# 代码快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21974867/

相关文章:

c# - File.WriteAllBytes 正在创建一个 0 字节文件

c# - 全文搜索 - 有没有办法获取导致查询行的列名

c# - 将 DateTime 转换为格式为 YYYYMMDD 的字符串

c# - ListView 上的单击按钮不起作用

SQL Server 查询添加具有默认值的列

c# - 如何使用 Entity Framework 6 Code First 设置默认值约束?

c# - 将行添加到 GridView

c# - rhino 模拟 AssertWasNotCalled 的使用

SQL select max(date) 和对应的值

asp.net - 您使用什么工具来提高编码效率和整体效率