Sql server 使用SqlDataReader处理大型数据集

Sql server 使用SqlDataReader处理大型数据集,sql-server,sqldatareader,Sql Server,Sqldatareader,我有一些代码从我的SQL db(大约200k条记录,7列)中获取相对大量的数据,然后我必须对这些数据采取行动,并将其更新/插入到其他表中 我的初始迭代是通过打开一个SqlDataReader并在其上循环来完成的——虽然这似乎在db上保留了一个打开的事务,但当流程运行需要几个小时时,可能会导致一些锁定问题。数据是通过一个sql存储过程获取的,我确信这已经得到了很好的优化。对每条记录的处理相当密集 我的伪代码: string sql = "EXEC StoredProc" sqlConn.Open(

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

我的初始迭代是通过打开一个SqlDataReader并在其上循环来完成的——虽然这似乎在db上保留了一个打开的事务,但当流程运行需要几个小时时,可能会导致一些锁定问题。数据是通过一个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放入一个数组或列表中以“脱机”获取它,这样数据库就不必等待其间的所有代码运行数十万次——这会改善问题还是会因为内存中存储了太多数据而使问题变得更糟?

JNevill提出了一些重要的问题,但我暂时把你的问题当作学术性的

我可以将SQLDataReader放入数组或列表中以获取它吗 “脱机”,这样数据库就不用等待其间的所有代码 跑几十万次

你当然可以

这会改善事情还是让事情变得更糟,因为事情会变得更糟 内存中有多少数据

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

如果两者都不可接受,则始终可以选择C,读取数据并立即将其写入磁盘上的平面文件(使用filesystemobject),这样就不会锁定sql表,也不会将数据保留在内存中。然后,您可以使用文件流逐行执行繁重的处理,最后从平面文件写入数据库


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

这里发生了很多事情,这似乎是一个非常糟糕的主意。您可以通过一个过程打开一个记录集。然后你循环(主不)通过那个巨大的记录集并插入(告诉我这不是真的)到另一个表中。。。以及其他一些事情。您确定使用这种端到端的设计在这里做出了正确的决策吗。我想你可以循环这个记录集并把它放入一个数组中,但是不管它运行在什么糟糕的系统上,你都有200k大小的数组。我听到了-基本上我需要读取原始表中的每一条记录,通过其他代码运行一些值,并将这些新值写入另一个表中——我无法在SQL内部执行此操作,因为执行此处理的代码非常复杂,而且是一大块C#代码。我想我可以把这个过程分成小块,但最终我必须全部处理!现在我已经看到了您对JNevill评论的回应,我可以补充说,您可能会从编写CLR过程中获得最好的结果。我猜如上所述,我可以将其批处理成更小的块,但我仍然需要最终迭代原始表中的每一条记录。我想使用文件系统是一种将数据从数据库中“缓存”出来的方法——与主表同时发生的其他更改无关。