wsg1212 2008-5-4 11:21
用access当队列使用(由于太大,内存放不下),效率太低了怎么办
记录结构是
时间、类型、名称、地址、备注
队列使用方法: 提取、追加、计算长度
提取的时候要 select top 1 * from table where 类型=xx, 然后 delete from table name=xx
计算长度的时候要 select count(*) from table where 类型=xx
追加的时候,直接insert语句,
由于这三个操作都非常的频繁,平均不到1秒就1次。导致CPU占用率很高,系统明显变慢。
真不知道怎末解决。
1 考虑删除的时候用定位删除,目前还不太会使用(ODBC)
2 我觉得最主要的是各个操作到要考虑一个类型的查询,如果按类型分离表就没有了查询,可是按类型分开表的话要达到70多个表,现在只要10个表。
3 考虑ACCESS的其它性能参数设置
4 考虑修改表的记录结构
5 由于不能进行缓冲处理,提取的时候只能一次一条,
wsg1212 2008-5-4 11:32
5 由于不能进行缓冲处理,提取的时候只能一次一条,
===============================================
这一条只能是这样了,如果要缓冲的话,由数据库内部自己搞吧。我不能单独搞,因为
这样就会严重破坏程序结构,而且数据库是可以多用户共用的。
我感觉缓冲应该没有多大必要吧,数据库本身的缓冲计数应该足够好吧!
不直到大家有什么注意,或者有什么更好的数据库系统(桌面的免费的)可使用。
wsg1212 2008-5-4 11:36
系统每秒大概有5000~10000条数据需要插入到一表保持其详细数据,同时更新另一表使其保持最新数据,用ado+sql2005每秒只能处理200~300条左右,而单独执行插入或更新也只能在300~400左右,不知道数据库的处理瓶颈在哪?
试过多个链接对比单个链接效率改善不大。
wsg1212 2008-5-4 11:39
可能删除索引是个好方法,插入的时候可能索引占了时间。
wsg1212 2008-5-4 11:41
可能ODBC API页占有不少时间,每次插入都新建一个hstmt对象浪费了,
如果只有一个hstmt对象,插入的时候重新bind一下参数,应该可以节省一些
查询的时候也是(先关闭一下游标,然后重新执行一此语句)
wsg1212 2008-5-4 11:42
ACCESS支持事物吗,事物默认是打开的吗,如果是就要关闭会明显提高效率
CodeCoolie 2008-5-4 12:54
拜牛。。。
justademo 2008-5-4 23:24
用MySQL吧。程序中可以直接调用它的C/C++ API进行数据库操作,速度超快!而且是免费、正版!
enthappy 2008-5-4 23:46
[quote]原帖由 [i]wsg1212[/i] 于 2008-5-4 11:21 发表 [url=http://www.cnsw.org/bbs/redirect.php?goto=findpost&pid=353309&ptid=80810][img]http://www.cnsw.org/bbs/images/common/back.gif[/img][/url]
队列使用方法: 提取、追加、计算长度 [/quote]
如果不在中间插数据,只是像普通队列一样的提取、追加,建议自己写个文件队列,这样省资源、速度快、代码少
wandou 2008-5-4 23:54
数据库插入记录的极限,如果每次插入1条的话,极限速度就是不到3000条。无论是sqlserver,oracle还是mysql,跟ado无关。这还是在无索引的情况下。
如果只是当队列用,可以是使用berkeley Db,因为它不是关系型数据库。
换方法,否则想每秒插10000条没戏。
aalii 2008-5-5 10:16
拜牛,如此频繁的数据操作~
“系统每秒大概有5000~10000条数据需要插入到一表保持其详细数据”
再加上更新和删除,得每秒处理多少哇~
你用什么样的硬件资源?
enthappy 2008-5-5 23:31
[quote]原帖由 [i]aalii[/i] 于 2008-5-5 10:16 发表 [url=http://www.cnsw.org/bbs/redirect.php?goto=findpost&pid=353662&ptid=80810][img]http://www.cnsw.org/bbs/images/common/back.gif[/img][/url]
拜牛,如此频繁的数据操作~
“系统每秒大概有5000~10000条数据需要插入到一表保持其详细数据”
再加上更新和删除,得每秒处理多少哇~
你用什么样的硬件资源? [/quote]
:L
enthappy 2008-5-5 23:33
可能你需要把设计拿出来,问大家应该怎么设计,而不是按自己的设计找解决方案
敢为天下先 2008-5-6 00:09
[quote]原帖由 [i]enthappy[/i] 于 2008-5-5 23:33 发表 [url=http://www.cnsw.org/bbs/redirect.php?goto=findpost&pid=353937&ptid=80810][img]http://www.cnsw.org/bbs/images/common/back.gif[/img][/url]
可能你需要把设计拿出来,问大家应该怎么设计,而不是按自己的设计找解决方案 [/quote]
对,你要解决问题,先自爆..........
wsg1212 2008-5-6 10:56
[quote]原帖由 [i]vender[/i] 于 2008-5-5 10:05 发表 [url=http://www.cnsw.org/bbs/redirect.php?goto=findpost&pid=353653&ptid=80810][img]http://www.cnsw.org/bbs/images/common/back.gif[/img][/url]
:L [/quote]
确实如此,因为内存放不下,
主要是自己不熟悉ODBC的定位删除,
不直到PREPARE方式的语句和SQLSetPos那个更快,不直到SQLSetPos的具体用法
不熟悉ODBC如何批量提取(查询和删除),如何批量插入,据说用SQLSetPos,但我不会用