处理大型查询的超时

时间:2012-02-05 16:49:27

标签: c# .net sql-server

我遇到了一个非常简单的查询的超时问题。这似乎是因为它可能会返回大量的结果。

它针对存储加权图的边列表的表:

CREATE TABLE Graph
    (Node1 int not null,
     Node2 int not null,
     Weight real not null,
     UNIQUE NONCLUSTERED (Node1, Node2))

查询只是搜索特定的Node1:

SELECT Node1, Node2, Weight from Graph where Node1 = @node1

查询计划很好 - 非聚集索引查找和RID查找。当然,我将不得不看看我是否可以将唯一的非聚集索引切换到主键。这张桌子很大(大约60演出,数据和索引),所以我确信磁盘正在锻炼身体。

但是,我担心这不会完全解决我的问题。超时发生在我有很多时间旋转我的SqlDataReader之后,我没有读者本身的任何响应问题 - 服务器是完全沟通的。我怀疑真正的问题与SqlCommand.CommandTimeout的文档中的这个说明有关:

  

此属性是命令执行或处理结果期间所有网络读取的累计超时。返回第一行后仍可能发生超时,并且不包括用户处理时间,仅包括网络读取时间。

似乎我在返回特别大的结果集的查询上获得超时,仅仅因为它需要一段时间才能通过网络传输它们。有没有更好的方法来做到这一点?似乎应该有一些方式可以说,“我只想在实际无法通信的情况下暂停。”

2 个答案:

答案 0 :(得分:2)

当发生真正的失败时,您通常会遇到异常......

如果您确定要处理此客户端(而不是通过为服务器提供128 GB的内存来优化服务器端),那么您可以

SqlCommand.CommandTimeout = 0; // or an extremely high value

根据MSDN,这表示“没有超时”。

或者,您可以在其连接字符串中使用context connection=true打开的连接上运行此命令...

答案 1 :(得分:-1)

在适当的硬件上运行它,没问题。对不起,但是这些天“服务器”的容量超过64gb ......这样的表需要的不仅仅是“光盘”。放入一些固态硬盘。这是限制你可以用“光盘”放大的程度。人们说“光盘”通常意味着低端服务器而且光盘甚至不是快速的(并且没有,7200 RPM光盘在企业界是缓慢的,SAS光盘不超过15k)。

  

似乎我在返回特别大的结果集的查询上得到了超时   因为通过网络传输它们需要一段时间

您的数据集有多大?即使是五十万行也不应阻止它。

  

有更好的方法吗?

1gb网络,10gb网络,Infiniband,24gigabit。增加超时。这不是问题 - 但我真的会首先看一下数字。 IIRC超时是30秒,我没有看到你拉这么多数据这是一个问题。