C# 处理大型查询的超时

C# 处理大型查询的超时,c#,.net,sql-server,C#,.net,Sql Server,我遇到了一个非常简单的查询超时问题。这似乎是因为它可能会返回大量结果 它针对的是存储加权图的边列表的表: CREATE TABLE Graph (Node1 int not null, Node2 int not null, Weight real not null, UNIQUE NONCLUSTERED (Node1, Node2)) 查询只是搜索特定节点1: SELECT Node1, Node2, Weight from Graph where N

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

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

CREATE TABLE Graph
    (Node1 int not null,
     Node2 int not null,
     Weight real not null,
     UNIQUE NONCLUSTERED (Node1, Node2))
查询只是搜索特定节点1:

SELECT Node1, Node2, Weight from Graph where Node1 = @node1
查询计划是okayish-非聚集索引查找和RID查找。当然,我必须看看是否可以将唯一的非聚集索引切换到主键。这张桌子很大(大约60个Gig,数据和索引),所以我确信磁盘得到了一个很好的锻炼

不过,我担心这不能完全解决我的问题。超时发生在我花了相当多的时间来浏览我的
SqlDataReader
之后,而我对读取器本身没有任何响应问题-服务器正在进行完美的通信。我怀疑真正的问题与
SqlCommand.CommandTimeout
文档中的注释有关:

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


似乎我在返回特别大的结果集的查询上得到了超时,只是因为通过网络传输它们需要一段时间。有没有更好的办法?似乎应该有办法说,“我只想在实际通信失败的情况下超时。”

当真正发生故障时,通常会出现异常

如果您确实确定要处理这个客户端(而不是优化服务器端,例如通过给服务器128GB的RAM),那么您可以

SqlCommand.CommandTimeout = 0; // or an extremely high value
根据这一点,表示“无超时”


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

在适当的硬件上运行它,没有问题。很抱歉,现在“服务器”的容量超过64gb。。。像这样的桌子需要的不仅仅是一张光盘。放一些SSD进去。这是一个限制,你可以用你所说的“光盘”缩放多远。人们常说“光盘”是指低端服务器,而光盘甚至不是快的(不,7200 RPM光盘在企业中速度慢,SAS光盘的速度高达15k)

看起来我在返回特别大的结果集的查询上得到了超时,很简单 因为通过网络传输它们需要一段时间

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

有没有更好的办法


1gb网络、10gb网络、24GB的Infiniband。增加超时时间。这不是问题,但我真的会先看看数字。IIRC超时时间为30秒,我看不到您提取了这么多数据,这是一个问题。

另一个加速选项是为
Node1
创建覆盖索引以包括(Node2,权重)。我想这会大大加快速度——还有,为什么不在表上设置聚集索引呢?这是个好问题。就像我上面所说的,下次有机会我会问的将超时设置为0当然可以完成任务,但遗憾的是,没有比这更暴力的事情了。