如何让.NET获取与SSMS一致的大数据集查询性能?
如何让.NET针对大数据集获得与SSMS相同的查询性能?
我采用业内通用策略从多表中检索规模较大的查询结果,该查询用于详细财务分析,无法进一步缩小结果集范围。结果集约包含3万行、40个字段,涵盖各类数据类型,最大字段为nvarchar(50)。
在同一客户端上对比远程服务器的连续性能测试结果:SSMS的全量数据检索性能至少比.NET快3倍——SSMS通常耗时10秒,而.NET耗时超40秒。
我对两者的处理逻辑总结如下:
SSMS会在SQL Server准备好单条数据行后立即开始检索。
**而.NET的处理流程是:**SQL Server先在内存中准备完整的结果集,这会给服务器带来巨大内存压力,从性能监视器可看到70%的时间都用于内存分配;结果集准备完成后,SQL Server一次性将整个结果集发送给.NET,.NET将其缓冲在内存中;之后控制权交还给.NET程序,程序再逐行从缓冲区读取数据(此部分代码已做高度优化)。
我尝试过.NET文档中提到的异步调用(BeginExecuteReader),但并未改善性能问题。
相关代码如下:
using (var adapter = new SqlDataAdapter(Query, finalConnection) { AcceptChangesDuringFill = false, FillLoadOption = LoadOption.Upsert, MissingSchemaAction = MissingSchemaAction.Add }) // UpdateBatchSize 无任何改善 { // 所有SQL操作均在此完成,默认CommandBehaviour无任何优化效果 using (var reader = adapter.SelectCommand.ExecuteReader(CommandBehavior.SequentialAccess)) { // 此时所有数据已存入.NET内部缓冲区 int colsint = reader.FieldCount; var arraylist = new System.Collections.Generic.List<Array>(); object[] rowInt; while (reader.Read()) { reader.GetValues(rowInt); arraylist.Add(rowInt); } return arraylist; } }
内容的提问来源于stack exchange,提问作者xavier serret
相关产品推荐
相关产品推荐

