改进SQL Server数据流的客户端反序列化

时间:2017-01-18 23:26:30

标签: c# sql-server ssms sqldatareader

我正在尝试提高远程SQL Server数据库中大表读取的性能。测试查询是一个简单的select * from [TableName]

对于包含大约70 MB大小的一百万条记录的负载测试,响应时间瓶颈不是服务器或网络,而是客户端应用程序反序列化流输出。

我在SSMS以及使用SqlDataReader类的.Net客户端应用程序中重现了此问题。请参阅下面的代码片段。

SqlDataReader reader = com.ExecuteReader();

while (reader.Read())
{
     var copy = new object[number_fields];
     reader.GetValues(copy);  
     // from here can parallelize processing of this copy data
}

如果我迭代并丢弃流输出(即注释掉GetValues()),则查询会很快完成。通过重新引入此步骤显示缓慢。同样适用于SSMS。

我会对一个实现或模式感到好奇,这个实现或模式可以比顺序反序列化流输出更快地完成某些事情吗?

一些事情:

  1. 使用异步方法不会改善读取时间,只会将工作转移到后台线程(对于这个问题是不够的)。

  2. 迭代SqlDataReader是有状态的过程。据我所知,没有办法并行化工作。有人熟悉可以实现的实现吗?

  3. 如果我将原始查询分成不相交的查询并并行执行,我会大大缩短响应时间。但是,这种方法似乎陷入类似MapReduce的实现问题。我希望有一种更简单的方法可以解决这个问题。

0 个答案:

没有答案