1

我有以下场景(删除了异常处理,简化了代码):

SqlDataReader rdr = executeQuery(query);
while (rdr.Read()) {
   //There are thousands of records, so this happens thousands of times
   handleRecord(rdr); //Takes a couple of seconds
}
rdr.Close();

因此,查询涉及的表(在过度拥挤的 Sql Server 2000 上运行)具有几个小时或更长时间的共享锁,具体取决于记录的数量。

这些锁有时会影响查询该数据库的其他应用程序,因此我被要求尽快移除这些锁。

所以,没有明显的

List<Record> rList = new List<Record>();
SqlDataReader rdr = executeQuery(query);
while (rdr.Read()) {
   //There are thousands of records, so this happens thousands of times
   storeRecord(rList,rdr); //Takes milliseconds
}
rdr.Close();
foreach (Record r in rList) {
    handleRecord(r);
}

这会限制我可以在机器内存上处理的记录数量,还有其他选择吗?

(这个应用程序我正在慢慢迁移到 Dapper.NET,所以它已经是代码其他部分的依赖项,以防 Dapper 中的某些东西可以帮助解决这种情况。)

4

2 回答 2

1

这是一个古老的话题,但这是我有时使用的一个技巧:

  1. 在主键上订购您的 sql 查询。
  2. 阅读前 ## 条记录。
  3. 读取/缓冲那些 ## 记录。
  4. 使用您的缓冲区进行处理。
  5. 记住最高的id。

通过一项修改返回到 2:您读取顶部 ## 记录 WHERE id > 最高 id。

通过这种方式,您可以读取和处理批量数据。

于 2018-01-18T14:09:18.557 回答
0

将尝试我的评论作为答案,因为没有最近的评论。

选择到#temp 表中。并对您的锁进行一般审查。也许一些行锁。确保以相同的顺序更新表。handleRecord 是什么样的?

于 2012-06-22T13:31:14.997 回答