"等待操作超时"阅读记录时

时间:2016-05-12 11:47:04

标签: c# sql-server ado.net

我有一些代码从SqlDataReader将结果读入List中,然后将它们解析为域对象,因为它使用了reader.GetXXX(int ordinal)方法,在while读者.Read()循环中。

这段代码通常可以在非常大的数据集和各种查询和表格中正常工作,但是一个查询在读取此结果列表的过程中会挂起,并最终超时,等待操作超时"错误。

我已经重复了很多次,它总是挂在同一条记录上(大约336k条记录到337k记录集中)。

如果我暂停执行,我可以看到它正在解析记录的中途,并且它挂在阅读器上.GetXXX呼叫。

我尝试了以下内容:

  • 在ssms中手动执行proc(工作正常)
  • 对数据库进行调用,使其在一个块中读取250k记录,然后重新查询以获取其余内容(它仍然挂在同一记录上,但现在记录在第二批中)
  • 在解析之前检查每条记录的ID,并跳过它挂起的记录(之后的记录被解析但挂起在下一条记录上)。
  • 更新统计信息(在此之后挂起之前解析得到大约3000条记录)

我很想责怪数据库,但鉴于查询在SSMS中顺利运行,我不相信。任何帮助非常感谢!

其他可能有用的东西:

  • proc获取一个表值参数并将其与另一个数据库表连接起来以获得其结果
  • 这最初发现在从客户端机器运行很长的VM上,但我随后通过恢复并连接到我桌面下的机器来复制它。

编辑:根据要求,查询为:

CREATE PROCEDURE [trading].[Trade_SelectLegalEntityPositionChunked]
        @PartyPositions trading.PartyPositionType READONLY,
        @Offset INT,
        @ChunkSize INT
AS
BEGIN
SET NOCOUNT ON;

DECLARE @OffsetLocal INT = @Offset;
DECLARE @ChunkSizeLocal INT = @ChunkSize;

SELECT  /* stuff */
FROM    [trading].[Trade]
JOIN    [refdata].[Book] ON [refdata].[Book].[BookId] = [trading].[Trade].[BookId]
JOIN    @PartyPositions pos 
        ON pos.[PartyId] = [refdata].[Book].[LegalEntityId] 
        AND [trading].[Trade].[TradeType] = pos.[TradeType] 
        AND [trading].[Trade].[InstrumentId] = pos.[InstrumentId]
ORDER BY    [trading].[Trade].[TradeId]
OFFSET      @OffsetLocal ROWS FETCH NEXT @ChunkSizeLocal ROWS ONLY;;

END

编辑:我还检查过:

  • 其他线程 - 没有一个应该阻碍:唯一正在运行的线程是运行查询的线程和通常的支持线程,例如主线程和消息循环(我从中测试一个CUI)

编辑(无聊吗?)

如果我减少了查询的范围,我可以看到它在解析记录大约4分钟时阻塞。然后它继续阅读,直到它再次挂起。

我仍然无法在客户端看到任何进展 - 我现在通过C#运行来自CLR的GcNotification类,并且没有任何GC继续运行。这指向数据库,正如@Crowcoder所说,但是事实上,它在SSMS中运行良好,并且通过阅读记录暂停中途意味着我不愿意责备它。这可能是因为我对数据库缺乏了解!

0 个答案:

没有答案