本人在编一个程序基于ACCESS库,经常需要往表中进行几十万条记录量的数据更新,执行是SQL语句一条一条插入的。速度很慢,十万条要三分钟,而且碎片很大,空白库中插入十万条,库会变成100M左右,但是实际上数据只占7M左右,现在更受不了的是,在有的时候会变成上G的空间(在有的机器上频繁出现,在有的机器上很少出现。虽然可以压缩,但是带来很大隐患),请教一下,是何原因。如何有插入产生很少碎片,以及提高大概几十万条这个量级的插入速度的方法。望大家支招,不胜感谢。
有没有建索引?
这么大的数据量就不要用ACCESS了
有可能是索引和主键的事,
可能是因为数据库在存数据时为了检索快速,物理存放地址会根据在排序树上的位置而变化,当你插入数据时,不停的调整位置,所以产生了很多碎片,而且没有回收,
数据库原理中好象都是用的B+树,从理论上来讲,先排序后插入意义不大,但也许可以试一下
简单的办法是换成SQL或是ORACLE的数据库
换数据库同时建存储过程
试试mysql
还望大家给些在access上的实现方式
插入用存储进程
数据库吗,改了把
十万条要三分钟这应该是正常的。
只怕SQL中如果你一条一条插,十万条只怕也要3分钟。
碎片问题我没有经验,不过应该不会。
如果字段多索引多,ACCESS十万条用三分钟实际上已经不错了。
是索引的问题
不过一般Access处理很多数据时本来就慢
还有数据量那么大,为什么不用SQL SERVER呢?
是索引的问题 取消所有的索引
采用文本方式导入法 让程序先往文本写入 然后用ACESS导入文本数据
你的数据源是什么格式的呀
如果用一句SQL 可以实现的话那速度就可以提高很多了
比如
insert into table1(field1,field2,field3)
select field1,field2,field3
from [Sheet1$] in '1.xls'[EXCEL 8.0;]
where (....)
这是从Excel 中读取数据 存储到 Access中的语句
也可以
select * from [Sheet1$] into table1
in '1.xls'[EXCEL 8.0]
当然别的数据库也可以用这种方式了,(插入到Access数据库中)
比如文本文件,foxpro的数据文件等等。
还有 你可以将数据一条一条的保存为文本文件,然后用一条SQL语句 插入到Access中去,
那速度也应该比你一条一条的插入到数据库中快一些。
数据量大就不要用桌面数据库了,同情楼主,我也有过类似的遭遇,后来改用别的网络数据库(Firebird)就没有类似的困境了。
多谢楼上的各位兄弟,现在数据来源是txt格式,现在是在程序中 进行数据导入,做的是增加而不是覆盖形式。gxd305兄弟说的是select into不过 那个好像只能插到一个新表里吧。发现access可以手工在菜单里把TXT文件里数据附加到一个表里不知怎们实现的
如果是小型数据库,你可以试试采用文本数据库。
如果总数据量低于100万,最好不过。
你将文本加载内存,修改增加保存文本。速度可能比输入库要快。
不会有碎片等问题。查询速度空前无比。
你可以使用STL,
请教楼上的具体怎们实现
sql语句执行很快的啊!
有没有建索引?
这么大的数据量就不要用ACCESS了
有可能是索引和主键的事,
可能是因为数据库在存数据时为了检索快速,物理存放地址会根据在排序树上的位置而变化,当你插入数据时,不停的调整位置,所以产生了很多碎片,而且没有回收,
数据库原理中好象都是用的B+树,从理论上来讲,先排序后插入意义不大,但也许可以试一下
简单的办法是换成SQL或是ORACLE的数据库
换数据库同时建存储过程
试试mysql
还望大家给些在access上的实现方式
插入用存储进程
数据库吗,改了把
十万条要三分钟这应该是正常的。
只怕SQL中如果你一条一条插,十万条只怕也要3分钟。
碎片问题我没有经验,不过应该不会。
如果字段多索引多,ACCESS十万条用三分钟实际上已经不错了。
是索引的问题
不过一般Access处理很多数据时本来就慢
还有数据量那么大,为什么不用SQL SERVER呢?
是索引的问题 取消所有的索引
采用文本方式导入法 让程序先往文本写入 然后用ACESS导入文本数据
你的数据源是什么格式的呀
如果用一句SQL 可以实现的话那速度就可以提高很多了
比如
insert into table1(field1,field2,field3)
select field1,field2,field3
from [Sheet1$] in '1.xls'[EXCEL 8.0;]
where (....)
这是从Excel 中读取数据 存储到 Access中的语句
也可以
select * from [Sheet1$] into table1
in '1.xls'[EXCEL 8.0]
当然别的数据库也可以用这种方式了,(插入到Access数据库中)
比如文本文件,foxpro的数据文件等等。
还有 你可以将数据一条一条的保存为文本文件,然后用一条SQL语句 插入到Access中去,
那速度也应该比你一条一条的插入到数据库中快一些。
数据量大就不要用桌面数据库了,同情楼主,我也有过类似的遭遇,后来改用别的网络数据库(Firebird)就没有类似的困境了。
多谢楼上的各位兄弟,现在数据来源是txt格式,现在是在程序中 进行数据导入,做的是增加而不是覆盖形式。gxd305兄弟说的是select into不过 那个好像只能插到一个新表里吧。发现access可以手工在菜单里把TXT文件里数据附加到一个表里不知怎们实现的
如果是小型数据库,你可以试试采用文本数据库。
如果总数据量低于100万,最好不过。
你将文本加载内存,修改增加保存文本。速度可能比输入库要快。
不会有碎片等问题。查询速度空前无比。
你可以使用STL,
请教楼上的具体怎们实现
sql语句执行很快的啊!