几个月前,我开始在这个编程公司工作。他们使用的一个实践是在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.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或“正常”代码上加载更多的负载?
解决方法
这只是一个糟糕的编程习惯。您应该分离和隔离程序的不同部分,以便将来维护(想想下一个程序员!)
许多解决方案的糟糕的DB性能,所以大多数开发人员通常会限制sql数据库访问到最小的事务可能。理想地,将原始数据转换为人类可读的形式应该在可能的最后一点发生。此外,非格式化数据的内存使用量要小得多,而内存便宜,您不应该浪费它。要缓冲,缓存和传输的每个额外字节都占用时间,并减少可用的服务器资源
例如对于Web应用程序格式化,应由JSON数据包中的本地JavaScript模板完成。这减少了后端sql数据库和应用程序服务器的工作量,并减少了需要通过网络传输的数据,所有这些都加速了服务器性能
格式化和本地化
许多解决方案对于相同的事务具有不同的输出需求,例如不同的视图,不同的地理位置等。通过将形成嵌入到sql事务中,您将不得不为每个本地化创建一个新的事务,这将成为一个维护噩梦
还可以将格式化的事务用于API接口,您还需要另外一套API接口的事务,该接口将无格式化
使用c#,您应该使用经过良好测试的模板或字符串处理库,或至少string.Format(),不要使用”运算符与字符串,这是非常慢
大多数解决方案都有一个DB的多个客户端,因此客户端格式化负载与多个客户端cpu共享,而不是单个sql数据库cpu
我非常怀疑sql比c#快,你应该执行一个简单的基准测试,并在这里发布结果:-)