Delphi 如何将800000条记录插入MS Access表?

Delphi 如何将800000条记录插入MS Access表?,delphi,ms-access,ado,delphi-2007,Delphi,Ms Access,Ado,Delphi 2007,我需要在MS Access表中插入800000条记录。我正在使用Delphi2007和Tadoxxx组件。该表包含一些整数字段、一个浮点字段和一个只有一个字符的文本字段。其中一个整数字段(不是autoinc)上有一个主键,另一个整数和浮点字段上有两个索引 使用AdoTable.AppendRecord(…)插入数据需要10分钟以上的时间,这是不可接受的,因为每次用户开始在程序中使用新数据库时都会这样做。我无法预先填充该表,因为数据来自另一个数据库(无法通过ADO访问) 通过将记录写入一个选项卡分

我需要在MS Access表中插入800000条记录。我正在使用Delphi2007和
Tadoxxx
组件。该表包含一些整数字段、一个浮点字段和一个只有一个字符的文本字段。其中一个整数字段(不是autoinc)上有一个主键,另一个整数和浮点字段上有两个索引

使用AdoTable.AppendRecord(…)插入数据需要10分钟以上的时间,这是不可接受的,因为每次用户开始在程序中使用新数据库时都会这样做。我无法预先填充该表,因为数据来自另一个数据库(无法通过
ADO
访问)

通过将记录写入一个选项卡分隔的文本文件,并使用
tAdoCommand
对象执行,我成功地将时间缩短到1分钟左右

insert into table (...) select * from [filename.txt] in "c:\somedir" "Text;HDR=Yes"
但我不喜欢这样的开销

我想一定有更好的办法

编辑:

一些补充资料:

  • 选择MS Access是因为它不需要在目标计算机上进行任何附加安装,并且整个数据库包含在一个文件中,可以轻松复制
  • 这是一个单用户应用程序
  • 数据将只插入一次,并且在数据库的生命周期内不会更改。但是,该表包含一个附加字段,该字段用作标志,指示另一个数据库中的相应记录已由用户处理
  • 一分钟是可以接受的(最多3分钟也可以),我的解决方案是可行的,但对我来说太复杂了,所以我认为应该有一个更简单的方法来做到这一点
  • 一旦插入了数据,表的性能就相当好了
  • 当我开始计划/实施使用Access数据库的程序功能时,表不是必需的。后来,当客户要求提供另一项功能时,才有必要这样做。(不总是这样吗?)
编辑:


从目前为止我得到的所有答案来看,似乎我已经找到了将这么多数据插入Access表的最快方法。感谢大家,我感谢你们的帮助。

没有索引会更快。你能在导入后添加它们吗


在这篇文章中,有许多建议可能很有意思

你从一个方面看方向是正确的。使用单个语句进行大容量插入比尝试遍历数据并逐行插入要快。Access作为一个基于文件的数据库,在迭代写入时会非常慢


问题是Access正在处理如何在内部优化写操作,而实际上没有任何方法来控制它。您可能已经达到了INSERT语句的最大效率。为了提高速度,您可能应该评估是否有办法在每次启动应用程序时将800000条记录写入数据库。

获取(免费)并通过访问外部表连接到数据库。SQL express比MS Access快得多。

既然您说过800K记录数据在数据库的生命周期内不会更改,我建议将文本文件链接为表,并完全跳过插入

如果您坚持将其拉入数据库,那么1分钟内800000条记录超过13000条/秒。我不认为你能在MS Access中击败它


如果您希望它对用户更敏感,那么您可能需要考虑加载一些最小的数据集,并设置后台线程以在工作时加载其余部分。

< P>也许您可以用锁模式<代码> > AdLogBATCHOpDyp和CuroSo位置<代码> ADESECIELIN < /代码>将一个ADO记录集打开到表中。将所有数据写入记录集,然后进行批量更新(
rs.UpdateBatch
)。

另一种安排如何


是否可以选择复制一个现有的Access数据库文件,该文件包含您需要的表,然后只删除其中除这一个大表之外的所有其他数据(不知道Access是否具有与SQL server中的“truncate table”类似的等效项)?

还要检查复制该文件所需的时间。这将是数据写入速度的下限。在db和SQL中,通常需要一个批量加载实用程序才能接近这个速度。据我所知,MS从未像bcp那样创建直接写入MS Access表的工具。专门的ETL工具还将优化围绕插入的一些步骤,例如SSI在内存中进行转换的方式,DTS也有一些优化。

我将预先填充数据库,并将文件本身交给它们,而不是填充现有(但为空)数据库

如果必须填充的数据发生了更改,则使用一些代码在服务器上保持ODBC access数据库(MDB文件)的同步,以查看主数据库中的更改并将其复制到access数据库

当用户请求一个新的数据库时,将MDB压缩,传输给他们,然后打开它

或者,您可以找到直接打开数据并将数据插入数据库的代码

或者,您也可以找到access可以更快导入的另一种格式(csv除外)


-Adam

如果它来自dbase,您是否可以复制数据和索引文件并直接附加而不加载?应该是非常有效的(从给你带来FoxPro的人那里)。我想它也会使用现有的索引


至少,它应该是一个非常高效的单命令导入。

跳过文本文件并使用ODBC或OLEDB直接从源表导入怎么样?这意味着更改FROM子句,以使用源表名称和适当的connect字符串作为FROM子句的IN“”部分

编辑: 实际上我看到你说原始格式是xBase
INSERT INTO table (...) 
SELECT * 
FROM tablename IN 'c:\somedir\'[dBase 5.0;HDR=NO;IMEX=2;];