0

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

这里有一个 MSDN 页面

也就是说,基本上有两种方法可以遍历数据。

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

我已经尝试了选项 2,它似乎有效。但是我可以确定我正在撤回所有数据吗?当我这样做时,SELECT COUNT (*) FROM Document它会拉回相同数量的行。尽管如此,我还是很紧张。数据验证的任何提示?

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

4

1 回答 1

1

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

以下是一些初步的想法:

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