在 SqlCommand 中翻阅结果的最佳方式

本文关键字:最佳 方式 结果 SqlCommand | 更新日期: 2023-09-27 18:30:55

我有一个包含RTF文档的数据库表。我需要以编程方式提取这些(我知道我可以使用光标逐步浏览表 - 我需要做一些数据操作)。 我创建了一个 C# 程序来执行此操作,但问题是它无法将整个表(大约 200 万行)加载到内存中。

这里有一个 MSDN 页面。

也就是说,基本上有两种方法可以循环访问数据。

  1. 使用 DataAdapter.Fill 方法逐页加载
  2. 多次运行查询,使用主键进行迭代。基本上,您以TOP 500限制(或其他方式)和PK>(最后一次PK)运行一次

我已经尝试了选项 2,它似乎有效。但是我可以确定我正在撤回所有数据吗? 当我执行SELECT COUNT (*) FROM Document时,它会拉回相同数量的行。不过,我很紧张。数据验证有什么提示吗?

还有哪个更快? 数据查询非常慢 - 我尽可能地优化了查询,但是有大量数据需要通过 WAN 传输。

在 SqlCommand 中翻阅结果的最佳方式

我认为答案需要对你的真正需求有更多的了解。我很难想象一个重复的过程或要求,你必须定期提取 200 万个二进制文件来对它们进行一些处理!如果这是一次性的事情,那么好吧,让我们完成吧!

以下是一些初步想法:

  1. 是否可以将 C# 例程直接部署到 SQL 并通过 CLR 执行所有内容?
  2. 是否可以在本机本地运行 C# 应用并利用共享内存协议?
  3. 您是否必须处理每一行? 例如,如果您正在验证 RTF 数据的结构与另一个文件相比发生了变化,您可以创建可以比较的每个哈希吗?
  4. 如果您必须将所有数据都取出,请尝试将其导出到本地磁盘并将其XCOPY到另一个位置。
  5. 如果要一次获取行块,请创建一个表,该表仅保留已处理的所有 ID 的列表。 抓取接下来的 500 行时,只需查找尚未在该表中的行。当然,请使用已导出的新 ID 更新该表。
  6. 如果必须执行所有这些操作,则可能会对OLTP性能产生严重影响。 要么将其限制为仅运行数小时,要么采用 *.bak 并在单独的框中处理它。 实际上,如果这是一次性的事情,请将其还原到运行SQL的同一框中并使用共享内存协议。