部分记录保存

来源:互联网 发布:总决赛7场欧文数据统计 编辑:程序博客网 时间:2024/05/18 02:50

"万条记录 delphi"的部分记录

?? ADO和BDE是不同的,BDE默认不会把所有的结果集全部DOWN下来,就算你SELECT10000条记录,它也不会把10000条记录全DOWN下来,而是用多少DOWN多少。ADO就不同了,如果CursorType设为ctStatic则它会将结果集全部保存在内存中,这当然要花些时间了,但不论用ADO还是用BDE都不应该一下子SELECT1000条记录出来,这说明你的应用设计的有问题。建议ADO做如下设置:
CacheSize:=1000;
CursorLocation:=clUseClient;
CursorType:=ctStatic;
LockType:=ltBatchOptimistic
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
http://search.csdn.net/Expert/topic/584/584212.xml?temp=.6567499
seekuface(seekuface) ( ) 信誉:100? 2002-03-18 20:07:43Z? 得分:3

?? 关键在于一次取回的数据要少,不能一次性的取回大量数据,这样会造成程序的低速和低效,修改DELPHI一些控件的默认参数即可改正这个缺陷。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?
http://search.csdn.net/Expert/topic/323/323062.xml?temp=.1287195
?newyj(吴刚vs西西弗) ( ) 信誉:107? 2001-10-15 08:58:54Z? 得分:10
??
提高数据库访问性能有很多方法;要看些数据库方面的书
比较常用的方法
1。建索引
2,拆分表 横向和纵向
3。升级硬件
用 Tadoquery 查询一定范围内的数据

不过1万条数据也不是很多;7、8秒确实太长了;可能和你的使用的机器配置有关
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
http://search.csdn.net/Expert/topic/323/323062.xml?temp=.1287195
? fq_fq(空见) ( ) 信誉:100? 2001-10-17 16:38:41Z? 得分:20
?
?
?
加快速度的方法很简单,首先,我建议你使用TADOQuery组件,然后让组件的CacheSize:=1000,缺省时是1(最不好的选择),然后将你的游标位置设置为客户端这一边,再有就是你的游标类型,只读前向的游标最快,但是要看你的运用类型。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?
http://search.csdn.net/Expert/topic/596/596212.xml?temp=.4911157
raptor(猛禽) ( ) 信誉:125? 2002-03-24 17:08:06Z? 得分:10
?
?
?
其实就性能来说,单用户访问用单机数据库最好,特别是数据量非常大的情况。
有人做过测试,在数以G计的数据量和数千万记录数的情况下,性能最好的数据库是 FoxPro 2.5 For DOS
我也做过一些测试,在单用户情况下,Paradox/Access的性能要比InterBase/SQL2000要好,而Oracle for Windows是最差的,而且SQL2000比SQL7要快一些。
?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?

?回复人: r3000() ( ) 信誉:100? 2002-03-26 09:30:25Z? 得分:10
?
?
?
(不用C/S,只用单用户)这是前提条件。大家看好了。
只要你的机器够好,内存够大,数G,百万条还是没问题的。
你有如下选择,不分先后.
1.Access 2.Paradox 3.SQL Server desktop
4.Oracle Lite 5.SQL Anywhere 6. Interbase 7.mysql

我基本上都用过,各有优缺点。

如果考虑速度。
1. SQL Anywhere 2. mysql 3.Access
考虑升级到C/S .
1. Oracle lite 2.SQL Server desktop 3.SQL Anywhere
考虑操作界面方便
1.Access 2.SQL Server desktop 3.SQL Anywhere
考虑稳定安全
1.SQL Anywhere 2.SQL Server desktop 3.mysql
考虑对SQL的支持
1.Oracle Lite 2.SQL Sever desktop 3. SQL Anywhere

Access,Paradox属于纯桌面数据库,只支持SQL的子集。
mysql,操作不太方便。
Interbase对SQL支持不好,例如不支持表关联的Update,很别扭。也不安全,密码形同虚设。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?
回复人: bruise() ( ) 信誉:100? 2002-03-26 10:36:03Z? 得分:5
?
?
?
都没有对比测试数据,看来大部分都是和我一样的懒虫。:-)
我们的一个例子:一个运行在w2k上的sql2000,有500万左右的数据,每月增长量为50-70万,容量1G多,作一次计费统计,需要3分钟。性能勉强可以吧。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?

回复人: juqiang(方枪枪(正在修炼伤心小箭)) ( ) 信誉:100? 2002-03-26 11:02:16Z? 得分:0
?
?
?
sqlserver,oracle,sybase,db2这些都可以啊!
从前和M$的一个客夫人元交流,才知道:
<100G的都是小应用
100G - 500G都是中型
500G或者上了T了,才是大型应用。

国内的应用,一年普通的,最多10个G吧!这样的应用,还谈不上数据调优。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?
?
Hank(星星农场) ( ) 信誉:115? 2002-03-26 12:40:10Z? 得分:10
?
?
?
这个要根据你的数据库与应用程序的连接方式以及你的硬件配置决定!

Raptor(猛禽)说的对,“其实就性能来说,单用户访问用单机数据库最好,特别是数据量非常大的情况。有人做过测试,在数以G计的数据量和数千万记录数的情况下,性能最好的数据库是 FoxPro 2.5 For DOS”你可以对3000万条记录级进行测试,FoxPro数据库没有问题,但是Access数据库估计死掉了!

但是FoxPro数据库维护比较麻烦,曾经做过一个制衣方面的项目,库存总表的DBF文件达到了250M左右,维护起来相当的费劲,而且目前只能用FoxPro/VFP系列进行维护,当然速度方面绝对没有任何问题!

我曾经在一个失败的项目(由于前期需求产生差异,采用了Access数据库)上进行过测试,当将客户的所有系统资料全部转入Access数据库后,数据库达到了1.2G,采用Delphi 5.x+ADO开发,当打开订单数据库时象死机一样!

当数据库容量超过600M的时候,建议不要使用Access数据库,有很多的项目经验在等着,没有必要往死里碰,况且还要考虑Access数据库的压缩问题。当然,从理论上讲,Access2000格式可以到4G,Access 97格式可以到1.2G(这个忘了在那儿看到过)!

看楼主的样子,数据库容量已经达到4G以上,目前在单机模式下,如果你用Windows+Delphi+ADO开发,不论是C/S或MIDAS结构,数据库比较明智的选择是SQL-Server/SQL AnyWhere/InterBase等中型数据库,当然,你也可以选择Oracle/DB2/Sybase等大型数据库,不过似乎没有多大必要;如果在Linux下使用的话,可选择的范围就大大缩小了!

但是,一旦牵扯到费用及版权问题,你一般情况下只能选择InterBase,因为她是免费的,你不可能卖给客户一个一万元的程序光数据库就几十万吧!

<<<以上说明仅供参考>>>
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
http://search.csdn.net/Expert/topic/7/7197.xml?temp=.6089746

回复人: Ardus() ( ) 信誉:100? 2000-05-03 11:26:00Z? 得分:10
?
?
?
1.先排除慢不是由数据库表设计差造成;在服务器端执行你的查询,
看看速度如何,
2.排除数据库设计因素后还慢,可以考虑将应用服务器和数据库服务器放在
同一台机器上;
3.放在同一台机器上还慢,那么你应该针对你的查询做专门的优化处理,
比如用户虽然没有查询条件,你可以在程序中定义一个
分段但并集为True的多个查询,将查询结果分段显示给用户。
4.如果用户非要你将数万条记录一次显示到他的屏幕上,你可以先讯他一顿,
然后考虑用多线程查询,组合显示。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
http://search.csdn.net/Expert/topic/7/7197.xml?temp=.6089746
?

?回复人: lwm8246(lwm8246) ( ) 信誉:100? 2001-01-14 00:17:00Z? 得分:0
?
?
?
1) 客户端是否需要20万条记录,是否需要全部字段?
2) 用TQuery 加入必要的选定条件主要是减少记录数量
3)可以考虑用Ado 进行分段存取
4) 规划数据结构把大量的操作放到server端,只反回处理结果到Client端

?最后强烈建议一般不要用Table元件,它会返回全部记录 !!!

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
?

?回复人: Ton2000(小顽童XP) ( ) 信誉:100? 2001-01-15 20:20:00Z? 得分:0
?
?
?
20万条记录要几分钟不算慢吧!
?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
http://search.csdn.net/Expert/topic/821/821414.xml?temp=.2205927

? 回复人:blue__star(蓝色沸点) ( ) 信誉:100? 2002-06-21 17:30:29Z? 得分:50
?
?
?
合理的建立索引、分区表
1.合理使用索引
索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:
●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。
●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。
●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。
●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。
2.避免或简化排序
应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:
●索引中不包括一个或几个待排序的列;
●group by或order by子句中列的次序与索引的次序不一样;
●排序的列来自不同的表。
为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
3.消除对大型表行数据的顺序存取
在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。
还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
这样就能利用索引路径处理查询。
4.避免相关子查询
一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
5.避免困难的正规表达式
MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。
另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。
6.使用临时表加速查询
把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>“98000”
ORDER BY cust.name
如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:
SELECT cust.name,rcvbles.balance,……other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
INTO TEMP cust_with_balance
然后以下面的方式在临时表中查询:
SELECT * FROM cust_with_balance
WHERE postcode>“98000”
临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。
注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。
7.用排序来取代非顺序存取
非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。
有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。

优化就是选择最有效的方法来执行SQL语句。Oracle优化器选择它认为最有效的
方法来执行SQL语句。

1.?IS NULL和IS NOT NULL
如果某列存在NULL值,即使对该列建立索引也不会提高性能。
2.?为不同的工作编写不同的SQL语句块。
为完成不同的工作编写一大块SQL程序不是好方法。它往往导致每个任务的结果不优
化。若要SQL完成不同的工作,一般应编写不同的语句块比编写一个要好。
3.?IN 和EXISTS
Select name from employee where name not in (select name from student);
Select name from employee where not exists (select name from student);
第一句SQL语句的执行效率不如第二句。
通过使用EXISTS,Oracle会首先检查主查询,然后运行子查询直到它找到第一个匹配
项,这就节省了时间。Oracle在执行IN子查询时,首先执行子查询,并将获得的结果
列表存放在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待
子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN
通常查询速度快的原因。
4.?NOT 运算符
Select * from employee where salary<>1000;
Select * from employee where salary<1000 or="" salary="">1000;
第一句SQL语句的执行效率不如第二句,因为第二句SQL语句可以使用索引。
5.?Order By 语句
Order By 语句的执行效率很低,因为它要排序。应避免在Order By 字句中使用表达式。
6.?列的连接
select * from employee where name||department=’ZYZBIOINFO’;
select * from employee where name=’ZYZ’ and department=’BIOINFO’;
这两个查询,第二句比第一句会快,因为对于有连接运算符’||’的查询,Oracle优化器是不
会使用索引的。
7.?通配符‘%’当通配符出现在搜索词首时,Oracle优化器不使用索引。
Select * from employee where name like ‘%Z%’;
Select * from employee where name like ‘Z%’;
第二句的执行效率会比第一句快,但查询结果集可能会不同。
8.?应尽量避免混合类型的表达式。
假设字段studentno为VARCHAR2类型
有语句select * from student where studentno>123;
则Oracle会有一个隐含的类型转换。隐含的类型转换可能会使Oracle优化器忽略索引。
这时应使用显式的类型转换select * from student where studentno=to_char(123)。
9.DISTINCT
?? DISTINCT总是建立一个排序,所以查询速度也慢。

目前提到的优化方法,都是在应用级的优化,当然它也是最重要的优化手段.
在系统级,需要优化磁盘的分布,将不同用途的表空间,建立到不同的物理磁盘上;回滚段的优化;日志文件的优化,建立与事务量相对应的日志文件大小等;
着重提高系统的I/O性能.. 当然,可以在系统级上进行,合理的分配表空间,尽量不要在系统表空间中建立没有必要的对象,我想也是一点建议吧。应该多从设计的时候去考虑问题。
比如少用游标,少用动态sql,少用like等模糊查询等
提高程序自身的性能。
查询优化是要用上索引的,建议对表进行分析,以便于oracle进行基于cost的查询优化。
在where中,执行一般是逆行的,先执行最后一个条件,所以影响最大的要放到最后,在多列索引中,与列的顺序有关,越前的列,检索越有利

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?
http://search.csdn.net/Expert/topic/908/908740.xml?temp=.1650507?
?
回复人: weekendW(老鸟) ( ) 信誉:97? 2002-07-31 10:06:00Z? 得分:35
?
?
?
我不知道你是否知道ADOQuery的工作原理,如果知道的话,请不要怪我啰嗦,ADOQuery有几个重要的属性决定了它的工作模式和工作效率。CursorLocation、CacheSize、CursorType。

??? CursorLocation决定了ADOQuery的数据存取模式,它分为Server-side和Client-side两种模式,如果你选择的是Server-side(将CursorLocation属性设为clUseServer)那么当你使用ADOQuery查询数据时,查询的结果将保存在数据源的ADO缓存中或者是存储在数据源本身的缓存中,(如果你的数据源是SQL Server那末查询的结果将保存在SQL server的缓存中),数据源只把ADOQuery指定的CacheSize大小的数据传给客户端的ADO引擎,并存储在客户端的ADO缓存中共应用程序处理,如果你指定的CacheSize为10的话那么数据源一次只传回10笔数据给客户端,如果客户端要处理第十一笔数据就需要在向服务器端的ADO引擎申请传递下10笔数据。Client-side模式(clUseClient)则一次将所有的查询结果传回到客户端的ADO缓存中,然后再由客户端ADO Cursor控制让客户端应用程序处理。Server-side模式将会占用服务器较大的资源,且客户端每处理完一笔数据后就需要向服务器在申请下一笔数据,所以速度较慢,Client-side所有的数据都已传到本地,所以只需要一次传递,以后不再需要向服务器申请,但是在第一次申请时需要传递大量的数据,所以等待的时间较长。一般建议使用Client-side+? StaticCursor的模式,适当的调整CacheSize(500-1000左右)。

?? 再来看看你的问题,一次查询返回90多万条记录这种查询应该是不合理的,让我们计算一下,如果一条记录长度为100个字节。900*1024*100=90MB!如果你的应用程序与服务器不再同一台机器,90M的数据仅网络传送时间就非常可观了。所以建议使用多次小批量的查询来代替一次查询所有记录的做法,你可以每次只查一天的纪录,查询n次来返回一个月的纪录。实践证明这种查询模式比一次查询所有记录要快(我的实际经验)。
?
?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?
http://search.csdn.net/Expert/topic/1458/1458502.xml?temp=.6585199

?
回复人: atang(阿汤) ( ) 信誉:91? 2003-02-24 10:53:25Z? 得分:0
?
?
?
我的主表有十几万条记录,两个从表也各有数万条记录,close后在open很慢的,顺便再问个问题,程序在启动时就要花费好长时间,我把游标设在服务器端,从表在打开时就会出错:“当前程序不支持排序和过滤所必须的界面”,我又尝试异步方式启动,可是速度没有任何改变
?
?
Top
?
?回复人: chenxiyu21th(希瑜) ( ) 信誉:98? 2003-02-24 12:39:57Z? 得分:0
?
?
?
使用第三方控件来操作数据库,用到什么数据,就调什么数据到客户端内存,启动很快
?
?
Top
?
?回复人: jade007(询人启事) ( ) 信誉:99? 2003-02-25 00:00:15Z? 得分:0
?
?
?
我也碰到这样的问题。解决办法很简单,只要在数据库中设个主键就搞定了,不明再问我。
?
?
Top
?
?回复人: jade007(询人启事) ( ) 信誉:99? 2003-02-25 00:03:33Z? 得分:0
?
?
?
记录多的话建议你用大型的数据库,如ORACLE,我打开一个表为十二万条记录的表只用了3秒钟,
不明再问。
?
?
Top
?
?回复人: King_0119(智) ( ) 信誉:99? 2003-02-25 07:59:54Z? 得分:0
?
?
?
请问你用的是什么数据库
用ADO连MS的东西是不会有问题的
我用ADO连Oracle也出现了同样的问题
是ADO和Oracle兼容不好
至今未解决
所以最好抉择一下
选择Borland的DBExpress好像不错
不过暂时没有支持MSAccess

?
?
Top
?
?回复人: lijx18(lijx) ( ) 信誉:100? 2003-02-25 16:51:46Z? 得分:0
?
?
?
数据库表中无主键
?
?
Top
?
?回复人: atang(阿汤) ( ) 信誉:91? 2003-02-27 13:17:25Z? 得分:0
?
?
?
有主键的!不过我已经解决,我让每个线程都拥有自己的会话,使用多个connection,就没有这个问题了,只是速度依然很慢,我用的是SQL-server,10M带宽
?
?
Top
?
?回复人: nnwq(乖仔) ( ) 信誉:97? 2003-03-17 23:11:39Z? 得分:0
?
?
?
有主键也是不行的,在新增记录并保存后,如果再次对其修改仍然会出错!!!除非一定要重新打开数据表。这是ADO的一个大BUG???!!!(我用的是ADO+mdb),此问题令我非常头痛,尤其是使用缓存更新时(此时是不可能重新打开表的)。
?
?
Top
?
?回复人: atang(阿汤) ( ) 信誉:91? 2003-03-25 10:35:58Z? 得分:0
?
?
?
我现在又发生这种问题了!呜呜!谁帮帮我呀!
?
?
Top
?
?

该问题已经结贴?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?
http://search.csdn.net/Expert/topic/2613/2613279.xml?temp=.4357111
?
主  题:? TQuery 和TTable的性能比较的问题
作  者:? DelphiToby (魔鬼先生)?
等  级:???
信 誉 值:? 95
所属论坛:? Delphi DataBase
问题点数:? 50
回复次数:? 16
发表时间:? 2003-12-29 11:33:20Z
?
?

我的Paradox 数据库有10万条记录

用TTable打开所有记录,仅仅需要3秒
用TQuery打开所有记录,需要2分钟

请问有什么办法可以改善TQuery的性能,让TQuery打开10万条记录可以控制在15秒之内?一定是要打开数据库的所有记录!

?
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?
http://search.csdn.net/Expert/topic/425/425497.xml?temp=.9340326
newmanJB(布衣侠客) ( ) 信誉:98? 2001-12-17 13:53:43Z? 得分:50
?
?
————————————————————————————————————————
??? 我试过24万条记录的操作,用ADOQuery.Requery刷新也很慢,用ADOQuery.Refresh更是会出错根本无法刷新。所以干脆将active设为false后再设为true,这样反而快多了(工作站刷新时快则6-8秒,慢则15-20秒),我用MSSQL2000,CPU为600。

??? 还有一种办法是,将ADOQuery设为异步传递数据,那样一刷新就会反应过来,可立即响应用户的操作。另作一个进度条显示刷新进度即可。

??? 我知道我这方法也不是好办法,所以也在留意这个问题,希望有高手赐教。
————————————————————————————————————————
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?
http://search.csdn.net/Expert/topic/483/483353.xml?temp=5.439395E-02
主  题:? 很高兴大家对Access惊奇发现!!!!!这么感兴趣!!!!继续送分大讨论!!!
作  者:? biggo (biggo)?
等  级:???
信 誉 值:? 98
所属论坛:? VC/MFC 非技术类
问题点数:? 0
回复次数:? 28
发表时间:? 2002-01-17 12:39:16Z
?
?
?
?
?
?
没想到大家对Access这么居然感兴趣,短短数日访问者近8000回复也到了288人次!作为问题的提出者,结合自己的实际经验,在对Access总结下!
首先说明,我本人,可能对Access还不胜了解,不足之处望大家见谅!!!!!!

单纯的认为Access不能管理大量的数据,数据库超过一定的M就降低性能还将出现莫名其妙的错误……我认为是个片面的看法,我的实际经验如下。

我的一个客户的实际使用情况如下:工厂人员有600人,每天每人1条统计记录、最少每天每人还有4条明细记录,可能还有相当部分的人有6条明细记录,明细记录的字段5个,统计记录的字段有67个,当然还有几个付表,那些记录就不多了,除了员工表有600个记录,一般也就最多十几个或几十个。一天将产生600条统计记录,2800条明细记录,已经正常工作了一年,一年365天减掉休息日,将产生20万条统计记录,90多万个明细记录。如果是没有经过压缩的数据就已经是几百M上G的数据量了,但现在客户的软件工作还正常,使用的是P3-800的机器。这么长时间和庞大的数据量也没见到客户说使用软件的时候发现什么错误和数据崩溃的现象!

因此片面的认为Access管理不了大量的数据是没有根据的,可能大家对桌面型数据库的认识还停留在课堂上的dbase和foxbase上面。Access可以说算得上是个优秀的桌面数据库了。

这个系统我是采用VC编写的,直接使用Jet4.0的Ole DB操作数据库不是用ADO。很多人抱怨Access数据量一大,程序就有问题,我认为多半问题出现在你的程序结构上,尤其是使用Delphi这些数据库自动化编程很高的系统上,由于软件的自动化,使程序员忽略了操作数据的规范性,经常发生访问几条记录,却在软件执行的时候客户端要遍历表中的所有记录,这样当然数据一多,程序的执行速度和效率明显降低。我在上面的程序中间,严格执行一条标准,那就是要使用多少数据就从数据库拿多少条出来,决不多一个!因此除了要打印明细数据将可能操作几千上万条记录,平时每次驻留再客户端的数据一般最多也就那么几十个几百个左右,决不会在客户段上遍历上面提到的统计表和明细表,不然我的系统早就完蛋了。

所以大家在编写数据库程序的时候一定要在程序规范上下功夫,不要程序运行不正常就老抱怨Access不行,其实它很健壮的。

既然我的程序超做上百万条记录都没有问题,那你的心目中就不要老想着sqlserver sybase interbase db2什么的吧。
我的系统其实是个小系统,不过数据量大点而已,数据库内的关系也不复杂,没有必要用那些企业级的数据库。你需要的话,我完全可升级下使用SQLserver,只要改个数据库连接参数就可以使用了。

当然那些大型数据库提供了Access许多没有但又十分诱人的功能,可能个个功能你都嘴馋。但我建议,你的系统如果不是真正的企业级应用,只是些小功能的软件,直接就使用Access吧,数据量大也没有关系。当然,你十分重视数据的安全性,不怕软件的成本高什么的,就尽管用SQLserver吧,那就是另外一回事了。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━?

http://search.csdn.net/Expert/topic/597/597106.xml?temp=.5788538
60多万条的纪录Access数据库可以瞬间打开,而我用ADO需要几分钟,问什么?
作  者:? CsdnKey (函数)?
等  级:???
信 誉 值:? 99
所属论坛:? Delphi DataBase
问题点数:? 100
回复次数:? 9
发表时间:? 2002-03-24 22:22:40Z
??
?
??

60多万条的纪录Access数据库,
用Access可以瞬间打开,
而我用ADO需要几分钟,问什么?
可能是控制查询数据量的问题,

我用 select top 100 ......限制纪录数量,速度有提高,
但是下100条就不知道如何读取了!

我该如何解决??希望大家帮忙,谢谢!!
?
?
?
?回复人: my_first(小@_@小) ( ) 信誉:99? 2002-03-24 22:25:06Z? 得分:50
?
?
?
你看下面这是向下分页取数据的,晚上刚刚把向上分页搞定,向下分页简单点
向上难一点点.

向下
SELECT TOP 100FROM Table1
WHERE> <本页分页标记>
ORDER BY

向上,给个思路给你。 

设一个上页分页标记,先降序,取出前你要的记录数, 然后再升序。 搞定

看下面, 这思路我问人家花掉300分

SELECT TOP <每页记录数>FROM Table1 WHEREIN (
? SELECT TOP <每页记录数>FROM Table1
? WHERE<= <上一页分页标记>
? ORDER BYDESC
)
ORDER BY

我晚上搞了一晚, 刚刚通过,太兴奋了。

以前我把所有数据都显示出来, 这样软件速度慢极了。 现在快多了。

?
?
Top
?
?回复人: my_first(小@_@小) ( ) 信誉:99? 2002-03-24 22:25:28Z? 得分:0
?
?
?
向下
SELECT TOP 100FROM Table1
WHERE> <本页分页标记>
ORDER BY


那我来告诉你吧是一个键, 比如说编号 bh, 编号须是排序的。0-3000吧
首先你取出table1表的第一条记录。 存放到一个变量里头,
var
tmplb:string;
begin

adotable1.first;
TMPlb:=ADOTable1.Fields.FieldByName('bh').AsString;?? // 这里取到的是第一条记录也就是值bh=0的记录送到tmplb变量里


select top 100 * from? table1
where bh>TMPlb //这里是你定义的分页标记,?? where bh>0?
ORDER BY bh

end;
点击下一页时,就取出第100条记录的值送于tmplb,

select top 100 * from? table1
where bh>TMPlb //这里是你定义的分页标记,?? where bh>100?
ORDER BY bh


这样你取的是100-200

做个循环不就成了

?
?
Top
?
?回复人: zbsfg() ( ) 信誉:98? 2002-03-24 22:32:01Z? 得分:50
?
?
?
你的引擎设置错了,DELPHI默认是CLIENT,但对ACCESS用SERVER模式快多了,60万条记录打开只要1秒不到。
TADOConnection.CursorLocation设为clUseServer就好了,但对于MSSQL,用clUseClient很快
?
?
Top
?
?回复人: windindance(风舞轻扬) ( ) 信誉:90? 2002-03-24 22:35:14Z? 得分:0
?
?
?
学习
?
?
Top
?
?回复人: CsdnKey(函数) ( ) 信誉:99? 2002-03-24 22:44:13Z? 得分:0
?
?
?
TO: My_first(海浪)
首先谢谢你!
我不一定非要按 bh 排序的话,该如何哪?
?
?
Top
?
?回复人: my_first(小@_@小) ( ) 信誉:99? 2002-03-24 22:57:11Z? 得分:0
?
?
?
要有一个是排序的字段,不一定是编号,也可以是其它字段。
?
?
Top
?
?回复人: my_first(小@_@小) ( ) 信誉:99? 2002-03-24 22:58:16Z? 得分:0
?
?
?
这个键一定是排序的。

adotable1.first;
TMPlb:=ADOTable1.Fields.FieldByName('bh').AsString; //这里的编号改为你自己定义的排序键
?
?
Top
?
?回复人: CsdnKey(函数) ( ) 信誉:99? 2002-03-24 23:06:33Z? 得分:0
?
?
?
to zbsfg():
?你的方法OK了!谢谢 !

To My_first(海浪) :
我的数据库的确没有固定的排序字段,所以无法用你的方法实现了
不过也非常感谢你!

?
?
Top
?
?回复人: clark_x(feng) ( ) 信誉:89? 2002-08-30 15:52:50Z? 得分:0
?
?
?
后来怎么办?
 

原创粉丝点击