我正在尝试提高远程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。
我会对一个实现或模式感到好奇,这个实现或模式可以比顺序反序列化流输出更快地完成某些事情吗?
一些事情:
使用异步方法不会改善读取时间,只会将工作转移到后台线程(对于这个问题是不够的)。
迭代SqlDataReader
是有状态的过程。据我所知,没有办法并行化工作。有人熟悉可以实现的实现吗?
如果我将原始查询分成不相交的查询并并行执行,我会大大缩短响应时间。但是,这种方法似乎陷入类似MapReduce的实现问题。我希望有一种更简单的方法可以解决这个问题。