我需要通过网络以高延迟(ping约为39ms)从SQL Server 2012 SP1查询约40000行。
当我从远程计算机上的SSMS运行该查询时,加载所有内容大约需要1秒钟。
但是,使用SqlDataReader
在同一台计算机上执行相同的查询大约需要19.1秒(在同步版本的读取事件探查器中,这表明SNI消耗了约92%的时间)。
设置Packet Size=32768
(最大可能值)参数后,SqlDataReader
将在3.6秒内加载所有内容(SNI消耗了约59%)。
但是,它仍然是SSMS的4倍。在这两种情况下,如果没有SNI,它看起来都非常接近我在SSMS中得到的结果。
如果我在SQL Server计算机上直接用SqlDataReader
运行相同的代码查询数据,则加载所有内容大约需要0.9秒。但是我需要在远程计算机上运行此代码。而且我需要直接从SQL Server加载数据,因为我无法在其中放置其他应用程序。所有行大约3 mb-几个小的字符串和整数列。
很明显,ping是问题所在。
即使在高延迟下,SSMS如何快速加载所有行?
如何实现相同的行为?也许以某种方式没有ADO.NET?
查询很简单SELECT
,它执行速度很快,并返回约40000行(我确实需要全部这些行以进行SQL Server无法完成的进一步处理)。
用简单的代码测量时间,例如:
using (var cmd = new SqlCommand(query, con))
using (var reader = await cmd.ExecuteReaderAsync())
{
while (await reader.ReadAsync())
count++; // simple counter to ensure same number of rows was read
}