![](/img/trans.png)
[英]How to insert 4 million records from Oracle to Elasticsearch table faster using C#?
[英]Listing more than 10 million records from Oracle With C#
我有一个数据库,其中包含超过1亿条记录。 我正在运行一个包含超过一千万条记录的查询。 这个过程花费太多时间,所以我需要缩短这个时间。 我想将获取的记录列表另存为csv文件。 我怎样才能做到最快和最优化? 期待您的建议。 谢谢。
我假设您的查询已经限制在所需的行/列中,并且可以很好地利用索引。
在这样的规模上,唯一关键的事情是您不要尝试将所有内容立即加载到内存中; 因此,请忘掉诸如DataTable
和大多数全脂ORM(它们通常会尝试将行与身份管理器和/或变更管理器关联)之类的东西。 你将不得不为使用原始IDataReader
(从DbCommand.ExecuteReader
),或建立一个任何API非缓冲迭代器最重要的是(有几个,我偏向短小精悍)。 出于编写CSV的目的,原始数据读取器可能很好。
除此之外:由于带宽受限,您无法使其运行得更快。 更快获得它的唯一方法是在数据库服务器上创建CSV文件,这样就不会造成网络开销。
您很可能需要在C#中执行此操作。 这是批量数据加载/导出的领域(通常在数据仓库方案中使用)。
比起您在任何平台上编写的工具,许多(免费)工具(我想甚至是Quest Software的Toad)都将更强大,更有效地执行此操作。
我有一种预感,对于最终用户,您实际上并不需要它(简单的观察是部门秘书实际上并不需要邮寄该副本;它太大了,无法以这种方式使用)。
我建议为工作使用正确的工具。 不管你做什么
“这个过程花费了太多时间,所以我需要缩短这个时间。”
此过程包含三个子过程:
这些问题中的任何一个或全部都可能成为瓶颈。 因此,如果要减少总的经过时间,则需要弄清楚时间在哪里花费。 您可能需要检测C#代码以获取指标。
如果事实证明查询是问题所在,那么您将需要对其进行调整。 在检索表的很大一部分(> 10%)时,索引在这里无济于事,因此提高全表扫描的性能将有所帮助。 例如增加内存以避免磁盘排序。 并行查询可能很有用(如果您拥有Enterprise Edition并且您有足够的CPU)。 还要检查问题是否不是硬件问题(主轴争用,不可靠的互连等)。
可以写入文件吗? 也许您的磁盘由于某种原因(例如碎片)而变慢,或者您正在与其他写入同一目录的进程竞争。
跨网络传输大量数据显然是潜在的瓶颈。 您确定只向客户端发送相关数据吗?
一种替代的体系结构:使用PL / SQL将记录写到数据服务器上的文件中,使用批量收集来检索可管理的记录批次,然后通过FTP将文件传输到最终需要的位置,也许首先压缩它。
真正的问题是,为什么需要从数据库中读取这么多行(以及很大一部分基础数据集)。 有许多方法可以避免这种情况,其中明显的方法是同步处理,消息排队和预合并。
现在暂且不谈...如果您要合并或筛选数据,然后在PL / SQL中实现大量逻辑,就不必在网络上拖拉数据(即使只是到本地主机,仍然有一个大开销)。 同样,如果您只想将其转储到平面文件中 ,则在C#中实现此操作不会带来任何好处。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.