SQL Server 和 Oracle 以及 MySQL 有哪些区别

SQL,在这里我理解成SQL Server。三者是目前市场占有率最高(依安装量而非收入)的关系数据库,而且很有代表性。排行第四的DB2(属IBM公司),与Oracle的定位和架构非常相似,就不赘述了。
  1. 如果要说明三者的区别,首先就要从历史入手。
    1. Oracle:中文译作甲骨文,这是一家**的公司,有一个**的大老板Larry Ellision.Ellision 32岁还一事无成,读了三个大学,没得到一个学位文凭,换了十几家公司,老婆也离甲基
      成立于1977年,早期的理论基础,反而来自于一篇IBM的论文“数据的关系模型” 。他而去。开始创业时只有1200美元,却使得Oracle公司连续12年销售额每年翻一番。对于大型共享数据库“【1】。作者CODD选取了关系代数的五种运算,并基于运算,架构了一种新型的数据存储模型。基于这种模型,Oracle成为了一个非常典型的关系数据库。因此也变的严谨,安全,高速,稳定,并且变的越来越庞大。
      由于其诞生早,结构严谨,高可用,高性能等特点,使其在传统数据库应用中大杀四方,金融,通信,能源,运输,零售,制造等各个行业的大型公司基本都是用了甲骨文,早些年的时候,界500强几乎100%都是甲骨文的用户。
    2. MySQL:MySQL的最初的核心思想,主要是开源,简便易用。其开发可追溯至1985年,而第一个内部发行版本诞生,已经是1995年。到1998年,MySQL已经可以支持10中操作系统了,其中就包括win平台。但依然问题多多,如不支持事务操作,子查询,外键,存储过程和视图等功能。下图是一个截止至2006年的数据库市场占有率【2】:
      & amp; lt; img src =" https://pic4.zhimg.com/50/e3b780fc23cec291be3159fe91e4fc3b_hd.jpg" 数据rawwidth = QUOT; 485" 数据rawheight = QUOT; 255" class =" origin_image zh-lightbox-thumb" 宽度= QUOT; 485" 数据原始= QUOT; HTTPS://pic4.zhimg.com/e3b780fc23cec291be3159fe91e4fc3b_r.jpg"&放大器;放大器; GT;图中可以看出,MySQL的的爆发实际是在01,02年,尤其是02年发布的4.0测试版,正式选定的InnoDB作为默认引擎,对事务处理能力及数据缓存能力有了极大的提高。同年4.1版开始支持子查询,至此MySQL的终于蜕变成一个成熟的关系型数据库系统。05年的5.0版本又添加了存储过程,服务端游标,触发器,查询优化以及分布式事务功能,但同年被甲骨文抄了后路时,InnoDB被甲骨文08年收编,MySQL的被太阳收购,09年,甲骨文收购孙了MySQL的和。SQL Server 和 Oracle 以及 MySQL 有哪些区别图中可以看出,MySQL的爆发实际是在01,02年,尤其是02年发布的4.0 Beta版,正式选定InnoDB作为默认引擎,对事务处理能力及数据缓存能力有了极大的提高。同年4.1版开始支持子查询,至此MySQL的终于蜕变成一个成熟的关系型数据库系统。05年的5.0版本又添加了存储过程,服务端游标,触发器,查询优化以及分布式事务功能,但同年被甲骨文抄了后路时,InnoDB被甲骨文08年收编,MySQL的被太阳收购,09年,甲骨文收购了太阳和MySQL的。
      由于MySQL的的早期定位,其主要应用场景就是互联网开发。基本上,互联网的爆发成就MySQL的了,LAMP架构风靡天下。而由于MySQL的更多的的追求轻量,易用,以及早期的事物操作及复杂查询优化的缺失,在传统的数据库应用场景中,份额极少。
    3. SQL Server:一提到SQL Server,大家一般都只想到Microsoft SQL Server,而非Sybase SQL Server.SQL Server最初是由Microsoft,Sybase和Ashton-Tate三家公司拦下的生意,是为IBM(又出现了)公司的OS / 2操作系统开发的。随着OS / 2项目的失败,大家也分道扬镳。微软自然转向自己的win操作系统,作为windows NT软件方案的一部分。而Sybase则专注于Linux / Unix方向的数据库开发
      .MS SQL Server主要面向中小企业。其最大的优势就是在于集成了MS公司的各类产品及资源,提供了强大的可视化界面,高度集成的管理开发工具,在快速构建商业智能(BI )方面颇有建树.MS SQL Server是MS公司在软件集成方案中的重要一环,也为WIN系统在企业级应用中的普及做出了很大贡献。
  2. 应用解词场景
    关于“大型数据库”,并没有严格的界定,有说以数据量为准,有说以恢复时间为准如果综合数据库应用场景来说,大型数据库应用有以下特点:海量数据,高吞吐量;复杂逻辑,高计算量,以及高可用性。从这点上来说,Oracle,DB2就是比较典型的大型数据库,Sybase SQL Server也算是吧。下面分别说明之前三种数据库的应用场景。
    1. Oracle.Oracle的应用,主要在传统行业的数据化业务中,比如:银行,金融这样的对可用性,健壮性,安全性,实时性要求极高的业务;零售,物流这样对海量数据存储分析要求很高的业务此外,高新制造业如芯片厂也基本都离不开甲骨文;电商也有很多使用者,如京东(正在投奔甲骨文),阿里巴巴(计划去甲骨文化)而且由于甲骨文对复杂计算,统计分析的强大支持,在互联网数据分析,数据挖掘方面的应用也越来越多一个典型场景是这样的
      某电信公司(非国内)下属某分公司的数据中心,有4台的Oracle Sun的大型服务器用来安装Solaris操作系统和Oracle并提供计算服务,3台Sun存储磁盘阵列来提供Oracle数据存储,12台IBM小型机,一台Oracle Exadata服务器,一台500T的磁带机用来存储历史数据,圣连接内网,使用。Tuxedo的中间件来保证扩展性和无损迁移建立支 高并发的甲骨文数据库,通过OLTP系统用来对海量数据实时处理,操作,建立高运算量的甲骨文数据仓库,用OLAP系统用来分析营收数据及提供自动报表。总预算约750万美金。
    2. MySQL.MySQL基本是生于互联网,长于互联网。其应用实例也大都集中于互联网方向时,MySQL的高并发存取能力并不比大型数据库差,同时价格便宜,安装使用简便快捷,深受广大互联网公司的喜爱并且由于MySQL的的开源特性,针对一些对数据库有特别要求的应用,可以通过修改代码来实现定向优化,例如SNS,LBS等互联网业务一个典型的应用场景是:。
      某互联网公司,成立之初,仅有电脑数台,通过LAMP架构迅速搭起网站框架。随着业务扩张,市场扩大,迅速发展成为6台戴尔小型机的中型网站。现在花了三年,终于成为垂直领域的最大网站,计划中的数据中心,拥有戴尔机架式服务器40台,总预算20万美金。
    3. MS SQL Server.windows生态系统的产品,好处坏处都很分明。好处就是,高度集成化,微软也提供了整套的软件方案,基本上一套win系统装下来就齐活了。因此,不那么缺钱,但很缺IT人才的中小企业,会偏爱MS SQL Server。例如,自建ERP系统,商业智能,垂直领域零售商,餐饮,事业单位等等。
      1996年,比尔盖茨亲自出手,从Borland挖掘来了大牛Anders,搞定了C#语言。微软02年搞定了http:// ASP.NET。成熟的.NET,Silverlight技术,为MS SQL Server赢得了部分互联网市场,其中就有曾经的全球最大社交网站MySpace,其发展历程很有代表性,可作为一个比较特别的例子【3】。其巅峰时有超过1.5亿的注册用户及每月400亿的访问量。应该算是MS SQL Server支撑的最大的数据应用了。
  3. 架构其实要说执行的区别,主要还是架构的区别正是架构导致了相同的SQL在执行过程中的解释,优化,效率的差异这里只做粗略说明,就不细说了。:
    1. Oracle:数据文件包括:控制文件,数据文件,重做日志文件,参数文件,归档文件,密码文件。这是根据文件功能行进行划分,并且所有文件都是二进制编码后的文件,对数据库算法效率有极大的提高。由于Oracle文件管理的统一性,就可以对SQL执行过程中的解析和优化,指定统一的标准:
      RBO(基于规则的优化器),CBO(基于成本的优化器)
      通过优化器的选择,以及无敌的HINT规则,给与了SQL优化极大的*,对CPU,内存,IO资源进行方方面面的优化。
    2. MySQL:最大的一个特色,就是*选择存储引擎。每个表都是一个文件,都可以选择合适的存储引擎。常见的引擎有InnoDB,MyISAM,NDBCluster等。但由于这种开放插件式的存储引擎,比如要求数据库与引擎之间的松耦合关系。从而导致文件的一致性大大降低。在SQL执行优化方面,也就有着一些不可避免的瓶颈。在多表关联,子查询优化,统计函数等方面是软肋,而且只支持极简单的提示。
    3. SQL Server:数据架构基本是纵向划分,分为:Protocol Layer(协议层),Relational Engine(关系引擎),Storage Engine(存储引擎),SQLOS.SQL执行过程就是逐层解析的过程,其中Relational Engine中的优化器,是基于成本的(CBO),其工作过程跟甲骨文是非常相似的在成本之上也是支持很丰富的HINT,包括:连接提示,查询提示,表提示。 
    4. 作者:孙文亮
      链接:HTTPS://www.zhihu.com/question/19866767/answer/14942009
      来源:知乎
      。著作权归作者所有商业转载请联系作者获得授权,非商业转载请注明出处。



Mysql的与甲骨文的50个区别

      1.有些人说Oracle没有限制,实际上他们说得可能是Oracle不支持LIMIT语法。不过可以rownum虚列来实现,不过会更加麻烦。



  2. Oracle不支持偏移(偏移)语法。


  3. Oracle的复制功能可能比MySQL更加健壮,不过也更加难以配置。


  4.对于多个Master类型的系统,大部分用户都希望你使用更加复杂也更加昂贵的Oracle RAC(虽然可能NDB更加健壮)。


  5. Oracle的分区功能非常健壮,但是它不是内置的,并需要专门为此付费(分区功能是在Enterprise Edition里面是内置的)。


  6.在Linux / Unix上,Oracle并不象Mysql那么方便,很多Linux / Unix发行版默认就会自带Mysql。(我对这一点的理解与翻译可能都有偏差)7。INSERT


  ... ON DUPLICATE KEY UPDATE语法将不再可用,不过你需要学习更加复杂(但是符合SQL标准)的MERGE语法。


  8. Oracle的ROLE架构与MySQL有很大差异,无法再使用root角色来完整所有工作。(不过Sys用户的权限仍然与root相差无几,只是为了安全着想,不建议这么使用了)。


  9.角色帐户与特定的Schema联系在一起(反之也一样),类似于MySQL数据库中的数据库概念。(角色并不完全与Schema联系在一起,系统有一些固定的角色,这些角色包含部分已经定义好的权限集(privilege set),也可以再自定义部分新的角色)。


  10.事实上,丢弃一切已知的关于连接访问的设置吧,Oracle使用一套全新的系统来处理连接访问。


  11.支持全文搜索,不过语法完全不同。


  12. Oracle的文档非常丰富,不过,如果需要Oracle的专业服务,你需要拥有Metalink的访问权限。


  13.在非数据库社区很难找到相关的支持信息(例如,PHP论坛或者网站开发者的网志)


  14。自增功能可以通过Trigger与sequ​​ence对象来实现。


  15.大量日常熟悉的SHOW命令将不再可用,想要获取系统信息,需要你学习Oracle的数据字典(或信息Schema),深入一点的还需要学习Oracle动态性能。


  16. MySQL为信息Schema添加了多个非标准的扩展,在Oracle中将很难找到这些信息。


  17.为了管理好生产系统与非生产系统的的转入转出,需要你深入理解Oracle的授权规则。


  18.大体上讲,Oracle的数值类型更加简单,如果你确实需要类似于MySQL的多粒度的数值类型,就需要你自己来实现它,或者通过制定不同的精度(Number(n,x))来实现。


  19.在Oracle中,表可以做到无限制的增长,但是大部分情况下,都建议通过表空间(tablespace)来对此作细粒度的管理。


  20. Oracle不支持ALTER TABLE ADD COLUMN BEFORE | AFTER,也就是不支持自己制定字段的位置。(我们这边之前有部分应用对字段顺序有严格地要求,不过,从理论上讲,这是业务设计的问题,主要是其大部分情况下都是使用select *或者插入表
值来处理数据,而不是在选择,插入中指定具体需要处理的字段名列表)。



  21.如果你习惯于通过图形界面(GUI)来管理数据库,你一定会喜欢上Oracle,但是如果你倾向于使用类似与Mysql命令行的客户端,你可能会对sql * plus这个客户端工具感到失望(需要一个习惯的过程,在SQL * Plus还是蛮好用的)。


  22. Oracle的数据校验比Mysql更加严格,依赖于MySQL的模糊规则可能会导致应用无法运行.MySQL接受“0000-00-00”来作为日期类型的值就是个典型的例子。


  23.虽然Oracle的PL / SQL功能更强,但是它不支持标准的PSM语言来编写存储过程,因此你可能不得不学习它的非标准的语法。


  24. Oracle不支持ENUM数据类型,只能通过使用基于文本的check约束或者创建外键关联表来实现。


  25. Mysql的一些更加神秘的表类型(例如,blackhole,csv),在Oracle中找不到相对应的功能。(不清楚blockhole是何种类型,不过Oracle的外部表(外部表)确实是支持csv格式的,在11g版本中还支持对此文件的压缩/加密以及其他处理)。


  26. Oracle中的Group By语句必须是确定的,它需要从列句中选择列出中出现的所有列都必须包含在group中。


  27. Oracle的exp命令输出的dmp文件无法象Mysql的转储文件一样可以手工修改。


  28. Oracle的底层实现有较大变化,需要你学习UNDO与REDO段,归档,以及DBWR进程。(个人认为甲骨文相对于其他数据库的主要的优势可能就是其撤消/重做的设计了。)


  29. Oracle不是开源软件,因此你无法在上面进行修补/优化/修复/实现你自己的东西。


  Robert Hodges


  30. Oracle的查询优化是一件需要专家介入的工作。它的优化器比MySQL的要成熟的多,这意味着查询计划也相应的更加难以解释。如果你有一个大的应用,请准备好聘用一位了解如何有效进行此项工作的伙计


  31. Oracle的基于成本的优化器的有效运行需要精确的统计信息。对于发生变化的表,需要定期的为其收集统计信息。批量数据加载进程也需要在处理过程中不时的执行估算/计算统计命令来收集统计信息以取得满意的性能


  32.在Oracle中,创建连接是个代价高昂的操作。性能良好的Oracle应用都倾向于使用连接池来最小化登陆的开销。


  33. Oracle应用需要应用准备好的声明以获取可观的性能。如果你的应用不使用prepared statement的话,需要对应用进行调整。这是应用Oracle数据库的标准编程实践。(此处的预备声明应该更多的是指使用绑定变量)。


  34.应用需要关闭结果集游标,否则很快就会遇到着名的“ORA-01000太多打开游标”错误。在Oracle中,这被认为是一个用户错误,需要你去调整你的代码。


  35.繁忙系统上的长查询可能会遇到“ORA-01555快照太旧”错误。可以通过调整redo段的大小(有时通过调整应用)来消除此错误,但是还是需要你关注这一点。处的重做段的表述是有点问题,此处应该是撤消表空间以及对应的撤消
保留,Oracle没有所谓的重做段的说法)。



  36. Oracle没有类似于非事务表的概念。大部分Oracle用户都认可这一点。


  37. Oracle的临时表定义是持久的SQL对象,并且对所有用户都可见(此处应该理解成以此用户登陆的会话,Session)。这一点与MySQL中使用的轻量级表有区别,在MySQL的中,临时表是在单个会话内创建并销毁的


  Denish Patel


  38.在Oracle中,多个Alter Table操作不能在同一个SQL语句中执行,例如alter table emp modify name varchar(64)not null,add gender char(1)not null;


  39.默认情况下,Oracle不会自动提交。


  40. KILL命令在Oracle中无效,它使用alter system kill命令。(不清楚第一个kill是什么概念,操作系统级别的kill,Oracle还是支持的,我经常使用)。


  41. Oracle在语句中不支持使用减号( - )。(不清楚这个具体的减号是什么东西)。


  42. Oracle的sqlplus命令行接口不支持高亮显示。


  罗兰布曼


  43. Oracle不支持group_concat或者类似的分组函数。需要你通过循环调取游标来实现,或者通过组合XMLAGG与XMLQUERY来实现你需要的查询。(在Oracle 9R2之后,可以使用自定义聚合函数来实现这个功能,到Oracle 11gR1之后,Oracle自己还提供了一个新的listagg分组函数来实现这个功能)。


  44.对于count(distinct expression)函数,Oracle只支持一个表达式(要么一个列名,要么*),而Mysql支持一组表达式。(在甲骨文中要实现一组表达式,可以通过使用子查询来实现)。


  45. Oracle对子查询的支持非常好。不要因为Mysql中的习惯而不去使用它。


  46. Oracle不支持用户变量(@num)。如果你需要利用它来计算运行时总和,可以利用分析函数(窗口函数)来实现。如果用户户变量来实现特定的汇总函数功能,你将发现Oracle已经有内置得功能支持这些功能。(另外在甲骨文中,可以通过在封装中应用DBMS_SESSION来设置上下文以实现用户变量)。


  47. Oracle没有区分TIME与DATE类型,Oracle的日期类型实际上就是一个DATETIME类型(但是比MySQL支持一个更大的日期范围)。


  48.相对于MySQL来讲,Oracle的存储过程与触发器功能与性能都要好很多。不要习惯性地不去使用它们。


  49.如果需要在Oracle中编写存储过程,记得在开始编码前花点时间了解下。你将发现大部分问题已经解决掉了,或者至少大量的基础代码已经在那儿了。


  50如果你在MySQL中有使用BLOB类型或者TEXT类型,你可能会将他们迁移到Oracle地图BLOB与CLOB中。然而,与MySQL不同,Oracle并不是透明地实体化这些数据。在大部分情况下,这确实是件好事情,但是它也意味着如果你只是想把BLOB / CLOB当作文本处理,你将需要花费大量琐碎的时间来使用LOB函数,在使用之初,LOB函数还是蛮让人气馁的(LOB相关函数确实挺烦人,LOB的处理效率也非常差,即使是使用Oracle
11g的SecureFile)。