我有一个包含超过1亿条记录的数据库。我正在运行包含超过1000万条记录的查询。这个过程需要花费太多时间,所以我需要缩短这个时间。我想将获得的记录列表保存为csv文件。我怎样才能尽可能快速和最佳地完成?期待你的建议。感谢。
答案 0 :(得分:11)
我假设你的查询已经被约束到你需要的行/列,并且很好地利用了索引。
在这种规模下,唯一的关键是你不会尝试将其全部加载到内存中;所以忘记DataTable
和大多数全脂ORM(通常尝试将行与身份管理器和/或变更管理器关联)。您必须使用原始IDataReader
(来自DbCommand.ExecuteReader
),或者在 top 上构建非缓冲迭代器的任何API(有几个;我'我偏向于小巧玲珑)。出于编写CSV的目的,原始数据读取器可能没什么用。
除此之外:由于带宽受限,你无法让它变得更快。您可以更快地获得它的唯一方法是在数据库服务器创建CSV文件,这样就不会有网络开销。
答案 1 :(得分:5)
您需要在C#中执行此操作的机会相当渺茫。这是批量数据加载/导出的领域(通常用于数据仓库方案)。
许多(免费)工具(我想象Quest Software的Toad)可以比你在任何平台上编写它更加强大和高效。
我有一种预感,你实际上并不需要这个最终用户(简单的观察是部门秘书实际上并不需要邮寄出那些副本;它太大而无法用于此办法)。
我建议使用正确的工具。无论你做什么,
答案 2 :(得分:2)
“这个过程花费了太多时间,所以我需要缩短这个时间。”
这个过程包括三个子过程:
任何或所有这些问题都可能成为瓶颈。因此,如果您想减少总耗用时间,则需要确定花费的时间。您可能需要检测C#代码以获取指标。
如果事实证明查询是问题,那么你需要调整它。当您检索表的大部分(> 10%)时,索引将无法帮助,因此提高全表扫描的性能将有所帮助。例如,增加内存以避免磁盘排序。并行查询可能很有用(如果您有Enterprise Edition并且有足够的CPU)。还要检查问题不是硬件问题(主轴争用,狡猾的互连等)。
写文件可以解决问题吗?也许你的磁盘由于某种原因(例如碎片)很慢,或者你正在与写入同一目录的其他进程竞争。
通过网络传输大量数据显然是一个潜在的瓶颈。你确定你只是向客户发送救援数据吗?
另一种架构:使用PL / SQL将记录写入数据服务器上的文件,使用批量收集来检索可管理的批量记录,然后通过FTP将文件传输到最终需要的位置,也许首先压缩它。
答案 3 :(得分:1)
真正的问题是为什么你需要从数据库中读取这么多行(以及如此大比例的底层数据集)。有许多方法可以使这种情况可以避免,显而易见的是同步处理,消息排队和预合并。
暂时搁置这一点......如果你正在整合数据或筛选它,那么在PL / SQL中实现大部分逻辑可以节省不得不通过网络传输数据(即使它只是对于localhost,还有很大的开销。再次,如果您只想dump it out into a flat file,在C#中实现这一点并没有给您带来任何好处。