我遇到了一个非常简单的查询的超时问题。这似乎是因为它可能会返回大量的结果。
它针对存储加权图的边列表的表:
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
的文档中的这个说明有关:
此属性是命令执行或处理结果期间所有网络读取的累计超时。返回第一行后仍可能发生超时,并且不包括用户处理时间,仅包括网络读取时间。
似乎我在返回特别大的结果集的查询上获得超时,仅仅因为它需要一段时间才能通过网络传输它们。有没有更好的方法来做到这一点?似乎应该有一些方式可以说,“我只想在实际无法通信的情况下暂停。”
答案 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秒,我没有看到你拉这么多数据这是一个问题。