使用C#列出Oracle超过1000万条记录

时间:2011-11-30 09:02:28

标签: c# performance oracle

我有一个包含超过1亿条记录的数据库。我正在运行包含超过1000万条记录的查询。这个过程需要花费太多时间,所以我需要缩短这个时间。我想将获得的记录列表保存为csv文件。我怎样才能尽可能快速和最佳地完成?期待你的建议。感谢。

4 个答案:

答案 0 :(得分:11)

我假设你的查询已经被约束到你需要的行/列,并且很好地利用了索引。

在这种规模下,唯一的关键是你不会尝试将其全部加载到内存中;所以忘记DataTable和大多数全脂ORM(通常尝试将行与身份管理器和/或变更管理器关联)。您必须使用原始IDataReader(来自DbCommand.ExecuteReader),或者在 top 上构建非缓冲迭代器的任何API(有几个;我'我偏向于小巧玲珑)。出于编写CSV的目的,原始数据读取器可能没什么用。

除此之外:由于带宽受限,你无法让它变得更快。您可以更快地获得它的唯一方法是在数据库服务器创建CSV文件,这样就不会有网络开销。

答案 1 :(得分:5)

您需要在C#中执行此操作的机会相当渺茫。这是批量数据加载/导出的领域(通常用于数据仓库方案)。

许多(免费)工具(我想象Quest Software的Toad)可以比你在任何平台上编写它更加强大和高效。

我有一种预感,你实际上并不需要这个最终用户(简单的观察是部门秘书实际上并不需要邮寄出那些副本;它太大而无法用于此办法)。

我建议使用正确的工具。无论你做什么,

  • 不要滚动您自己的数据类型转换
  • 使用带引号文字的CSV,并考虑转义这些
  • 中的双引号
  • 想到区域选项(IOW:总是使用InvariantCulture进行导出/导入!)

答案 2 :(得分:2)

  

“这个过程花费了太多时间,所以我需要缩短这个时间。”

这个过程包括三个子过程:

  1. 检索> 10米记录
  2. 将记录写入文件
  3. 通过网络传输记录(我的假设是您正在使用本地客户端远程数据库)
  4. 任何或所有这些问题都可能成为瓶颈。因此,如果您想减少总耗用时间,则需要确定花费的时间。您可能需要检测C#代码以获取指标。

    如果事实证明查询是问题,那么你需要调整它。当您检索表的大部分(> 10%)时,索引将无法帮助,因此提高全表扫描的性能将有所帮助。例如,增加内存以避免磁盘排序。并行查询可能很有用(如果您有Enterprise Edition并且有足够的CPU)。还要检查问题不是硬件问题(主轴争用,狡猾的互连等)。

    写文件可以解决问题吗?也许你的磁盘由于某种原因(例如碎片)很慢,或者你正在与写入同一目录的其他进程竞争。

    通过网络传输大量数据显然是一个潜在的瓶颈。你确定你只是向客户发送救援数据吗?

    另一种架构:使用PL / SQL将记录写入数据服务器上的文件,使用批量收集来检索可管理的批量记录,然后通过FTP将文件传输到最终需要的位置,也许首先压缩它。

答案 3 :(得分:1)

真正的问题是为什么你需要从数据库中读取这么多行(以及如此大比例的底层数据集)。有许多方法可以使这种情况可以避免,显而易见的是同步处理,消息排队和预合并。

暂时搁置这一点......如果你正在整合数据或筛选它,那么在PL / SQL中实现大部分逻辑可以节省不得不通过网络传输数据(即使它只是对于localhost,还有很大的开销。再次,如果您只想dump it out into a flat file,在C#中实现这一点并没有给您带来任何好处。