我每天通过互联网将数百万行数据从Internet数据库导入到本地SQL Server数据库。性能相当低迷(不使用接近我们令人沮丧的本地互联网连接速度20Mbps。)
我正试图找到瓶颈,并找到解决方法。我想我可能已经找到了瓶颈,我认为这是对每个连接的传输速度的限制?
我通过创建一个C#应用程序测试导入速度来发现它,该应用程序使用Oracle的ODP.NET托管驱动程序创建与Oracle的并行连接(我决定在C#中进行测试,因为我更容易理解正在发生的事情)。当我创建五个线程,每个线程从远程Oracle数据库中提取10k条记录时,组合吞吐量大约为80Kbps。当我再次尝试五十个线程,每个线程拉动相同的10k记录时,吞吐量大约为900Kbps。
有没有其他人经历过这种情况......似乎是数据传输速率的每连接限制?除了编写代码以执行一千个线程之外的任何解决方案,每个线程都会提取自己的数据吗?
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting Import at " + DateTime.Now);
int rowsPerBatch = 10000;
int batches = 50;
List<Task> Tasks = new List<Task>();
for (int i = 0; i < batches; i++)
{
Task mytask = Task.Factory.StartNew<List<DAILY_LOG_DATA>>(() => GetData(i,rowsPerBatch),TaskCreationOptions.LongRunning);
Tasks.Add(mytask);
}
Exception ex = Tasks.First().Exception;
Task.WaitAll(Tasks.ToArray());
Console.WriteLine("Import Finished at " + DateTime.Now);
Console.ReadLine();
}
static List<DAILY_LOG_DATA> GetData(int index, int rowsPerBatch)
{
Entities myContext = new Entities();
myContext.Database.Connection.Open();
int batchIndex = (int)index;
List<DAILY_LOG_DATA> toReturn =
(from a in myContext.DAILY_LOG_DATA
//orderby a.DLSEQUENCE
select a).Take(rowsPerBatch).ToList();
myContext.Dispose();
return toReturn;
}
}
编辑:添加了我的简单测试代码集,运行50个同步线程,每个线程检索(可能相同)10k行数据(仅用于测试带宽)