【发布时间】: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