各位过来看一下我的测试,探讨一下oracle速度问题,来者有分(200分)

  • 主题发起人 主题发起人 zohzjf
  • 开始时间 开始时间
Z

zohzjf

Unregistered / Unconfirmed
GUEST, unregistred user!
我在本论坛中找到如下的一些言论:



{各位高高手:
{现在我需要从一个文本文件中向Access表中一个字段导入数据,但由于数据量大
{(90万条左右)仅用AppendRecord需要时间太长,有无好办法?

{来自 :IAmOnTheWay 时间 :2001-08-27 19:29:00
{用的PB数据管道,5分钟即刻搞定
{----------------------------------------------------------------------------------------
{一个SQL SERVER数据库表,大约有五六十万条记录,已建了适当的索引,查询语句也很恰当,
{每次查询大约要两三秒,现在想提高查询的速度,不知还有何良方?
{另外有个问题很奇怪,比如以电话号码查询,如果查询以某个数据开头的号码,
{查询结果反而快(返回很大的记录集),查询某个特定号码相对慢些,不知是为什么?


{关键是看你返回的结果集有多大,
{如果只是返回部分结果集,那在50万记录中的查询速度应该在1秒以下。
{如果照你说的,索引是正确建立的,那只能是检查硬件配置是否合理了。
{你的内存足够大吗?
--------------------------------------------

---------------------------------------------------------------------------------------
我认为查询五六十万条记录并把所有数据都提取出来只用两三秒是不可能的,
如果做三层,无状态的,把数据一下子全部取出来,不忍受几十秒种是不可能的。


大家来看看我的一个测试:用bde直接连接还如此之慢,
那么三层的就更慢了

环境:delphi5.5+oracle8.0.5
数据库服务器win2000 程序运行

table1 连接表ck01记录数37772
Query1 语句 select * form ck01记录数37772


----------------------
Table1.Active :=true;//160ms
Table1.last;//20ms

//-----------------------------------------
Query1.Active :=true;//160ms
Query1.last;//20350ms
、、--------------------------------------
、、 实际上table并没没有把数据全部取出来;
拉动dbgrid的滚动条是鼠标就变成sql查询正忙的形状。
我使用:
ClientDataSet1.data:=DataSetProvider2.data;//33700ms DataSetProvider1 连接 query1
ClientDataSet1.data:=DataSetProvider1.data;// 22990ms DataSetProvider2 连接table1
直接的时间差距也说明了这个问题;

更令我痛苦的是用pb连接的几秒种就出来了,我怀疑pb的打开方式与dellphi的table控件是
一样的,可是pb的拉动滚动条是鼠标的形状不变,我的同事硬说pb、是全部去出来的。
我不会pb,不知道是否真的是这样。

我说的是否正确,请大家讨论,如果是这样,大家作的三层是不是全是有状态的,那么,我
的程序是mdi的我的每个ClientDataSet 不是要加一个DataSetProvider控件吗,不然的话我就
要忍受乌龟般的速度,好痛苦呀。


大伙有何高见尽量提出来,无论什么只要相关就行,发言有分,反应激烈的话我再开一个帖子给分!!!!

 
delphi+bde+oracle的模式遍历一张表,数据大于5000条,很慢.同样的表如果用带条件
的queryj就更慢,用表过滤的方法也慢,我做了一个实验,用ADO连接同样的表却能快一点.
所以,感觉是BDE的问题,引擎进行初试话优化(增大Cach和Buffer),速度增大效果不是很
明显,这与ADO连SQL Server没法比.
在数据库软件中,前台->数据库引擎->数据库,三者种,后两种连接是影响速度的主要原因,
BDE与Oracle是不同的公司的产品,这种接口本身就是一种'被动'的接口,而ADO与SQL Server
就不同,引擎与数据库是同一家公司的无缝的接口.
Bde的缺点却实不少,比如最大只支持46个线程,等,所以在Delphi 7中Bde据说Bolend有淘汰
BDE的趋势.
在三层结构中,最好的方法就是在Clientdataset中限制包数,来缓冲数据在表中的遍历速度.
 
china_delphiL: 你说的不错,
但是如果是在Clientdataset中限制包数,来缓冲数据在表中的遍历速度
就是有状态了,那么程序用户的数量就会大大减少。
如果是无状态的话,如果前台是MDI程序话,不同程序间由于条件不一样的查询
的到的结果不一样我不能用排序后然后定位的方法,
只有让query的sql语句从新付值,然后打开,再排序定位取下个数据包
这样的话还是很慢很慢,因为query执行locate的时候又把所有数据都取出来了,
好痛苦呀。
 
ado要快一些,大约是bde的10%
try it
 
李维的书中不时有一种方法是无状态的,但是可以分批获取数据的马?
就是传入OwnerData,建议看看,应该可行吧。
(我现在还没有大的多层开发的经验,所以只是建议)
 
多人接受答案了。
 
后退
顶部