線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:11465
推到 Plurk!
推到 Facebook!

FireBird 學習日誌

 
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-16 00:49:21 IP:122.126.xxx.xxx 訂閱
利用閒暇之餘讀了僅僅的兩本書,終於對 FireBird 有一定的瞭解。
寫下一點小心得,免得日後給它健忘。....
# 事務的隔離與效率有很大的關係。
   在一次測試實務中發現,本身使用 Insert或Append 在新增資料上並無太大的差異,但仍建議使用 Append 方式。
   使用 Generator 與 Stored Procedure 會導致降低效率,尤其 Stored Procedure 不可與 Dataset 使用不
   同的Transaction ,使用不同的 Transaction 導致 FireBird 因需事務隔離效率會降低非常多。寫完這一段我
   都不知道自己在說什麼。唉!
    
    新增 50000 筆資料   
    FIBPLUS = 7,600 ms
    IBX        =  8,529 ms
    新增 50000 筆資料(GEN_ID,同一事務)
    FIBPLUS =  9,453 ms
    新增 50000 筆資料(GEN_ID,不同事務)
    FIBPLUS = 97,547 ms
    新增 50000 筆資料(GEN_ID,每筆提交)
    FIBPLUS = 162,922 ms
    修改 50000 筆資料(每筆提交)
    FIBPLUS = 127,594 ms
    結論:速度  FIBPLUS 比 IBX 快。在相同條件下。在測試中也發現每次新增資料的速度
         不會因資料筆數變大後而降低效率。
# 測試 FireBird 穩定性?
   1.測試  每  5000 交易提交,在提交過程關閉電源後並無異常。
   2.測試新增 50000 筆紀錄,每筆均交易提交,在提交過程關閉電源。測試5次無異常。此時筆數已累積到40W筆資料。
   3.測試新增及修改 50000 筆紀錄,每筆均交易提交,在提交過程強制中斷程式。測試 10 次無異常。
   4.測試修改 50000 筆紀錄,每筆均交易提交,在提交過程關閉電源。測試 2次均導致資料庫損壞。損壞率 100%。
    (令人感到沮喪...)  
   以上均以 FroceWrite狀態下測試。 
   結論:FireBird 在事務更新下,非常容易造成數據損壞。既使使用 GFIX 仍無法修復。
        不清楚是否有改善方法!?
# 預儲函數與觸發器非常好用,可利用 Post_Event 回傳給用戶。只是語法不熟悉不易學。
# 對於安全性幾點誤會。
    1. 在嵌入式,登入密碼是沒有作用。當然也不見得帳號名稱是沒有作用,雖然使用空白的帳號及密碼
        仍然可以登入,但是是無權限閱讀先前所建立資料表。必須為資料表的擁有者才能修改及閱讀。
        因此當您在建立資料庫時,務必指定一個使用者名稱,可以不必是 SYSDBA 。
    2. 增加安全性,可用 Trigger Database Connect  事件中解決。相信要直接打開大門是有難度地。
        若要更上一層樓。可搭配 UDF 解決。
        可延伸至過濾用戶。如:
        if (exists(select 1 from MON$ATTACHMENTS m 
        where m.MON$ATTACHMENT_ID = CURRENT_CONNECTION and 
        m.MON$REMOTE_ADDRESS = 'XX.XX.XX.XX')) 
        then EXCEPTION disallow;
# 自動編號的解決。
   可透過 Generator 生成,可搭配 Trigger 或 預儲函數,看是要在Before Insert 中觸發填入 Gen_ID 或利
   用預儲函數直接再儲存過程中寫入適合 Master-Detail 。
   流水號格式,通常流水號會加上日期做區隔。重點此時無法在  預儲函數 使用 Set Generator 方式重置號碼,
   可利用取巧 Gen_ID(XXXX,-Gen_ID(XXXX,0)); 倒扣回去,當預儲函數中判斷日期不同時。
墨水就一點點,擠不出來,就暫時寫到這...。
結論: 在單機版開發上不建議使用嵌入式 FireBird,太容易資料損壞。雖然可以裝 UPS 不斷電解決,但這樣的東西是比較沒有商機。
純參考。
最後轉向學習 SQLite 中,繼續測試。...
編輯記錄
RootKit 重新編輯於 2009-04-16 00:59:02, 註解 在不同電腦上,效率會提升一半以上。‧
RootKit 重新編輯於 2009-04-16 01:01:30, 註解 排版‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-16 08:26:14 IP:210.64.xxx.xxx 訂閱
感謝分享!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-16 09:47:33 IP:118.169.xxx.xxx 訂閱
感謝分享 ^_^
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-18 15:10:50 IP:59.127.xxx.xxx 訂閱
我們公司目前提供的 免費版 [必利得進銷存單機版][必利得進銷存區域網路版][必利得總帳會計]都是用FIREBIRD當成
資料庫後台,單機版就是用嵌入式 FireBird,區網版用 firdbire supper server。
對樓上的說法,有點看法:

FB在POST的當下會驅動硬碟,寫入資料,如果強制關閉電源,當然會造成資料庫毀損,
但是那是因為硬碟的讀寫頭正在對檔案寫入中,而不是post沒有commit 造成的。
其實不管是哪種軟體(MS-SQL,word,excel,notepad...),如果在存檔時且硬碟正在作寫入動作時,
你強制關閉電源我想一定會造成檔案毀損,不是嗎?
一般正常情況下,資料庫軟體操作時只有POST及COMMIT時會對硬碟有寫入動作,
假設你的系統clients數很多,且不斷的對FB server 新增紀錄,Server又不用UPS,
且常常喜歡動手把電源拔掉,那我想你不是找你的ERP廠商麻煩,就是和你的老闆有不共載天的仇?

我們公司從2002年起就用FB server 當所有軟體產品的後台,
印象中還沒有因為斷電,造成資料庫毀損的案例發生(當然也希望永遠不會發生)。

------
Kadee/BigRed Ent.
www.tw165.com
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-18 21:52:59 IP:122.126.xxx.xxx 訂閱
考慮的觀點有:

1. 實驗發現 FireBird 在新增記錄時,突然關閉電源是不會損壞。
只有當處於修改狀態下,每發必中,突然關機損壞。
而且很奇怪的現象,假設有 5000 筆紀錄,修改到 1000 筆紀錄時突然關機之後的資料就會損壞。
這還是 GFix 修完的後果。

2. 據說 Server版 比 嵌入式 在這方面會比較好一點。實際上,我尚未驗證過。

3. 其次我認為做為一個強大的資料庫,最好具備對突發性故障只要不是硬碟物理損壞最起碼有一定幅度的恢復機制。
尤其面對的是中小型企業或一般用戶(套裝軟體),認知上會比較差的,按 Reset 或直接關機時常有的事。
我要說的是我對 FireBird 事務修改突然性關機會造成 100% 機率損壞,是不滿的。機率一半至少還可以接受。
既使損壞,也能讓我修復吧!
當然我實際模擬的狀況,是比較嚴苛的。

4. SQLite 據說在這方面比 FireBird 優秀,實際狀況我還在測試。...
有實際的報告,會公布出來。

最後,我還沒有放棄 FireBird ,它的特性是我所喜歡的。正所謂愛之深責之切啊~
當我把 SQLite 繞完一圈後再回來做決定。

當然以上是以免費資料庫作考慮對象。


===================引 用 kadee 文 章===================
我們公司目前提供的 免費版 [必利得進銷存單機版][必利得進銷存區域網路版][必利得總帳會計]都是用FIREBIRD當成
資料庫後台,單機版就是用嵌入式 FireBird,區網版用 firdbire supper server。
對樓上的說法,有點看法:

FB在POST的當下會驅動硬碟,寫入資料,如果強制關閉電源,當然會造成資料庫毀損,
但是那是因為硬碟的讀寫頭正在對檔案寫入中,而不是post沒有commit 造成的。
其實不管是哪種軟體(MS-SQL,word,excel,notepad...),如果在存檔時且硬碟正在作寫入動作時,
你強制關閉電源我想一定會造成檔案毀損,不是嗎?
一般正常情況下,資料庫軟體操作時只有POST及COMMIT時會對硬碟有寫入動作,
假設你的系統clients數很多,且不斷的對FB server 新增紀錄,Server又不用UPS,
且常常喜歡動手把電源拔掉,那我想你不是找你的ERP廠商麻煩,就是和你的老闆有不共載天的仇?

我們公司從2002年起就用FB server 當所有軟體產品的後台,
印象中還沒有因為斷電,造成資料庫毀損的案例發生(當然也希望永遠不會發生)。
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-18 22:41:02 IP:118.167.xxx.xxx 未訂閱
感謝分享+1

另外想請教,SQLite是用什麼方式做連結的呢?
我在DBX v.s. SQLite的場合上作動並不是很正常(首當其衝的就是refresh後會抓不到資料)

期待RootKit大的研究心得 :D

===================引 用 RootKit 文 章===================
--43--

4. SQLite 據說在這方面比 FireBird 優秀,實際狀況我還在測試。...
有實際的報告,會公布出來。
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-21 22:15:56 IP:122.126.xxx.xxx 訂閱
SQLite 連結方式有很多ASQLite 、Zeos 等免費開源元件。
我現在正開始學習,呵呵,不能說是研究。....

目前已解決加密 SQlite 問題,已經開始測試。
不過部分參數有可能要調整,不然目前看來效率非常差。

感謝關注與鼓勵,不然快沒力啦....

===================引 用 GrandRURU 文 章===================
感謝分享 1

另外想請教,SQLite是用什麼方式做連結的呢?
我在DBX v.s. SQLite的場合上作動並不是很正常(首當其衝的就是refresh後會抓不到資料)

期待RootKit大的研究心得 :D

===================引 用 RootKit 文 章===================
--43--

4. SQLite 據說在這方面比 FireBird 優秀,實際狀況我還在測試。...
有實際的報告,會公布出來。
mypigbaby
高階會員


發表:11
回覆:168
積分:155
註冊:2006-07-20

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-04-22 08:14:15 IP:203.73.xxx.xxx 訂閱
請問firebird該如何設定連線呢?
豬寶寶上次try了好久,就是連不起來

同時也期待您的SQILTE經驗^^
===================引 用 RootKit 文 章===================
SQLite 連結方式有很多ASQLite 、Zeos 等免費開源元件。
我現在正開始學習,呵呵,不能說是研究。....

目前已解決加密 SQlite 問題,已經開始測試。
不過部分參數有可能要調整,不然目前看來效率非常差。

感謝關注與鼓勵,不然快沒力啦....

===================引 用 GrandRURU 文 章===================
感謝分享 1

另外想請教,SQLite是用什麼方式做連結的呢?
我在DBX v.s. SQLite的場合上作動並不是很正常(首當其衝的就是refresh後會抓不到資料)

期待RootKit大的研究心得 :D

===================引 用 RootKit 文 章===================
--43--

4. SQLite 據說在這方面比 FireBird 優秀,實際狀況我還在測試。...
有實際的報告,會公布出來。
kadee
高階會員


發表:11
回覆:141
積分:165
註冊:2002-03-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-04-23 15:02:54 IP:59.127.xxx.xxx 訂閱
你要用那個東東連?

===================引 用 mypigbaby 文 章===================
請問firebird該如何設定連線呢?
豬寶寶上次try了好久,就是連不起來

同時也期待您的SQILTE經驗^^
===================引 用 RootKit 文 章===================
SQLite 連結方式有很多ASQLite 、Zeos 等免費開源元件。
我現在正開始學習,呵呵,不能說是研究。....

目前已解決加密 SQlite 問題,已經開始測試。
不過部分參數有可能要調整,不然目前看來效率非常差。

感謝關注與鼓勵,不然快沒力啦....

===================引 用 GrandRURU 文 章===================
感謝分享 1

另外想請教,SQLite是用什麼方式做連結的呢?
我在DBX v.s. SQLite的場合上作動並不是很正常(首當其衝的就是refresh後會抓不到資料)

期待RootKit大的研究心得 :D

===================引 用 RootKit 文 章===================
--43--

4. SQLite 據說在這方面比 FireBird 優秀,實際狀況我還在測試。...
有實際的報告,會公布出來。
------
Kadee/BigRed Ent.
www.tw165.com
boyman
一般會員


發表:8
回覆:13
積分:9
註冊:2004-05-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-04-28 13:16:25 IP:60.249.xxx.xxx 訂閱
請問,Firebird 的  Shadow 可靠嗎?
像修正時突然關機就損壞,如果用 Shadow 不曉得是否也會造成損壞?
編輯記錄
boyman 重新編輯於 2009-04-28 16:20:25, 註解 無‧
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-04-29 19:55:04 IP:122.126.xxx.xxx 訂閱
沒錯!若是使用自動影子。發生損壞時也一併壞掉了。

===================引 用 boyman 文 章===================
請問,Firebird 的 Shadow 可靠嗎?
像修正時突然關機就損壞,如果用 Shadow 不曉得是否也會造成損壞?
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-05-04 22:07:42 IP:122.126.xxx.xxx 訂閱
SQLITE  加密版 測試數據(ZEOS SQLite)內存模式
===========================
PRAGMA synchronous = 0 OFF 關閉同步寫入

插入 50000 筆資料,分5000筆一次提交,費時 79,093 豪秒
插入 50000 筆資料(每次都Commit),費時 143,750 豪秒
修改 50000 筆資料(每次都Commit),費時 119,046 豪秒

PRAGMA synchronous = 1 NORMAL 正常

插入 50000 筆資料,分5000筆一次提交,費時 78,672 豪秒
插入 50000 筆資料(每次都Commit),費時 715,641 豪秒
修改 50000 筆資料(每次都Commit),費時 540,078 豪秒

PRAGMA synchronous=2 FULL
插入 50000 筆資料(每次都Commit),費時 713,125 豪秒

以上述看來,SQLITE 並不會比 FIREBIRD 快。不知道網路上所傳言SQLITE 很快是依據何種論點。

ACCESS 2000 (ADO)
===========================
插入 50000 筆資料,分5000筆一次提交,費時 273,875 豪秒
插入 50000 筆資料(每次都Commit),費時 348,500 豪秒
修改 50000 筆資料(每次都Commit),費時 295,156 豪秒

查詢比較:
===========================
返回所有紀錄 SQLite 300,000 筆紀錄,查詢費時 8,469 豪秒。
返回所有紀錄 ACCESS 150,000 筆紀錄,查詢費時 1,500 豪秒
返回所有紀錄 FIREBIRD 500,000 筆紀錄,查詢費時 6,468 豪秒

主要資料筆數不同,看起來不能客觀僅能參考。大體上查詢速度都是差不多的。
應該都受限於硬體 IO 的讀取速度。

# 測試 SQLITE 穩定性?
無論是在哪一種模式(synchronous),新增或修改資料,在突然關機必定資料損壞。而且還沒有修復工具。不知道網路上所傳 SQLITE 很強大,是強在哪裡?
怎麼跟我測的不太一樣。見鬼了...

反而 ACCESS 在幾次測試下,都還能正常運作。

最後個人認為:
SQLITE 的優點在於短小精幹,僅需一個DLL 。資料檔案也很小不會像 FIREBIRD 極速肥大裝滿一堆垃圾。
SQLITE 加密版安全性也很夠。缺點容易混淆的資料欄位型態、不支援Stored Proecdure、要避開不支援的SQL 語法。

FIREBIRD 的SuperServer 效率比嵌入式還差,以本地而言。容易檔案損壞部分,開發的系統必須要著重這一部份。
像是加入手動影子及資料庫修復功能,可能可以改善到令人接受的程度。
最重要要視所開發系統的性質而定,來選擇最有利的資料庫。

PS. 加密版 SQLITE 使用免費的 wxSQLite3。
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-07-16 16:54:52 IP:203.75.xxx.xxx 未訂閱
我也來補一下我用DBX1.0的測試結果好了
一開始先來簡單一點的好了,利用stringlist的資料共521筆,計算存到table的時間:
02.41 s (同一事務提交)
17.03 s (每筆提交)

再來就跟上面的一樣測試50000筆的存檔
0254.01 s(同一事務提交)
3968.41 s(每筆提交)

嗯……就當作我沒做過這樣的測試好了~~~(逃)

另外,對於「Post_Event」,不知道它的使用場合為何?能介紹一下嗎?
編輯記錄
GrandRURU 重新編輯於 2009-07-17 09:43:14, 註解 無‧
GrandRURU 重新編輯於 2009-07-23 11:57:15, 註解 無‧
系統時間:2024-11-13 19:27:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!