【问题标题】:Are there any extensions to TADOQuery that include client indexesTADOQuery 是否有任何包含客户端索引的扩展
【发布时间】:2013-06-02 08:56:47
【问题描述】:

快速提问(希望如此)

我有一个大型数据集(>100,000 条记录),我想将其用作查找以确定多个键的存在或不存在。这样做的目的是在尝试将它们提交到数据库之前找到 FK 违规,以避免由此产生的 EDatabaseError 搞乱我的事务。

我一直在使用带有 FindKey 方法的 TClientDataSet/TDatasetProvider,因为这允许设置客户端索引并且速度更快(扫描每个键需要 2 秒,而不是 ADO 需要 10 秒)。但是,迁移到大型数据集,CDS 的填充开始花费的时间远远超过本地索引所节省的时间。

我发现我有几个备选方案:

  • 带有 TADOQuery.locate 方法的客户端游标
  • 每次检查的 ADO SELECT 语句(无客户端缓存)
  • ADO SEEK 方法
  • 扩展 TADOQuery 以模仿 FindKey

Locate 方法似乎最简单,不会使用 SELECT/SEEK 方法向服务器发送垃圾邮件。我喜欢扩展 TADOQuery 的想法,但想知道是否有人知道任何现成的解决方案,而不必创建自己的解决方案?

【问题讨论】:

  • 在网络环境中,数据库是唯一可靠的来源。所以我建议不要规避交易。
  • 我不是想规避事务,但如果我因为违反 FK 而收到 EDatabaseError,我将不得不回滚(可能很大)事务。如果我自己发现了 FK 违规,那么我可以跳过记录并记录它,允许导入其余记录。
  • 是否有多用户(直接)访问数据库?
  • 理论上是的,实际上不是 - 单个访问应用程序有一个锁,可以防止其他人在此过程进行时运行它。不漂亮,但这是我继承的。
  • 如果您使用的是 D2006,请查看 cc.embarcadero.com/item/26575。它解决了 TClientDataset 缩放的性能问题,这似乎是整个问题的根源。

标签: delphi indexing ado delphi-2006


【解决方案1】:

我会在数据库服务器中创建一个临时表。将所有 100,000 条记录插入此临时表。一次批量插入 3000 条记录,以尽量减少到服务器的往返行程。然后在该临时表上运行 select 语句以检查是否存在外键违规等。如果一切正常,请从临时表执行插入 SQL 到主表。

【讨论】:

  • 有趣的建议,对于我现在要做的事情(经典的大泥球问题)需要进行太多重构,但如果我要花更多时间在这部分代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 2011-10-04
  • 2021-05-22
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多