我有一个ADO.NET / TSQL性能问题。我们的应用程序有两个选项:
1)一个带有多个结果集的大型数据库调用,然后在代码中逐步执行每个结果集并填充我的对象。这导致一次往返数据库。
2)多个小型数据库调用。
使用选项2可以进行更多的代码重用,这是该选项的一个优点。但我想对性能成本有所了解。两次小型往返的速度是数据库的一次大型往返的两倍,还是只是一个小的,比如10%的性能损失?我们正在使用C#3.5和Sql Server 2008与存储过程和ADO.NET。
答案 0 :(得分:6)
我认为它部分取决于您何时需要数据。例如,如果您在一个大型流程中返回十个数据集,并且同时在屏幕上查看全部十个数据集,那么请继续操作。但是,如果您返回十个数据集,并且用户可能只点击页面以查看其中三个数据集,那么发送其他数据集会浪费服务器和网络资源。如果你返回十个数据集但用户确实只需要在对第5组和第6组进行更改后才能看到第七组和第八组,那么如果你过早地返回它,用户就会看到错误的信息。
如果对一个主存储过程中调用的每个数据集使用单独的存储过程,则没有理由不能在其他地方重用代码,因此代码重用在我看来并不是真正的问题。
答案 1 :(得分:1)
这听起来有点明显,但只能在一次通话中发送你需要的东西。
例如,我们有一个“getStuff”存储过程用于演示。 “updateStuff”proc调用“getStuff”proc,“updateStuff”的客户端包装器方法调用“Thing”类型。所以往返一次。
Chatty服务器是您可以轻松预防的一件事。然后,您可以根据需要调整数据库或客户端代码......但无论代码运行速度有多快,以后都很难分解往返。在极端情况下,如果您的Web服务器与数据库服务器位于不同的国家/地区,该怎么办?
编辑:有趣的是注意到SQL人员(HLGEM,astander,me)说“一次旅行”,客户端人员说“多次,代码重用”......
答案 2 :(得分:1)
我自己正在努力解决这个问题。我还没有答案,但我确实有一些想法。
在审查了其他人给出的答案之后,还有第三种选择。
在我的应用程序中,大约十或十二次调用服务器以获取我需要的数据。一些数据字段是varchar max和varbinary max fields(图片,大文档,视频和声音文件)。我的所有呼叫都是同步的 - 即,在请求数据时,用户(和客户端程序)别无选择,只能等待。他可能只想阅读或查看仅在那里完全有意义的数据,而不仅仅是那里的部分数据。我相信这个过程比较慢,我正在开发一种替代方法,它基于从DLL libaray向服务器的异步调用,它将事件引发到客户端以向客户端宣告进度。客户端被编程为处理DLL事件并在客户端设置变量,指示已完成chich调用。然后,客户端程序可以执行必要的操作来准备在调用#1中接收的数据,同时DLL正在异步进行以获取调用#2的数据。当客户端准备好处理呼叫#2的数据时,它必须检查状态并在必要时等待继续(我希望这将是短暂的或者根本不等待)。通过这种方式,服务器和客户端软件都能以更有效的方式完成工作。
答案 3 :(得分:0)
如果您关注的是性能问题,请尝试对两者进行测试,看看哪种效果更好。
就个人而言,我更喜欢第二种方法。它使开发人员的生活更轻松,使代码更易于重复使用,并使事情模块化,因此更容易进行更改。
答案 4 :(得分:0)
我个人喜欢选项二,原因是您声明:代码重用
但请考虑一下:对于小型请求,延迟可能比您对请求所做的更长。你必须找到适当的平衡。
答案 5 :(得分:0)
作为ADO.Net开发人员,您的工作是尽可能使代码正确,清晰和可维护。这意味着您必须将您的疑虑分开。
SQL Server连接技术的作用是使其快速。
如果您实现了一个正确,清晰,可维护的应用程序来解决业务问题,并且事实证明数据库访问是阻止系统在可接受的限制内运行的主要瓶颈,那么,只有这样,您才应该开始坚持不懈地解决问题。这可能包括也可能不包括合并数据库查询。
答案 6 :(得分:-1)
就个人而言,我会选择一次更大的往返。
这肯定会受到调用代码的确切可重用性以及如何重构的影响。
但如上所述,这将取决于您的具体情况,可维护性与性能可能是一个因素。
答案 7 :(得分:-1)
在需要时,请不要 优化 以提高性能。这意味着您应该分析预期的使用模式,并确定此过程的典型使用频率,以及当前设计将导致的用户界面延迟。如果用户将从应用程序收到的反馈少于几(2-3)秒,并且此过程中的应用程序负载不是服务器容量的过度负载,那么不必担心它。如果用户正在等待一段不可接受的响应时间(主题但可以确定),或者如果服务器过载,那么就该开始优化了。然后,哪种优化技术最有意义,或者最具成本效益,取决于您对问题的分析告诉您的内容。
因此,在此期间,要注重可维护性。这意味着,在您的情况下,代码重用