2010-02-08 106 views
1

我有我的SQL Server上ASYNC_NETWORK_IO大的等待时间,我发现这个有趣的文章C#处理结果集

http://blogs.msdn.com/joesack/archive/2009/01/09/troubleshooting-async-network-io-networkio.aspx

我觉得有趣的部分是:

  • 确定较大的结果集并与应用程序团队(或开发人员)进行验证,了解它如何被使用。红旗包括应用查询较大的结果集,但同时不能处理超过几行更

如果您收到来自LINQ查询重新设置,那么你已经处理它的结果(?) 你会如何每次处理它几行(?)这意味着一个SQL阅读器?

如何查找应用程序是否导致 ASYNC_NETWORK_IO问题?

好奇

回答

1

许多开发商往往查询到的LINQ to SQL较大的结果,然后修剪下来,而不是依靠一个利用IQueryable的,这意味着你正在建设一个更加细化的查询,而不是细化的数据子集的模式。

您可能会看到这种情况发生:他们只需要一个子集,但他们编码拉取所有内容,然后将数据过滤到实际需要的数据。

使用IQueryable的存储库模式将确保SQL Server服务器的最优化使用,方法是允许开发人员查询大型结果集并在多个级别修剪它,直到实际需要为止。到那时查询不是:

  1. 获取所有
  2. 获取数据
  3. 过滤子集
  4. 获取数据
  5. 滤光片的另一子集
  6. 获取数据
  7. 显示

现在:

  1. 从所有应用过滤器,然后另一个过滤器
  2. 获取数据
  3. 显示

只是我的想法。

+0

只是一个笔记......他们没有使用LINQ,这个场景发生。他们可能会拉下整个桌子,以便循环播放,并以编程方式查找他们需要的内容,而不是让数据库完成繁重的工作(不正确地预测)。 – AGoodDisplayName 2010-02-08 22:28:11

+0

所以这是例如,select * from big_table 然后在其上实现一个阅读器,并使用阅读器或过滤器对foreach进行过滤,而不是使用简单的过滤器filterparm = 1 – alex 2010-02-09 13:01:47

+0

是的。而不是获取一切,然后过滤它们,他们应该参数化它,并在数据从数据库服务器发送到客户端/ Web服务器之前首先将其过滤掉。 – 2010-02-17 16:37:10