本文譯自 《A Comparative Study on the Performance of the Top DBMS Systems 》Youssef Bassil LACSC – Lebanese Association for Computational Sciences Registered under No. 957, 2011, Beirut, Lebanon
摘要
資料庫管理系統是當今将資料組織成可以搜尋和更新的集合地最可靠的手段。然而,市場上有許多DBMS系統,每個系統在可靠性、可用性、安全性和性能方面都有其優點和缺點。本文将對頂級DBMS系統的性能進行比較研究。它們主要是MS SQL Server 2008、Oracle 11g、IBM DB2、MySQL 5.5和MS Access 2010。測試的目的是在測試的5個不同的DBMS系統上執行不同複雜程度的SQL查詢。這将為建立一個頭對頭的比較評估鋪平道路,在測試完成後顯示每個DBMS的平均執行時間、記憶體使用率和CPU使用率。
關鍵詞
DBMS,性能研究,SQL Server,MySQL,Oracle,DB2,Access
-
引言
DBMS是資料庫管理系統的簡稱,在大多數需要存儲、檢索、查詢數字資料的現實項目中發揮着重要作用。例如,動态網站、會計資訊系統、工資系統、庫存管理系統都依靠内部資料庫作為容器來存儲和管理其資料[1]。如今,許多軟體開發公司都在開發和生産DBMS系統,如果是免費和開源的DBMS,成本為零元,如果是專有的DBMS,成本則在數千元美元。特别是,每個DBMS都有一系列不同的功能和非功能特性和規格,每個特性和規格都有其優勢和劣勢。其中之一是性能,它決定了一個DBMS處理和執行查詢的速度。本文從性能角度出發,對目前市場上五種不同的DBMS進行比較研究。它們分别是MS SQL Server 2008[2]、Oracle 11g[3]、IBM DB2[4]、MySQL 5.5[5]和MS Access 2010[6]。為此,我們制作了多個不同複雜程度的SQL查詢,并針對這些著名的DBMS進行了測試。此外,我們還使用了一個性能基準來測量每個執行的SQL查詢的執行時間,此外還有CPU使用率、記憶體使用率、虛拟記憶體使用率和線程數。在适當的時候,繪制了一個頭對頭的比較,展示了被測試的不同DBMS之間的性能差異。
-
背景
本節讨論了被測試的不同DBMS的曆史、版本和功能。它們分别是MS SQL Server 2008、Oracle 11g、IBM DB2、MySQL 5.5和MS Access 2010。
2.1. MS SQL Server 2008
Microsoft SQL Server是微軟公司生産的關系型資料庫管理系統(RDBMS),它的主要查詢語言是Transact-SQL,是微軟和Sybase都使用的ANSI/ISO标準結構化查詢語言(SQL)的實作。Microsoft SQL Server支援原子、一緻、隔離和持久的事務。它包括對資料庫鏡像和叢集的支援。一個SQL伺服器叢集是一個相同配置的伺服器的集合,它有助于在多個伺服器之間配置設定工作負載。SQL server還支援分布式資料庫的資料分區,此外,資料庫鏡像允許根據某些預定義的觸發器,在SQL Server的另一個執行個體上建立資料庫内容的鏡像,以及事務日志[7]。
2.2. Oracle 11g
Oracle資料庫(通常稱為Oracle RDBMS或簡稱為Oracle),是Oracle公司釋出的關系型資料庫管理系統(RDBMS),它包括至少一個應用程式的執行個體,以及資料存儲。一個執行個體包括一組作業系統程序和與存儲互動的記憶體結構。除了存儲之外,資料庫還包括線上重做日志,它儲存着事務性的曆史。程序又可以将線上重做日志歸檔為歸檔日志,為資料恢複和某些形式的資料複制提供基礎。Oracle RDBMS在邏輯上以表空間的形式存儲資料,在實體上以資料檔案的形式存儲資料。在實體層面上,資料檔案由一個或多個資料塊組成,不同資料檔案之間的資料塊大小可以不同。Oracle的特點是資料字典、索引和叢集。10g以後的版本,引入了網格計算功能,執行個體應用可以使用網格中另一個節點的CPU資源[8]。
2.3. IBM DB2
DB2是IBM的關系型資料庫管理系統之一,可運作在Unix、Windows或Linux伺服器機器上。DB2可以通過指令行或GUI界面進行管理。指令行界面需要更多的産品知識,但可以更容易地進行腳本化和自動化。GUI是一個多平台的Java用戶端,包含各種适合新手使用者的向導。DB2同時支援SQL和XQuery。DB2具有XML資料存儲的原生實作,XML資料被存儲為XML,以便使用XQuery更快地通路。DB2還支援內建到Eclipse和Visual Studio .NET內建開發環境中。DB2 DBMS的一個重要特點是錯誤處理,在DB2程式内使用SQL通信區結構,在每次調用SQL語句的API後,向應用程式傳回錯誤資訊[9]。
2.4. MySQL 5.5
MySQL是一個免費的、開源的、多線程的、多使用者的SQL資料庫管理系統,其安裝量超過1000萬。基本程式以伺服器的形式運作,提供多使用者對多個資料庫的通路。MySQL包括ANSI SQL 99的廣泛子集,以及擴充、跨平台支援、存儲過程、觸發器、遊标、可更新視圖和X/Open XA分布式事務處理支援。此外,它還支援兩階段送出引擎、獨立的存儲引擎、SSL支援、查詢緩存、每個從站一個主站、每個主站多個從站的複制、嵌入式資料庫庫以及使用InnoDB叢集引擎的ACID相容[10]。
2.5. MS Access 2010
Microsoft Office Access的前身是Microsoft Access,是微軟公司推出的關系型資料庫管理系統,它将關系型的Microsoft Jet資料庫引擎與圖形化的使用者界面和軟體開發工具相結合。它是2010年微軟Office系統中的一員。從程式員的角度來看,Access的一個好處是它與SQL查詢的相對相容性。與完整的RDBMS不同,Jet Engine缺乏資料庫觸發器和存儲過程。盡管如此,它提供了一種特殊的文法,允許建立帶有參數的查詢,其方式看起來就像建立存儲過程一樣,但這些過程僅限于每個過程中的一條語句。微軟Access确實允許表格中包含在對底層表進行更改時觸發的代碼,而且在Access中使用直通查詢和其他技術來運作支援這些的RDBMS中的存儲過程是很常見的。MS Access被小型企業、大公司的部門以及業餘程式員用來建立臨時定制的桌面系統,以處理資料的建立和操作。一些專業的應用開發人員使用Access進行快速的應用開發,特别是用于建立原型和獨立的應用程式,作為路上銷售員的工具[11]。
-
測試評估
3.1. 受測的資料庫管理系統
通常有5個被測試的DBMS,其中4個是客戶/伺服器DBMS,适合建立中大型資料庫,1個是獨立的DBMS,适合建立小規模的臨時資料庫。它們分别是MS SQL Server 2008、Oracle 11g、IBM DB2、MySQL 5.5和MS Access 2010。MS Access是唯一的非客戶/伺服器資料庫管理系統。
3.2. 測試平台
測試采用雙處理器,Intel Xeon E5649,6x2核心,處理器,時鐘頻率為2.53GHz,随機通路記憶體(RAM)為32GB,二級存儲容量為2TB。作業系統為MS Windows Server 2008,64位。
3.3. 測試儀
測試儀是在.NET架構4.0下使用C#.NET開發的計算機應用程式。它執行兩個任務。第一個任務是在測試執行之前,自動在資料庫表中填充1,000,000行。第二個是執行實際的SQL查詢。圖1顯示了測試器的主GUI界面。
頂級資料庫管理系統的性能比較研究(論文翻譯) 3.4. 衡量基準
測試儀實作了一個内置的計時器,以毫秒為機關測量從開始執行一個特定的SQL查詢到結束的執行時間。關于記憶體的消耗和利用,使用了MS Windows任務管理器(WTM)工具,該工具已經随同MS Windows作業系統的所有版本[12]。圖2顯示了WTM工具的界面。
頂級資料庫管理系統的性能比較研究(論文翻譯) 3.5. 資料庫設計
基本上,在所有不同的資料庫管理系統上測試的資料庫包括15個不同的關系或通過關系聯系在一起的表。它是一個在不同的五個被測試的DBMS下實作的關系模型資料庫。該資料庫适合一個商業零售系統。它包括一個用于建立發票、收據和采購訂單的前端系統和一個用于管理物品庫存的後端系統。圖3描述了被測試資料庫的邏輯設計。
頂級資料庫管理系統的性能比較研究(論文翻譯) -
測試過程
在測試的五個不同的DBMS上執行了不同的SQL查詢。事實上,這些查詢的複雜程度不同,從簡單類型到非常複雜的類型都有。值得注意的是,在開始測試過程之前,所有五個資料庫都被填充了1,000,000條虛拟資料。
查詢#1
這是一個非常簡單的查詢,其任務是在沒有任何條件或連接配接的情況下檢索行。
SELECT * FROM Item;
頂級資料庫管理系統的性能比較研究(論文翻譯) 查詢#2
這個查詢使用了複雜的條件與邏輯運算符的組合。
SELECT * FROM Invoice
WHERE Invoice.in_id > 50 AND Invoice.in_date > 1/1/2006 AND Invoice.in_date<1/1/2007 AND Invoice.in_description LIKE ‘%ohp%’ AND Invoice.in_totalinletter LIKE ‘%USD’ AND Invoice.in_total = Invoice.in_totalafterdiscount AND Invoice.in_total <> 100 OR NOT Invoice.in_cu_id >= 5 AND Invoice.in_id BETWEEN 1 AND 10000 OR Invoice.in_id > 49+1 AND Invoice.in_total+33 <> 5 AND Invoice.in_total = - Invoice.in_totalafterdiscount * 2 ;
頂級資料庫管理系統的性能比較研究(論文翻譯) 查詢#3
此查詢用于測試不同表之間的連接配接操作。
SELECT Customer.cu_id , Invoice.in_id , InvoiceDetail.ind_qty , Item.it_serialnumber , Movement.mo_description , Movement_Details.mo_it_id , Users.us_id , Users.us_code , PurchaseOrder.po_description , Supplier.su_name FROM Customer , Invoice , InvoiceDetail , Item , Movement , Movement_Details , Users , PurchaseOrder , Supplier WHERE Supplier.su_name = “Mike” AND Customer.cu_id = Invoice.in_cu_id AND InvoiceDetail.ind_in_id = Invoice.in_id AND InvoiceDetail.ind_it_id = Item.it_id AND Movement_Details.mod_mo_id = Movement.mo_id AND Movement.mo_us_id = Users.us_id AND PurchaseOrder.po_us_id =Users.us_id AND PurchaseOrder.po_us_id = Users.us_id AND PurchaseOrder.po_su_id AND Supplier.su_id ;
頂級資料庫管理系統的性能比較研究(論文翻譯) 查詢#4
此查詢用于測試每個DBMS的排序操作。
SELECT Customer.cu_id , Customer.cu_name , Customer.cu_telephone , Customer.cu_fax , Customer.cu_email FROM Customer ORDER BY Customer.cu_id , Customer.cu_name DESC , Customer.cu_telephone DESC, Customer.cu_fax , Customer.cu_email DESC ;
頂級資料庫管理系統的性能比較研究(論文翻譯) 查詢#5
這個查詢的目的是通過執行不同的算術函數來測試DBMS的計算能力。
SELECT SUM(Invoice.in_total) , AVG(Invoice.in_totalafterdiscount) , MAX(Invoice.in_total) , COUNT(Customer.cu_id) , SUM(InvoiceDetail.ind_qty) FROM Customer , Invoice , InvoiceDetail WHERE Customer.cu_id = Invoice.in_cu_id AND Invoice.in_id = InvoiceDetail.ind_in_id GROUP BY Invoice.in_id ;
頂級資料庫管理系統的性能比較研究(論文翻譯) 查詢#6
此查詢在前面的查詢條件中增加了HAVING子句。
SELECT SUM(Invoice.in_total) , AVG(Invoice.in_totalafterdiscount) , MAX(Invoice.in_total) , COUNT(Customer.cu_id) , SUM(InvoiceDetail.ind_qty) FROM Customer , Invoice , InvoiceDetail WHERE Customer.cu_id = Invoice.in_cu_id AND Invoice.in_id = InvoiceDetail.ind_in_id GROUP BY Invoice.in_id HAVING COUNT(Invoice.in_id)>0 AND SUM(Invoice.in_total) = AVG(Invoice,in_totalafterdiscount) ;
頂級資料庫管理系統的性能比較研究(論文翻譯) 查詢#7
這個查詢可以測試每個DBMS在使用内部嵌套SELECTs時的能力。
SELECT Customer.cu_name FROM Customer WHERE Customer.cu_name = (SELECT Users.us_name FROM Users WHERE Users.us_class = “administrator”) AND Customer.cu_fax = (SELECT Supplier.su_fax FROM Supplier WHERE Supplier.su_phone = “123456”) AND Customer.cu_email = (SELECT Supplier.su_email FROM Suppliers WHERE Supplier.su_address LIKE “%h%”) ;
頂級資料庫管理系統的性能比較研究(論文翻譯) 查詢#8
現在是終極測試,它将把之前的所有查詢合并成一個單一的原子SQL查詢。
SELECT Customer.cu_id , Invoice.in_id , InvoiceDetail.ind_qty , Item.it_serialnumber , Movement.mo_description , Movement_Details.mo_it_id , Users.us_id , Users.us_code , PurchaseOrder.po_description , Supplier.su_name , SUM(Invoice.in_total) , AVG(Invoice.in_totalafterdiscount) , MAX(Invoice.in_total), COUNT(Customer.cu_id) , SUM(InvoiceDetail.ind_qty) FROM Customer , Invoice , InvoiceDetail , Item , Movement , Movement_Details , Users , PurchaseOrder , Supplier WHERE Invoice.in_id > 50 AND Invoice.in_date > 1/1/2006 AND Invoice.in_date < 1/1/2007 AND Invoice.in_description LIKE ‘%ohp%’ AND Invoice.in_totalinletter LIKE ‘%USD’ AND Invoice.in_total = Invoice.in_totalafterdiscount AND Invoice.in_total <> 100 OR NOT Invoice.in_cu_id >=5 AND Invoice.in_id BETWEEN 1 AND 10000 OR Invoice.in_id > 49+1 AND Customer.cu_name = (SELECT Users.us_name FROM Users WHERE Users.us_class = “administrator”) AND Customer.cu_fax = (SELECT Supplier.su_fax FROM Supplier WHERE Supplier.su_phone = “123456”) AND Customer.cu_id = Invoice.in_cu_id AND InvoiceDetail.ind_in_id = Invoice.in_id AND InvoiceDetail.ind_it_id = Item.it_id AND Movement_Details.mod_mo_id = Movement.mo_id AND Movement.mo_us_id = Users.us_id AND PurchaseOrder.po_us_id =Users.us_id AND PurchaseOrder.po_us_id = Users.us_id AND PurchaseOrder.po_su_id AND Supplier.su_id ; ORDER BY Customer.cu_id , Customer.cu_name DESC , Invoice.in_id DESC, Users.us_name , Invoice.in_description DESC ; GROUP BY Customer.cu_id , Invoice.in_id , InvoiceDetail.ind_qty , Item.it_serialnumber , Movement.mo_description , Movement_Details.mo_it_id , Users.us_id , Users.us_code , PurchaseOrder.po_description , Supplier.su_name HAVING COUNT(Invoice.in_id)>0 AND SUM(Invoice.in_total) = AVG(Invoice,in_totalafterdiscount) ;
頂級資料庫管理系統的性能比較研究(論文翻譯) 查詢#9
此查詢測試被測DBMS執行複雜條件的UPDATE語句的能力。
UPDATE Item SET Item.it_price = Item.it_price * 0.1 AND Item.it_qtity = 10 AND Item.it_description = “TV” WHERE Item.it_id > 10 AND Item.it_expirydate > 1/1/2007 AND Item.it_expirydate < 1/1/2008 AND Item.it_manufacturer = “Philips” OR Item.it_manufacturer = “Sharp” OR Item.it_manufacturer = “Toshiba” ;
頂級資料庫管理系統的性能比較研究(論文翻譯) 查詢#10
最後一個查詢在標明的DBMS上執行DELETE查詢。
DELETE FROM Invoice WHERE Invoice.in_date > 1/1/2006 AND Invoice.in_date < 1/1/2007 AND Invoice.in_description LIKE ‘%vtt%’ AND Invoice.in_totalinletter LIKE ‘%USD’ AND Invoice.in_total = Invoice.in_totalafterdiscount AND Invoice.in_ totalafterdiscount <> 33.1 OR NOT Invoice.in_cu_id >= 5 AND Invoice.in_id BETWEEN 1 AND 10000 OR Invoice.in_id < 71/2 AND Invoice.in_total+33 <> 5 AND Invoice.in_total = Invoice.in_totalafterdiscount – 112 ;
頂級資料庫管理系統的性能比較研究(論文翻譯) -
結果&結論
測試的結果用圖表和統計直方圖來表示。顯然,沒有最終的赢家。圖表清楚地表明,IBM DB2是速度最快的DBMS,然而MS Access的CPU使用率低于其他DBMS,IBM DB2是消耗主記憶體最多的DBMS。圖4代表平均執行時間,圖5代表平均CPU使用率,圖6代表平均記憶體占用率。
頂級資料庫管理系統的性能比較研究(論文翻譯) 頂級資料庫管理系統的性能比較研究(論文翻譯) 頂級資料庫管理系統的性能比較研究(論文翻譯)