在SqlCommand中翻译结果的最佳方式?

时间:2013-09-11 20:30:29

标签: c# sql sql-server

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

a MSDN page here

这表示基本上有两种循环数据的方法。

  1. 使用DataAdapter.Fill方法逐页加载
  2. 多次运行查询,使用主键进行迭代。基本上你运行一次TOP 500限制(或其他)和PK> (最后PK)
  3. 我尝试过选项2,它似乎有效。但我能确定我要撤回所有数据吗?当我执行SELECT COUNT (*) FROM Document时,它会拉回相同数量的行。不过,我很紧张。有关数据验证的任何提示吗?

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

1 个答案:

答案 0 :(得分:1)

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

以下是一些初步想法:

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