繁体   English   中英

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

[英]Listing more than 10 million records from Oracle With C#

我有一个数据库,其中包含超过1亿条记录。 我正在运行一个包含超过一千万条记录的查询。 这个过程花费太多时间,所以我需要缩短这个时间。 我想将获取的记录列表另存为csv文件。 我怎样才能做到最快和最优化? 期待您的建议。 谢谢。

我假设您的查询已经限制在所需的行/列中,并且可以很好地利用索引。

在这样的规模上,唯一关键的事情是您不要尝试将所有内容立即加载到内存中; 因此,请忘掉诸如DataTable和大多数全脂ORM(它们通常会尝试将行与身份管理器和/或变更管理器关联)之类的东西。 你将不得不为使用原始IDataReader (从DbCommand.ExecuteReader ),或建立一个任何API非缓冲迭代器重要的是(有几个,我偏向短小精悍)。 出于编写CSV的目的,原始数据读取器可能很好。

除此之外:由于带宽受限,您无法使其运行得更快。 更快获得它的唯一方法是在数据库服务器上创建CSV文件,这样就不会造成网络开销。

您很可能需要在C#中执行此操作。 这是批量数据加载/导出的领域(通常在数据仓库方案中使用)。

比起您在任何平台上编写的工具,许多(免费)工具(我想甚至是Quest Software的Toad)都将更强大,更有效地执行此操作。

我有一种预感,对于最终用户,您实际上并不需要它(简单的观察是部门秘书实际上并不需要邮寄该副本;它太大了,无法以这种方式使用)。

我建议为工作使用正确的工具。 不管你做什么

  • 不要滚动自己的数据类型转换
  • 将CSV与带引号的文字一起使用,并考虑转义其中的双引号
  • 考虑区域选项(爱荷华州:始终使用InvariantCulture进行导出/导入!)

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

此过程包含三个子过程:

  1. 检索> 1000万条记录
  2. 将记录写入文件
  3. 跨网络传输记录(我的假设是您正在针对远程数据库使用本地客户端)

这些问题中的任何一个或全部都可能成为瓶颈。 因此,如果要减少总的经过时间,则需要弄清楚时间在哪里花费。 您可能需要检测C#代码以获取指标。

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

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

跨网络传输大量数据显然是潜在的瓶颈。 您确定只向客户端发送相关数据吗?

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

真正的问题是,为什么需要从数据库中读取这么多行(以及很大一部分基础数据集)。 有许多方法可以避免这种情况,其中明显的方法是同步处理,消息排队和预合并。

现在暂且不谈...如果您要合并或筛选数据,然后在PL / SQL中实现大量逻辑,就不必在网络上拖拉数据(即使只是到本地主机,仍然有一个大开销)。 同样,如果您只想将其转储到平面文件中 ,则在C#中实现此操作不会带来任何好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM