顶级数据库管理系统的性能比较研究(论文翻译)
本文译自 《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代表平均内存占用率。
相关文章:

debugger 调试的一些经验
1. 如果没有firebug , 可以用firebug-lite.js 内嵌的调试方式。 2. console.log 不是所有浏览器都支持console.log 在IE或者没有调试窗口的浏览器中,console.log会undefined var db {switch:true} db.log function(){if(!this.switch) return ;if( typ…

spring boot 2.0 源码分析(二)
在上一章学习了spring boot 2.0启动的大概流程以后,今天我们来深挖一下SpringApplication实例变量的run函数。 先把这段run函数的代码贴出来: /*** Run the Spring application, creating and refreshing a new* {link ApplicationContext}.* param args…

四月青少年编程组队学习(Python一级)Task01
电子学会 软件编程(Python)一级 组队学习 试题来源 青少年软件编程(Python)等级考试试卷(一级)【2020.06】青少年软件编程(Python)等级考试试卷(一级)【202…

hung-yi lee_p1_机器学习是什么
文章目录1.你想找什么样的函式2.怎么告诉机器你想找什么样的函式3.机器怎么找出你想要的函式机器学习就是自动找函式1.你想找什么样的函式 Regression(回归)——想找的函式输出是一个数值 Binary Classification——想找的函式输出是Yes or No(Pos or Neg) Multi-class Classi…

excel导入SQL脚本
exec sp_configure show advanced options,1 reconfigure exec sp_configure Ad Hoc Distributed Queries,1 reconfigure SELECT * INTO tmp_asset FROM OPENROWSET(Microsoft.Jet.OLEDB.4.0, Excel 8.0;Databased:\Excel数据源\资产印章.xls, SELECT * FROM [Sheet1$]) ; 转…

Hadoop hdfs完全分布式搭建教程
本文转载自:https://www.cnblogs.com/ysocean/p/6965197.html 1、安装环境 ①、四台Linux CentOS6.7 系统 hostname ipaddress subnet mask geteway 1、 master 192.168.146.200 255.255…

四月青少年编程组队学习(Python一级)Task02
电子学会 软件编程(Python)一级 组队学习 试题来源 青少年软件编程(Python)等级考试试卷(一级)【2020.06】青少年软件编程(Python)等级考试试卷(一级)【202…

软件测试知识概述
本篇内容关于【1】缺陷(bug)的类型【2】软件测试与SQA的关系【3】软件测试的七项基本原则【4】将软件测试按照不同标准进行分类【5】软件测试过程模型 缺陷(bug)类型 缺陷可能存在于程序文档(软件) 衡量缺陷的唯一标准是是否符合用户需求 ①功能未实现 ②功能实现了但性能有差异…

Hadoop基础-网络拓扑机架感知及其实现
Hadoop基础-网络拓扑机架感知及其实现 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 一.网络拓扑结构 在本地网络中,两个节点被称为“彼此近邻”是什么意思?在海量数据处理中,…

批量修改图片以及加水印
好久木有来写点什么了.. 前段时间挺忙的. 今天上来分享一个,这几天我给商城图片加水印的代码吧.因为产品编辑那边是先把图片都上传完成了,所以只能做批量修改图片来完成给所有图片加水印的效果. 类似DX、京东效果. 现在正在开发的B2C项目商城: www.oxozoom.com 也希望更多能…

计算机书集下载链接
http://nic.biti.edu.cn/china-pub/ 我在那下了一本:XML高级编程转载于:https://www.cnblogs.com/dyuan/archive/2004/03/12/2966.html

Microsoft PlayReady DRM
支持在 Web 浏览器中使用加密媒体扩展和 Microsoft PlayReady DRM 本文内容 简介实现方法万维网联合会 (W3C) HTML5 加密媒体扩展 (EME) 为网站引入了一项功能,可在不使用插件的情况下播放受数字版权管理 (DRM) 保护的内容。Windows 8.1 上的 Internet Explorer 11 …

Android Binder概述
背景知识为了更好的理解binder,我们要先澄清一下概念,因为Android 基于Linux内核,我们有必要了解相关知识。进程隔离进程隔离是为了保护操作系统进程之间互不干扰而设计的,这个技术是为了避免进程A写入进程B准备的,进程…

如何用Asp判断你的网站的虚拟物理路径
appath方法 < p align"center" > < font size"4" face"Arial" > < b > The Physical path to this virtual website is: < /b > < /font > < font color"#FF0000" size"6" face"Aria…

总结:SQL的优缺点及与NoSQL对比
SQL在这里指的是关系型数据库,NoSQL指元组存储?

关于成功的因素-----谨记
引导语:一个人生活的环境,对他树立理想和取得成就有着重要的影响。坚忍,是成大事者的共同特征。没有足够的知识储备,一个人难以在工作和事业中取得突破性进展,难以向更高地位发展。 【意志力】 意志力是一种…

最常用的Linux命令
基础命令: (一)cd:进入文件目录 cd / #进入Linux根目录 cd ~ #进入当前用户Home目录,例如root用户 cd .. #进入上一层目录(根目录下没有上一层),…

Delphi数据库开发之TTable篇1
既然是说Delphi中的SQL使用,肯定离不开TDataSet派生出来的DataSet控件(应该说类比较确切些),这里我说的DataSet只是一个大类的称呼,并不是特指实际的TDataSet。在众多控件中其实可以根据如何操作数据分为两类。 其中一…

大型数据库入门
本文介绍大型数据库的概念及其性能决定因素,以及如何优化性能。 什么是大型数据库 -没有一个标准定义 -包含非常多元组(数据库行)的数据库,或者占用非常大的物理文件系统存储空间的数据库。 -占据TB量级的磁盘存储,包含数十亿表行。为什么需…

php安装pear和phpunit
php安装pear和phpunit http://hi.baidu.com/zjutxujie/item/7b08761f922df7476926bb2c 安装pear 下载go-pear.phar,放到phproot/pear目录下,地址http://pear.php.net/go-pear.phar。 管理员身份运行cmd,打开phproot,运行php -d p…

ResNets和Inception的理解
ResNets和Inception的理解 ResNet解析

软件体系结构风格(第5-8课时)
摘要:本文给出软件体系结构风格的定义,并介绍几种常用风格:管道过滤器、数据抽象和面向对象组织,基于事件的隐式调用,分层系统,仓库系统,过程控制环路 软件体系结构风格是什么 描述特定系统组织…

C#中调用Windows API时的数据类型对应关系
C#中调用Windows API时的数据类型对应关系 原文 C#中调用Windows API时的数据类型对应关系 BOOLSystem.Int32 BOOLEANSystem.Int32 BYTESystem.UInt16 CHARSystem.Int16 COLORREFSystem.UInt32 DWORDSystem.UInt32 DWORD32System.UInt32 DWORD64System.UInt64 …

linux下安装db2
最近研究了一下在 ubuntu下安装db2的过程,很快就完成安装,特贴出来供大家讨论,如有错误请多多指教。 注意:安装过程请使用root用户,否则会出现安装失败的情况; 安装过程: 准备工作: …

使用 SAX 解析器简化文档处理程序的编写
http://www-900.ibm.com/developerWorks/cn/xml/x-dochan.shtml有时候 SAX 文档处理程序的代码可能变得非常麻烦、结构性差而且难以维护,尤其是对于那些包含多种不同元素的复杂 XML 结构。本文介绍了应对这种问题的设计策略,从而有助于改进代码的质量和可…

软件体系结构风格之C/S,三层C/S,与BS
C/S的物理结构,其发展历程为(1)->(3)->(2),本文接下来要介绍的C/S为(3),即胖客户端瘦服务器,服务器只管数据库,接下来要介绍的三层C/S为(2),即客户端不胖不瘦。 C/S软件体系结构 背景:基于资源不对等࿰…

HDU-2020
绝对值排序 Problem Description输入n(n<100)个整数,按照绝对值从大到小排序后输出。题目保证对于每一个测试实例,所有的数的绝对值都不相等。 Input输入数据有多组,每组占一行,每行的第一个数字为n,接着是n个整数,…

Java归去来第2集:利用Eclipse创建Maven Web项目
一、前言 如果还不了解剧情,请返回第一集的剧情 Java归去来第1集:手动给Eclipse配置Maven环境 二、利用Eclipse创建Maven Web项目 选择File-New-Project 然后选择Maven-Maven Project 选择项目所在的工作空间目录,然后下一步 选择模…

vs2005什么时候能出正式版
2005试用版本出了很久了,不知道什么时候能出正式版,不会真得要推迟到2005年吧。企盼中…… 转载于:https://www.cnblogs.com/playboy2005/archive/2004/09/22/45563.html