到底是ADO还是BDE速度快?(200分)

在连结ACCESS数据库是ODBC比ADO快,因为,ADO到最后也是通过ODBC去连结的它
而到了SQL Server中,就是ADO快,因为ADO直接通过OLE DB连结它,ODBC饶个弯
路,然后再通过OLE DB去连结
 
不知道是不是数据结构的原因,在SQL SERVER 2000下,感觉也还ODBC来的快,
但没在ACCESS下来的明显。
 
建议使用ADO,尤其是假如你的软件今后涉及到远程服务器时,BDE就无能为力了。
 
本也想如此(改ADO),不过用户发觉一下慢了许多,那可不妙。
 
单从速度上说BDE大约比ADO快%5左右。
但对于同一操作反复执行时,BDE每次执行的效率的差异比较大,
而ADO则每次的执行效率都很接近,也就是说,
ADO比BDE稳定。
如果你用ACCESS或MSSQL数据库,那用ADO肯定没错。
关于这个问题,你可以看看李维的《DELPHI 5ADO/MTS/COM+高级设计篇》,
里面论述得非常清楚,用ADO编程的一定要看看这本书。
 
小型的----ADO快
大型的----BDE快。
 
這是我為公司做的一份ado和bde的速度測試報告﹕
發現ado的速度隨數據的增大而直線上升﹐所以我公司目前以否定了ado.
給各位提供參
紀錄數為:300條﹐1000條﹐5000條﹐10000條
關于ADO和BDE的速度的測試報告
一. 測試原因
ADO為微軟大力推荐的數據連接﹐連接速度快,以后在升級方面能得到相關的技朮支持﹐且不用太多配置﹐所以決定以后用ADO來代替現有的BDE數據連接.現進行關于ADO和BDE的運行和數據連接速度的測試臉。
二. 測試環境
CPU:pII450
網速:10.0Mbps
操作系統: Microsoft Windows 2000 Server
內存:128M
數據庫:eek:racle8.16
數據庫IP:192.168.0.33
測試代碼的開發工具:delphi5.0
BDE:
ADO:
表結構: CREATE TABLE TEST1 (
TESTID NUMBER NOT NULL,
TESTNUM NUMBER NOT NULL)
三. 測試代碼
unit Unitado;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, DBTables, Db, ADODB;

type
TForm1 = class(TForm)
Database1: TDatabase;
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
Query1: TQuery;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Button3: TButton;
Edit3: TEdit;
Edit4: TEdit;
Button4: TButton;
Label3: TLabel;
Label4: TLabel;
Edit5: TEdit;
Label5: TLabel;
Edit6: TEdit;
Label6: TLabel;
Label7: TLabel;
Edit7: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
i,FirstTickCount,FirstTickCount1,sum:integer;
begin
Query1.Close;
Query1.sql.Clear;
Query1.SQL.Text := 'select * from test1';
FirstTickCount := gettickcount;
Query1.Prepare;
Query1.Open;
Edit6.Text := inttostr(gettickcount-FirstTickCount);
Query1.First;
for i := 0 to Query1.RecordCount - 1 do
begin
sum := sum + Query1.fieldbyname('testnum').value;
Query1.Next;
end;
Edit1.Text := inttostr(gettickcount-FirstTickCount);
//showmessage(inttostr(sum));
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i,sum,FirstTickCount:integer;
begin
ADOQuery1.Close;
ADOQuery1.sql.Clear;
ADOQuery1.SQL.Text := 'select * from test1 ';
FirstTickCount := gettickcount;
ADOQuery1.Open;
Edit7.Text := inttostr(gettickcount-FirstTickCount);
ADOQuery1.First;

for i := 0 to ADOQuery1.RecordCount - 1 do
begin
sum := sum + ADOQuery1.fieldbyname('testnum').value;
ADOQuery1.Next;
end;
Edit2.Text := inttostr(gettickcount-FirstTickCount);
// showmessage(inttostr(sum));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
i,FirstTickCount,sum:integer;
begin
Query1.Close;
Query1.sql.Clear;
Query1.SQL.Text := 'select * from test1 where testid='+Edit5.text;
// Query1.Prepare;
FirstTickCount := gettickcount;
Query1.Open;
sum := Query1.fieldbyname('testnum').value;
Edit3.Text := inttostr(gettickcount-FirstTickCount);
//showmessage(inttostr(sum));

end;

procedure TForm1.Button4Click(Sender: TObject);
var
i,sum,FirstTickCount:integer;
begin
ADOQuery1.Close;
ADOQuery1.sql.Clear;
ADOQuery1.SQL.Text := 'select * from test1 where testid='+Edit5.text;
FirstTickCount := gettickcount;
ADOQuery1.Open;
sum := ADOQuery1.fieldbyname('testnum').value;
Edit4.Text := inttostr(gettickcount-FirstTickCount);

end;
四. 測試數據
1. 紀錄count:300
a. 描述: Query.sql.text:= ‘select * from test1’
Query 打開時間
BDE_Time ADO_Time
第一次 3184 210
第二次 10 190
第三次 10 191
b. 描述: Query.sql.text:= ‘select * from test1’
Query 打開+合計時間
BDE_Time ADO_Time
第一次 3314 250
第二次 160 220
第三次 140 231
c. 描述: Query.sql.text:= ‘select * from test1 where testid= 235’
Query 打開時間
BDE_Time ADO_Time
第一次 3125 50
第二次 0 30
第三次 10 20

2. 紀錄count:1000
a. 描述: Query.sql.text:= ‘select * from test1’
Query 打開時間
BDE_Time ADO_Time
第一次 3074 461
第二次 0 431
第三次 0 411
b. 描述: Query.sql.text:= ‘select * from test1’
Query 打開+合計時間
BDE_Time ADO_Time
第一次 3515 631
第二次 451 601
第三次 450 591
c. 描述: Query.sql.text:= ‘select * from test1 where testid= 768’
Query 打開時間
BDE_Time ADO_Time
第一次 5578 60
第二次 0 30
第三次 10 20

3. 紀錄count:5000
a. 描述: Query.sql.text:= ‘select * from test1’
Query 打開時間
BDE_Time ADO_Time
第一次 3074 2093
第二次 0 2043
第三次 10 2083
b. 描述: Query.sql.text:= ‘select * from test1’
Query 打開+合計時間
BDE_Time ADO_Time
第一次 5267 4537
第二次 2243 4506
第三次 2404 4496
c. 描述: Query.sql.text:= ‘select * from test1 where testid= 3261’
Query 打開時間
BDE_Time ADO_Time
第一次 3015 60
第二次 10 40
第三次 10 30

4. 紀錄count:10000
a. 描述: Query.sql.text:= ‘select * from test1’
Query 打開時間
BDE_Time ADO_Time
第一次 9043 4637
第二次 10 4456
第三次 0 5338
b. 描述: Query.sql.text:= ‘select * from test1’
Query 打開+合計時間
BDE_Time ADO_Time
第一次 13970 13490
第二次 4757 13249
第三次 4486 14210
c. 描述: Query.sql.text:= ‘select * from test1 where testid= 4567’
Query 打開時間
BDE_Time ADO_Time
第一次 6910 80
第二次 10 30
第三次 10 30
 
单凭速度比较ADO和BDE,这对ADO太不公平了。
 
对了,用到了循环!
 
李维的《DELPHI 5ADO/MTS/COM+高级设计篇》?哪里可以下载?
 
买书吧,也对得起人家。
虽然有点贵(90大洋),
但绝对物有所值。
电子版只有前4章,且有30M之大。
 
大小不是问题,^_^,有空看看去。
 
我用了E_fenghuan的代码,测试了结果如下:
Database server: MS sql 2000
hardware: AMD Duron 600/winxp/256M ram
Table records: 800,000
result: (gettickcount-fristtickcount)=711
八○万条记录,ADO的速度不慢呀!也许是和内存大小关系很大,
记得有一次听微软人员讲,MS sql server在大内存下才有优势
 
就单单读取速度那肯定是相差不大的,但一旦用到了循环,差别就大了。
 
ADO 快呀
 
ado, 慢,但在不断的变快。。
BDe,快,不会再快了
 
ado比较爽
 
你如果用的数据库是MS sql server,你就用ado,你用的是非Ms的数据库比如informix等
你最好用BDE
 
dopro兄?其他数据库为什么用BDE好,方便肯定是ADO方便,
是不是好在连接速度?
 
ADO是MS封装在ODBC API上搞出来的,是ODBC上的一层。BDE则是用来跟ODBC搞对抗的(不过好象
搞不过老比尔,现在成了鸡肋了)。在用MS的东东(比如MSSQLSERVER)时,应该是ADO比较好。
 

Similar threads

回复
0
查看
818
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
顶部