|
5
|
| dummzeuch Stijn Sanders · 技术社区 · 17 年前 |
|
|
1
3
既然你说过在数据库的生命周期内,80万条记录的数据不会改变,我建议以表的形式链接到文本文件,并完全跳过插入。 如果你坚持把它拉进数据库,那么1分钟内有80万条记录超过13000条/秒。我不认为你会在MS Access中击败它。 如果你想让它对用户的响应更快,那么你可能想考虑加载一些最小的数据集,并设置一个后台线程在它们工作时加载其余的数据。 |
|
2
9
没有索引会更快。你能在导入后添加它们吗? 在这个话题中,有一些建议可能会引起人们的兴趣 Slow MSAccess disk writing |
|
|
3
5
跳过文本文件并使用ODBC或OLEDB直接从源表导入怎么样?这意味着更改FROM子句,以使用源表名和适当的连接字符串作为FROM子句的IN“”部分。 编辑: 实际上,我看到你说原始格式是xBase,所以应该可以使用Jet中的xBase ISAM,而不需要ODBC或OLEDB。看起来像这样:
您可能需要对此进行调整——我刚刚抓取了指向DBF文件的链接表的连接字符串,因此参数可能略有不同。 |
|
4
4
你的基于文本的解决方案似乎是最快的,但如果你能得到一个大小接近末尾的预分配MS Access,你就可以更快地得到它。您可以通过填充一个典型的用户数据库、关闭应用程序(以便刷新缓冲区)并手动删除该大表的所有记录来实现这一点,但不要缩小/压缩它。 因此,使用该文件开始真正的填充——Access不会请求任何(或很少)额外的磁盘空间。不记得MS Access是否有自动化的方法,但它可以提供很多帮助。.. |
|
|
5
3
另一种安排怎么样。.. 是否可以选择复制一个现有的Access数据库文件,该文件包含您需要的此表,然后删除其中除此大表之外的所有其他数据(不知道Access是否与SQL server中的“截断表”等效)? |
|
|
6
3
我会用另一个数据库替换MS Access,对于你的情况,我看到了 Sqlite 是最好的选择,它不需要在客户端机器上进行任何安装,它是一个非常快速的数据库,也是最好的嵌入式数据库解决方案之一。 您可以在Delphi中以两种方式使用它:
如果您仍然需要使用MS Access,请尝试直接将TAdoCommand与SQL Insert语句一起使用,而不是使用TADOTable,这应该比使用TADOTtable更快。附录; |
|
|
7
2
正如有人提到的,您不会在不到一分钟的时间内导入80万条记录;那是 真正地 已经快了。 但是,如果您使用正确的方法(DAO记录集)进行插入,则可以跳过恼人的翻译为文本文件的步骤。请参阅我在StackOverflow上提出并回答的前一个问题: MS Access: Why is ADODB.Recordset.BatchUpdate so much slower than Application.ImportXML? 即使使用DAO,也不要使用INSERT INTO;它很慢。也不要使用ADO;它很慢。但是DAO+Delphi+Recorsets+直接实例化DbEngine COM对象(而不是通过Access.Application对象)会给你带来很多速度。 |
|
|
8
1
你朝着正确的方向看。使用单个语句进行批量插入比尝试迭代数据并逐行插入更快。Access是一个基于文件的数据库,在迭代写入中会非常慢。 问题是Access正在处理它如何在内部优化写入,并且实际上没有任何方法可以控制它。您可能已经达到了INSERT语句的最大效率。为了提高速度,您可能应该评估是否有办法在每次启动应用程序时将800000条记录写入数据库。 |
|
|
9
1
得到 SQL Server Express (免费)并从Access外部表连接到它。SQL express比MS Access快得多。 |
|
|
10
1
我会预先填充数据库,并将文件本身交给他们,而不是填充现有的(但空的)数据库。 如果必须填充的数据发生了更改,则使用一些代码在服务器上保持ODBC访问数据库(MDB文件)同步,以查看主数据库中的更改并将其复制到访问数据库。 当用户请求一个新的数据库时,压缩MDB,将其传输给他们,然后打开它。 或者,您可以找到直接打开并将数据插入数据库的代码。 或者,您也可以找到另一种格式(csv除外),这种格式可以更快地导入。 -亚当 |
|
|
11
0
还要检查复制文件需要多长时间。这将是写入数据速度的下限。在像SQL这样的数据库中,通常需要一个大容量加载实用程序才能接近这个速度。据我所知,MS从未创建过像bcp那样直接写入MS Access表的工具。专门的ETL工具还将优化围绕插入的一些步骤,例如SSIS在内存中进行转换的方式,DTS也有一些优化。 |
|
|
12
0
也许您可以使用锁定模式打开表的ADO记录集
|
|
|
13
0
如果它来自dbase,你能复制数据和索引文件并直接附加而不加载吗?应该相当高效(来自给你带来FoxPro的人)。我想它也会使用现有的索引。 至少,它应该是一个非常高效的单一命令Import。 |
|
|
14
0
从一个创建到下一个创建,这80万条记录有多大变化?在创建新数据库时,是否可以预先填充记录,然后只更新外部数据库中已更改的记录? 这可以让您更快地创建新的数据库文件。 |
|
|
15
0
你的磁盘转得有多快?如果是7200RPM,那么3分钟内800000行仍然是每转37行。我不认为你会做得更好。 同时,如果目标是简化流程,那么表链接怎么样? 你说你不能通过ADO访问源数据库。您能在MS Access中设置一个表链接到源数据库中的表或视图吗?然后,通过表链接执行一个简单的追加查询,就可以将数据从源数据库复制到目标数据库。我不确定,但我认为这会很快。 如果在运行时之前无法设置表链接,也许可以通过ADO以编程方式构建表链接,然后以编程方式生成追加查询,然后调用追加查询。 |
|
|
16
-3
夏威夷群岛 正如他们所说,最好的方法是从txt文件批量插入 您应该将记录插入txt文件,然后将txt文件批量插入表中 该时间应小于3秒。 |
|
|
Heinzi · 服务器端仅向前游标中断@标识 8 年前 |
|
|
Jerry Dodge · 无法将空字符串传递到非空数据库字段 8 年前 |
|
|
Error_2646 · 新的ADODB记录集是否创建了新的连接? 8 年前 |
|
|
J_Go · ADO+VBA sheetname返回值添加额外字符 9 年前 |
|
|
rheitzman · 使用ADO读取LDAP描述 10 年前 |