我有一些代码从SqlDataReader将结果读入List中,然后将它们解析为域对象,因为它使用了reader.GetXXX(int ordinal)方法,在while读者.Read()循环中。
这段代码通常可以在非常大的数据集和各种查询和表格中正常工作,但是一个查询在读取此结果列表的过程中会挂起,并最终超时,等待操作超时"错误。
我已经重复了很多次,它总是挂在同一条记录上(大约336k条记录到337k记录集中)。
如果我暂停执行,我可以看到它正在解析记录的中途,并且它挂在阅读器上.GetXXX呼叫。
我尝试了以下内容:
我很想责怪数据库,但鉴于查询在SSMS中顺利运行,我不相信。任何帮助非常感谢!
其他可能有用的东西:
编辑:根据要求,查询为:
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
编辑:我还检查过:
编辑(无聊吗?)
如果我减少了查询的范围,我可以看到它在解析记录大约4分钟时阻塞。然后它继续阅读,直到它再次挂起。
我仍然无法在客户端看到任何进展 - 我现在通过C#运行来自CLR的GcNotification类,并且没有任何GC继续运行。这指向数据库,正如@Crowcoder所说,但是事实上,它在SSMS中运行良好,并且通过阅读记录暂停中途意味着我不愿意责备它。这可能是因为我对数据库缺乏了解!