2017-09-06 82 views
-1

我有一些代码从我的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是等待所有的代码中解放出来之间运行几百千次 - 是否会改善问题或使情况变得更糟,因为内存中会保存如此之多的数据?

+0

这里有很多事情发生,这似乎是一个非常糟糕的主意。你通过一个程序打开一个记录集。然后你循环(无主)通过那个巨大的记录集并插入(告诉我它不是真的)到另一个表中......以及其他一些事情。这个端到端的设计,你确定你做出了正确的决定吗?我想你可以遍历这个记录集并将它推入一个数组,但是在这个运行的糟糕系统上,你的数组大小为200k。 – JNevill

+0

我听你的 - 基本上我需要阅读我的原始表的每个记录,通过一些其他的代码运行的一些价值观,写那些新值到另一个表 - 我不能做到这一点的SQL里面的代码这个处理过程非常复杂,并且相当一部分C#代码。我想我可以将这个过程分成更小的块,但最终我必须处理这一切! – chilluk

+0

现在我已经看到了您对JNevill评论的回复,我可以补充一点,您可能会从编写CLR过程中获得最佳结果。 –

回答

0

JNevill提出了一些重要的问题,但我现在将你的问题当作学术处理。

我可以把SqlDataReader的到一个数组或列表<>抓住它 “脱机”,所以DB是在 之间等待所有的代码运行几十万次

释放

当然可以。

会改善事情或使情况变得更糟,因为会有很多数据保存在内存中吗?

现在好了,取决于哪个更糟糕:只要数据读取器锁定您的表,或者让您的整个数据集存储在内存中。这两者都不是普遍的更好或更差,它取决于它对您的业务和用户的影响。无论你认为哪种情况更糟糕。

如果两者都不可接受,你总是可以选择C选项,并读取数据并立即将其写入磁盘上的平面文件(使用filesystemobject),因此它不会保持sql表被锁定,并且不会保留数据在记忆中。然后,您可以通过文件流逐行执行繁重的处理,最后从平面文件写入数据库。

请记住,如果你不保持在加工过程中锁定表,更改可能会表中其他用户所做的,当你覆盖表与处理的数据这些更改将丢失。再次,你必须确定哪种情况更糟糕。

+0

我想如上我可以批量到更小的块,但我仍然需要最终迭代我的原始表中的每一个记录。我猜想使用文件系统是一种将数据从数据库中“缓存”出来的方式 - 同时对主表中发生的其他更改无关紧要。 – chilluk