blogspot.com-GA4

星期二, 9月 30, 2008

ODBC, OLEDB, ADO 的差異

http://gordonliwei.spaces.live.com/Blog/cns!CCE1F10BD8108687!2629.entry
作者:李維 Delphi專家
重點:ODBC, OLEDB, ADO 的差異


在我的認知中OLEDB應該不可能比ODBC快,為什麼?這是一個故事,也是ODBC,OLEDB,ADO和dbExpress各自發展的原因,因此我們需要對於這些資料存取技術的背景有一個簡單的瞭解。

ODBC當初是MS為了在Window下提供一個共通的資料存取技術而發展出來的,目的是突破當時三大資料庫廠商Oracle,Sybase和Informix對於MS的SQL Server的圍堵,此外MS也想藉由這個共通的資料存取技術幫助MS Access擊倒Lotus和Approach,因此最早的ODBC的策略是提供一個最小公約數API,讓一個標準可以存取所有的資料庫,因此在ODBC的初期ODBC的效率很緩慢,因為除了實作技術不成熟之外,當時MS SQL Server的功能也不好,因此以SQL Server為中心思想發展出來的最小公約數ODBC在存取其他資料庫時簡直慢的不想話,這也是為什麼後來Borland發展出了BDE/IDAPI之後在功能和效率方面都比ODBC好上一大截的原因。但是當MS Server SQL逐漸成熟,ODBC的實作技術也慢慢成熟之後,以最小公約數為發展中心的ODBC因為功能最簡單,因此負荷最小,到了最後ODBC的效率是最好的資料存取之一。

OLEDB是當時MS想把COM/DCOM/COM+技術推為Windows平台的唯一技術時發展出來的,如此一來在Window平台所有的通訊,資料存取和元件都以COM/DCOM/COM+為核心,因此一度Borland也準備以COM/DCOM/COM+發展IDE,資料存取等。MS當時為了這個原因,因此有了OLEDB,但是舊的ODBC怎麼辦? 因此又發展出了ODBC和OLEDB Adapter的技術,讓ODBC也可以執行在COM/DCOM/COM+的世界,讓資料存取端認為ODBC也是OLEDB。OLEDB為什麼不會比ODBC快? 因為OLEDB功能比較多,而且OLEDB是以Ole Automation封裝傳遞的資料,負荷比ODBC大,因此ODBC應該會比較快。

至於ADO則是後來MS為MS Access,MS SQL Server特別在Windows平台發展出來的存取技術,因為當時由於Internet/Intranet的沖擊,MS的COM/DCOM/COM+不適合使用在Internet/Intranet上,因此MS逐漸準備放棄COM/DCOM/COM+,這也是OLEDB的長日將盡之日,ADO接手演出之時。ADO和ODBC不同的地方是,ADO再也不是使用最小公約數為中心,而是完全以MS的資料庫為核心,這也是為什麼當ADO推出後其他廠商並不熱衷支援ADO,我記得當時Oracle拒絕推出ADO For Oracle,MS迫不得已自己為Oracle寫了ADO驅動程式,但是又慢臭蟲又多,而Borland也決定繼續發展BDE/IDAPI,只是為ADO做簡單的封裝處理,但Delphi/BCB仍然以BDE/IDAPI為核心資料存取技術。

由於ADO不是使用最小公約數為中心,因此功能比ODBC多太多了,例如資料連結池,執行緒池,可分段存取資料,資料存取到用戶端時不是把所有記錄中的資料存取到用戶端,而是只把Key存取到用戶端,一旦當用戶端實際需要整筆資料時才藉由Key把資料存取到用戶端。因此如果只是簡單的單一用戶端存取資料測試,ADO不一定會比ODBC快,但是應該差不多,不過在實際的應用中,ADO應該是比ODBC整體效率快,但是記得ADO是為了MS的資料庫而生的,因此如果是使用ADO在其他廠商資料庫上則不一定。這是為什麼一些資料庫管理工具如果是管理多種不同的後端資料庫,那麼大多仍然是使用ODBC,為什麼? 因為簡單,因此穩定一點,所以快一點。例如Embarcadero的產品就是使用ODBC來管理後端多種資料庫。

OK,討論到這裡你應該知道ODBC,OLEDB和ADO的使用時機了。

現在回到dbExpress,dbExpress是為了跨平台發展出來的資料存取技術,不是為了特定的資料庫,也不是只為了Window 32平台。dbExpress可以執行在Win32,.NET,Win64,Linux,可以存取MS,Oracle等以及CodeGear自己的InterBase和BlackfishSQL。而dbExpress是結合跨平台和一些目前用戶端先進的資料存取概念為中心,例如dbExpress也提供連結池,執行緒池等。

OK,因此如果你使用dbExpress和ADO來比較存取MS的資料庫,那麼一定是ADO快一點,為什麼? 因為ADO是為了MS的資料庫而生。
如果你使用dbExpress和ODBC進行單一簡單的資料存取比較,那麼ODBC快一點,因為ODBC功能少,負荷少。但是在比較多的用戶端進行比較複雜的資料處理時,dbExpress就比ODBC表現的好多了,這和ADO比ODBC是類似的。
如果你想使用一種統一的資料存取技術,不管對於什麼平台,什麼資料庫都有良好的執行速度,因此當你改變資料庫時你的執行效率仍然很穩定,那麼dbExpress是王者。
ODBC,ADO和OLEDB已停止開發,因此如果你想使用一種仍然在開發之中而且能夠應用在未來Win64和多核心,多執行緒的世界,那麼dbExpress是比較好的解決方案。

沒有留言: