通过高延迟网络从SQL Server中选择大量数据

时间:2018-08-21 12:54:55

标签: sql-server ado.net query-performance

我需要通过网络以高延迟(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
}

0 个答案:

没有答案