使用 SqlDataReader 处理大数据集

Working with large data set using SqlDataReader

我有一些代码可以从我的 SQL 数据库(大约 20 万条记录,7 列)中获取相对大量的数据,然后我必须对这些数据采取行动并更新/插入到其他表中。

我的初始迭代是通过打开 SqlDataReader 并在其上循环来完成的 - 看起来这似乎在数据库上持有一个打开的事务并且当该过程需要几个小时到 运行.数据是通过 sql 存储过程获取的,我很确定这是非常好的优化。每条记录的处理相当密集。

我的伪代码:

string sql = "EXEC StoredProc"
sqlConn.Open();
SqlCommand sqlComm = new SqlCommand(sql, sqlConn);
SqlDataReader reader = sqlComm.ExecuteReader();

//loop through products
while (reader.Read())    
{
    // do stuff
}

我能否将 SQLDataReader 放入数组或 List<> 中以获取它 "offline" 这样数据库就无需等待 运行 之间的所有代码十万次 - 这会改善事情还是使事情变得更糟,因为内存中将保存如此多的数据?

JNevill 提出了一些重要的问题,但我暂时将您的问题视为学术问题。

Can I put the SQLDataReader into an array or List<> to grab it "offline" so the db is freed from waiting for all the code in between to run several hundred thousand times

当然可以。

will that improve matters or make it worse because there will be so much data held in memory?

好吧,现在这取决于哪一个对您来说更糟:让您的 table 被数据读取器锁定尽可能长的时间,或者将整个数据集存储在内存中。没有一个是普遍的好或坏,这取决于它对您的业务和用户的影响。你认为哪个更差就更差。

如果两者都是 unacceptable,你总是可以选择 C,读取数据并立即将其写入磁盘上的平面文件(使用文件系统对象),所以它不会保留 sql table 已锁定并且不会将数据保存在内存中。然后您可以使用文件流逐行进行繁重的处理,最后将平面文件写入数据库。

请记住,如果您在处理过程中不锁定 table,其他用户可能会对 table 进行更改,并且当您覆盖table 处理过的数据。同样,您必须确定哪种情况更糟。