一个较大的调用与多个较小的TSQL调用

一个较大的调用与多个较小的TSQL调用,tsql,Tsql,我有一个ADO.NET/TSQL性能问题。我们的应用程序中有两个选项: 1) 使用多个结果集进行一次大型数据库调用,然后在代码中逐步遍历每个结果集并填充我的对象。这将导致数据库的一次往返 2) 多个小型数据库调用 选项2有更多的代码重用,这是该选项的一个优点。但我想了解性能成本是多少。两次小的往返速度是一次大的数据库往返速度的两倍,还是只是一个小的性能损失,比如说10%的性能损失?我们正在将C#3.5和Sql Server 2008与存储过程和ADO.NET一起使用。如果您非常关心性能,请尝试测

我有一个ADO.NET/TSQL性能问题。我们的应用程序中有两个选项:

1) 使用多个结果集进行一次大型数据库调用,然后在代码中逐步遍历每个结果集并填充我的对象。这将导致数据库的一次往返

2) 多个小型数据库调用


选项2有更多的代码重用,这是该选项的一个优点。但我想了解性能成本是多少。两次小的往返速度是一次大的数据库往返速度的两倍,还是只是一个小的性能损失,比如说10%的性能损失?我们正在将C#3.5和Sql Server 2008与存储过程和ADO.NET一起使用。

如果您非常关心性能,请尝试测试这两个版本,看看哪一个性能更好


就我个人而言,我更喜欢第二种方法。它使开发人员的生活更加轻松,使代码更加可重用,并使事情模块化,从而使以后的更改更加容易。

就个人而言,我会选择更大的往返行程

这肯定会受到调用代码的可重用性以及重构方式的影响


但如前所述,这将取决于您的具体情况,其中可维护性与性能可能是一个因素。

我个人喜欢选项二,因为您指出:代码重用

但请考虑这一点:对于小请求,等待时间可能比请求所用的时间长。你必须找到正确的平衡。

在需要之前,不要优化性能。这意味着您应该分析预期的使用模式,并确定此过程的典型使用频率,以及当前设计将导致的用户界面延迟。如果用户从应用程序收到的反馈少于几(2-3)秒,并且此过程中的应用程序负载不是服务器容量上的过度负载,那么不用担心。如果用户等待响应的时间不可接受(主观但明确可测量),或者服务器过载,那么是时候开始优化了。然后,哪些优化技术最有意义,或者最具成本效益,取决于您对问题的分析


因此,同时,关注可维护性。这意味着,在您的情况下,代码重用作为ADO.Net开发人员,您的工作是使代码尽可能正确、清晰和可维护。这意味着您必须分离您的关注点

SQL Server连接技术的任务是使其快速


如果您实现了一个解决业务问题的正确、清晰、可维护的应用程序,并且发现数据库访问是阻碍系统在可接受范围内运行的主要瓶颈,那么,也只有到那时,您才应该开始寻找解决问题的方法。这可能包括也可能不包括整合数据库查询。

我认为这部分取决于您何时需要数据。例如,如果您在一个大进程中返回十个数据集,并且一次在屏幕上看到所有十个数据集,那么就开始吧。但是,如果您返回10个数据集,而用户可能只通过单击页面来查看其中的三个,那么发送其他数据集是对服务器和网络资源的浪费。如果您返回10个数据集,但用户确实需要在更改集合5和6后才能查看集合7和集合8,那么如果您过早返回,用户将看到错误的信息


如果对在一个主存储过程中调用的每个数据集使用单独的存储过程,那么没有理由不能在其他地方重用代码,因此代码重用在我看来并不是一个真正的问题。

这听起来有点明显,但只在一次调用中发送您需要的内容

例如,我们有一个用于表示的“getStuff”存储过程。“updateStuff”过程调用“getStuff”过程,“updateStuff”的客户机包装器方法需要类型“Thing”。所以一次往返

闲聊的服务器是一件你可以用最少的努力预先阻止的事情。然后,您可以根据需要调整数据库或客户端代码。。。但无论代码运行速度有多快,都很难在以后计算出往返。在极端情况下,如果您的web服务器与您的DB服务器位于不同的国家,该怎么办


编辑:值得注意的是,SQL人员(HLGEM、astander、me)说“一次旅行”,而客户端人员说“多个,代码重用”…

我自己也在努力解决这个问题。我还没有答案,但我有一些想法

在回顾了其他人对此给出的答案后,还有第三种选择

在我的应用程序中,大约有十到十二次调用服务器来获取我需要的数据。一些数据字段是varchar max和varbinary max字段(图片、大型文档、视频和声音文件)。我所有的调用都是同步的——也就是说,当数据被请求时,用户(和客户端程序)别无选择,只能等待。他可能只想阅读或查看数据,而这些数据只有在全部存在而不是部分存在时才有意义。我认为,这样做的过程比较慢,我正在开发一种替代方法,该方法基于从DLL库对服务器的异步调用,该库向客户端引发事件,以向客户端宣布进度。客户端被编程为处理DLL事件,并在客户端设置一个变量,指示chich调用已完成。然后,当DLL异步进行以获取call#2的数据时,客户端程序可以做它必须做的事情来准备在call#1中接收的数据。当客户端准备好处理call#2的数据时,它必须检查状态,并在必要时等待继续(我希望这将是一个短暂的等待或根本不等待)。通过这种方式,服务器端和客户端软件都可以以一种简单的方式完成工作