使用SqlDataReader处理大型数据集

时间:2017-09-06 16:27:56

标签: sql-server sqldatareader

我有一些代码从我的SQL数据库中获取相对大量的数据(大约200k记录,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<>抓住它“离线”,这样数据库就可以免于等待中间的所有代码运行数十万次 - 这会改善问题还是会使情况更糟,因为内存中会有如此多的数据?

1 个答案:

答案 0 :(得分:0)

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

  

我可以将SQLDataReader放入数组或List<>抓住它   “离线”,这样db就可以免于等待中间的所有代码   运行几十万次

当然可以。

  

会改善问题或使情况变得更糟,因为会有这样的情况   内存中有多少数据?

现在好了,这取决于哪一个对你来说更糟糕:让你的桌子被一个datareader锁定一段时间,或者将你的整个数据集放在内存中。这两者都不是普遍好或坏,它取决于它对您的业务和用户的影响。你认为哪个更糟糕的是更糟糕。

如果两者都不可接受,你总是可以选择C,然后读取数据并立即将其写入磁盘上的平面文件(使用filesystemobject),这样就不会保持sql表的锁定而且不会保留数据。记忆。然后,您可以逐行处理文件流,然后从平面文件写入数据库。

请记住,如果在处理过程中没有锁定表,则其他用户可能会对表进行更改,并且当您使用已处理的数据覆盖表时,这些更改将会丢失。同样,你必须确定哪种情况更糟。