处理大型查询的超时

本文关键字:超时 查询 大型 处理 | 更新日期: 2023-09-27 18:22:28

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

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

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

查询计划是okayish-非聚集索引查找和RID查找。当然,我必须看看是否可以将唯一的非聚集索引转换为主键。这张表很大(大约有60场演出,数据和索引),所以我相信这个磁盘正在进行一次巨大的锻炼。

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

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

对于返回特别大的结果集的查询,我似乎会超时,因为通过网络传输它们需要一段时间。有更好的方法吗?似乎应该有办法说,"我只想在实际通信失败的情况下超时。"

处理大型查询的超时

当真正的失败发生时,通常会得到一个异常。。。

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

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

根据MSDN的说法,这表示"没有超时"。

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

在适当的硬件上运行它,没有问题。抱歉,但"服务器"最近的容量超过64gb。。。像这样的桌子需要的不仅仅是"一张光盘"。放一些SSD。这是一个限制,你可以用"光盘"扩展到什么程度。人们说"光盘"通常意味着低端服务器,而光盘甚至不是一个快速的服务器(不,7200 RPM的光盘在企业界是慢的,SAS光盘高达15k)。

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

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

有更好的方法吗?

1gb网络,10gb网络,英飞凌24GB。增加超时。这不是问题,但我真的会先看看数字。IIRC超时是30秒,我没看到你提取这么多数据,这是一个问题。