我有一些代码从我的SQL数据库(约200k条记录,7列)中获取相对较大的数据量,然后我必须对其执行更新/插入到其他表中。使用SqlDataReader处理大数据集
我最初的迭代是通过打开一个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的到一个数组或列表<>抓住它“脱机”,所以DB是等待所有的代码中解放出来之间运行几百千次 - 是否会改善问题或使情况变得更糟,因为内存中会保存如此之多的数据?
这里有很多事情发生,这似乎是一个非常糟糕的主意。你通过一个程序打开一个记录集。然后你循环(无主)通过那个巨大的记录集并插入(告诉我它不是真的)到另一个表中......以及其他一些事情。这个端到端的设计,你确定你做出了正确的决定吗?我想你可以遍历这个记录集并将它推入一个数组,但是在这个运行的糟糕系统上,你的数组大小为200k。 – JNevill
我听你的 - 基本上我需要阅读我的原始表的每个记录,通过一些其他的代码运行的一些价值观,写那些新值到另一个表 - 我不能做到这一点的SQL里面的代码这个处理过程非常复杂,并且相当一部分C#代码。我想我可以将这个过程分成更小的块,但最终我必须处理这一切! – chilluk
现在我已经看到了您对JNevill评论的回复,我可以补充一点,您可能会从编写CLR过程中获得最佳结果。 –