【问题标题】:What is the fastest way to load data from Oracle using ADO?使用 ADO 从 Oracle 加载数据的最快方法是什么?
【发布时间】:2011-04-08 11:39:28
【问题描述】:

我需要使用 ADO 从 Oracle 数据库中读取数百万个寄存器。应该使用哪些参数才能获得最佳性能?

【问题讨论】:

  • 这是一次性的工作还是会多次发生?我只是试试TADOQuery.CursorType := ctOpenForwardOnly,它可能会表现得尽可能好。如果性能确实不能令人满意,我会考虑一些本机连接组件(以避免 ADO 的开销)。
  • 您最好的机会是不使用 ADO。为什么需要读取数百万条记录?导出它们?处理它们?很有可能您可以在不使用 ADO 的情况下做到这一点,顺便说一句,它不是性能最高的数据库访问库之一。您还必须优化您的查询,并检查数据库设置 - 瓶颈可能不是 ADO,而是服务器 I/O、数据库缓存等。首先确定什么是慢的,然后改进它。通常没有 FAST=TRUE 参数(© Tom Kyte)。
  • 我已经在使用 ctOpenForwardOnly。而且我会经常发生,因为数据被读取和合并。不幸的是,必须使用 ADO。我对 CacheSize、LockType 和 ExecuteOptions 很好奇。
  • 如果先在Oracle中合并,再导出呢?您可以避免的任何往返行程都会提高您的表现。
  • 这是不可能的,因为需要许多计算/处理。

标签: oracle delphi ado


【解决方案1】:

直接使用 ADO _Recordset 接口比使用 TADODataset 更快。 ADO 不是很快,TADODataset 需要查询底层的_Recordset 以确定列类型等(ADO 具有安全调用接口,因此每个函数/属性读取的开销都很大,请在 CPU 视图中查看生成的程序集)。 通过直接使用 _Recordset,我优化了将数据加载到我们自己的数据对象中的因子 2(大量小查询)。也许它对大量数据也很有用。

对于大型查询,您可以使用“只读”“服务器端光标”和“向前打开”(客户端光标是在客户端加载和缓存数据)

【讨论】:

  • 我使用过(前段时间,所以我可能会忘记一些细节)ADO“firehose”游标。我想这与安德烈在最后一个建议中的建议相同?当我打开记录集时,我将光标位置设置为:adUseServer 和过去的 adOpenForwardOnly、adLockReadOnly。
  • 我正在使用相同的。我只是为了确认我们的选择是否正确或可以有所改进。
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2016-01-28
  • 1970-01-01
  • 2010-09-12
相关资源
最近更新 更多