4
|
dummzeuch Stijn Sanders · 技术社区 · 15 年前 |
1
3
您的基于文本的解决方案似乎是最快的,但如果您可以获得一个预先分配的MS访问,在接近结尾的大小,您可以更快地得到它。您可以通过填充一个典型的用户数据库、关闭应用程序(以便刷新缓冲区)和手动删除该大表的所有记录来完成这项工作,但不能收缩/压缩它。 因此,使用该文件开始真正的填充-访问不会请求任何(或很少)额外的磁盘空间。不记得MS Access是否有自动实现这一点的方法,但它可以帮助很多… |
2
9
既然您说过800K记录的数据在数据库的生命周期内不会改变,那么我建议将文本文件作为一个表链接,并跳过插入操作。 如果您坚持将其拉入数据库,那么一分钟内800000条记录超过13000/秒。我不认为你会在微软Access中打败它。 如果您希望它对用户更具响应性,那么您可能需要考虑加载一些最小的数据集,并设置一个后台线程来在其他线程工作时加载它们。 |
3
5
如果没有索引,速度会更快。导入后可以添加吗? 有许多建议可能对此线程感兴趣 Slow MSAccess disk writing |
4
4
跳过文本文件并使用ODBC或OLEDB直接从源表导入会怎么样?这意味着要更改FROM子句以使用源表名和适当的连接字符串作为FROM子句的in“”部分。 编辑: 实际上,我看到你说的原始格式是XBase,所以应该可以使用XBase ISAM,它是Jet的一部分,而不需要ODBC或OLEDB。看起来像这样:
您可能需要对此进行调整——我只是获取了指向DBF文件的链接表的连接字符串,因此参数可能略有不同。 |
5
3
另一种安排怎么样… 是否可以选择复制现有的具有此表的Access数据库文件,然后只删除其中除此大表之外的所有其他数据(不知道Access是否与SQL Server中的“truncate table”类似)? |
6
3
我会用另一个数据库替换MS Access,我看到了 Sqlite 是最好的选择,它不需要任何安装到客户机,它是非常快速的数据库和最好的嵌入式数据库解决方案之一。 您可以通过两种方式在Delphi中使用它:
如果仍然需要使用MS Access,请尝试直接使用tadocommand和sql insert语句,而不是使用tadotable,这应该比使用tadotable.append更快; |
7
2
正如有人提到的,您不会在一分钟内导入80万条记录;这是 真的? 已经快了。 但是,如果使用正确的方法(DAO记录集)进行插入,则可以跳过恼人的“转换为文本文件”步骤。请参阅我在StackOverflow上提出并回答的前一个问题: MS Access: Why is ADODB.Recordset.BatchUpdate so much slower than Application.ImportXML? 即使使用刀也不要使用insert-into,因为它很慢。也不要使用ADO;它很慢。但是直接(而不是通过access.application对象)实例化dbengine com对象的dao+delphi+recordsets+会给你很大的速度。 |
8
1
你从一个方面看的是正确的方向。使用单个语句进行大容量插入要比尝试遍历数据并逐行插入快。作为一个基于文件的数据库,访问在迭代写操作中会非常缓慢。 问题是,Access正在处理如何在内部优化写操作,实际上没有任何方法来控制它。您可能已经达到了insert语句的最大效率。为了提高速度,您应该在每次启动应用程序时评估是否有任何方法可以将800000条记录写入数据库。 |
9
1
得到 SQL Server Express (空闲)并通过访问外部表连接到它。SQL Express比MS Access快得多。 |
10
1
我将预先填充数据库,并将文件本身交给它们,而不是填充现有(但为空)的数据库。 如果必须填充更改的数据,则使用少量代码在服务器上保持ODBC Access数据库(mdb文件)同步,以查看主数据库中的更改并将其复制到Access数据库。 当用户请求一个新的数据库压缩MDB时,将其传输给他们,然后打开它。 或者,您可以找到直接打开数据并将数据插入数据库的代码。 或者,您也可以找到另一种格式(而不是csv),访问可以更快地导入。 -亚当 |
11
0
还要检查复制文件需要多长时间。这将是数据写入速度的下限。在与SQL类似的数据库中,通常需要大容量加载实用程序才能接近这个速度。据我所知,MS从未像BCP那样创建直接写入MS访问表的工具。专门的ETL工具还将优化围绕插入的一些步骤,例如ssis在内存中进行转换的方式,dts也有一些优化。 |
12
0
也许您可以用锁模式打开ADO记录集到表中。
|
13
0
如果它来自数据库,您可以复制数据和索引文件,直接附加而不加载吗?应该是相当有效的(来自那些给你带来FoxPro的人),我想它也会使用现有的索引。 至少,它应该是一个非常有效的单命令导入。 |
14
0
80万条记录从一个创建到下一个创建的变化是多少?在创建新数据库时,是否可以预先填充记录,然后只更新外部数据库中已更改的记录? 这可以使您更快地创建新的数据库文件。 |
15
0
你的磁盘转动有多快?如果是7200rpm,那么3分钟内800000行仍然是每盘旋转37行。我认为你不会做得更好。 同时,如果目标是简化流程,那么表链接呢? 你说你不能通过ADO访问源数据库。可以在MS Access中设置到源数据库中的表或视图的表链接吗?然后,来自表链接的简单追加查询将数据从源数据库复制到目标数据库。我不确定,但我想这会很快。 如果在运行时之前无法设置表链接,可能可以通过ADO以编程方式生成表链接,然后以编程方式生成追加查询,然后调用追加查询。 |
16
-3
夏威夷群岛 最好的方法是按他们所说的从TXT文件批量插入 您应该将记录插入到txt文件中,然后将txt文件大容量插入到表中。 该时间应小于3秒。 |
Some1Else · 函数在Delphi中重新创建TForm 2 年前 |
Agmcz · Delphi安卓库。so未安装(AAB) 2 年前 |
nader · 如何使用delphi在web上提交表单 6 年前 |
kwadratens · Delphi中的卡方分布函数代码 6 年前 |
user9672569 · 如何在完整的位图图像中绘制阴影效果? 6 年前 |
mmmm · MSBuild(用于Delphi)Make-like功能 6 年前 |