2

快速提问(希望如此)

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

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

我看到我有一些替代方案:

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

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

4

1 回答 1

2

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

于 2013-06-06T14:01:02.550 回答