Firebird与Access比较
我一直用的桌面数据库是Access,前一阵子发现有Firebird embed,而且网上评价很高,x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
就想试用,并与Access做了一些测试比较,测试平台vb6.0(CPU1.6G+512DDR),x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
希望大家指正!x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
1. 到Firebird官网下载:x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Firebird-2.1.0.17798-0_Win32_embedx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
OdbcFb32_DLL_Beta_2-0-0144x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
2. 注册ODBC FBx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
regsvr32 /s /u %SystemRoot%\system32\odbcfb32.dll x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
del %SystemRoot%\system32\odbcfb32.dllx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
copy OdbcFb32.dll %SystemRoot%\system32x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
regsvr32 %SystemRoot%\system32\odbcfb32.dllx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
3. 创建数据库x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Firebird: TEST.FDB, 表T1, 字段: ID CHAR(5) PRIMARY KEY, NAME CHAR(5)x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Aceess : TEST.MDB, 表T1, 字段: ID 文本(5) PRIMARY KEY, NAME 文本(5)x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
注意: TEST.FDB 是用 Firebird Maestro 创建的x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
4. 插入Firebird (5000条记录)x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Sub Insert_Firebird()x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Dim cnn As Connectionx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Dim rs As ADODB.Recordsetx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Dim i As Longx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Dim t As Doublex¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Set cnn = New ADODB.Connectionx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
cnn.CursorLocation = adUseClientx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
cnn.Open "DRIVER=Firebird/InterBase(r) driver;" & _x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
"UID=SYSDBA; PWD=;" & _x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
"CLIENT=" & App.Path & "\fbembed.dll;" & _x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
"DBNAME=" & App.Path & "\test.fdb;"x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
cnn.Execute "DELETE FROM T1"x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
t = Timerx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Set rs = New ADODB.Recordsetx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
rs.Open "SELECT * FROM T1", cnn, adOpenStatic, adLockBatchOptimisticx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
For i = 1 To 5000x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
rs.AddNewx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
rs.Fields("ID").value = CStr(i)x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
rs.Fields("NAME").value = CStr(i)x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Nextx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
rs.UpdateBatchx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
t = Timer - tx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Text1.Text = t & " seconds"x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
End Subx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
'/耗时约13秒x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
5. 插入Access (5000条记录)x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Sub Insert_Access()x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Dim cnn As Connectionx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Dim rs As ADODB.Recordsetx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Dim i As Longx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Dim t As Doublex¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Set cnn = New ADODB.Connectionx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
cnn.CursorLocation = adUseClientx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=TEST.MDB"x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
cnn.Execute "DELETE FROM T1"x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
t = Timerx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Set rs = New ADODB.Recordsetx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
rs.Open "SELECT * FROM T1", cnn, adOpenStatic, adLockBatchOptimisticx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
For i = 1 To 5000x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
rs.AddNewx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
rs.Fields("ID").value = CStr(i)x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
rs.Fields("NAME").value = CStr(i)x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Nextx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
rs.UpdateBatchx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
t = Timer - tx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Text1.Text = t & " seconds"x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
End Subx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
'/耗时约8秒x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
6. 文件大小比较x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
插入前文件大小:TEST.FDB 648 KB, TEST.MDB 140 KBx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
插入5000条记录后的文件大小:TEST.FDB 956 KB, TEST.MDB 484 KBx¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
7. 绑定控件x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
按以上连接方法得到全部记录(5000条),然后绑定到MS Datagrid,x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
耗时比较:x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Firebird: 0.17秒x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
Access: 0.06秒x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
问题:x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
1. 为什么文件大小、插入性能、查询绑定性能会相差那么远?讨论一下!x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ
2. firebird可以压缩吗?x¨5ÁÐáÁ/forum.entlib.net.cnÄ Lø3vÆ