将mysql转换到oracle必须了解的50件事
程序员文章站
2023-11-12 20:04:58
另外他们列出的这些区别有些是蛮有意义的,有些可能由于他们本人的mysql dba的身份,对oracle的理解有些偏差,有些则有凑数的嫌疑. 但是总体上结合baron sch...
另外他们列出的这些区别有些是蛮有意义的,有些可能由于他们本人的mysql dba的身份,对oracle的理解有些偏差,有些则有凑数的嫌疑. 但是总体上结合baron schwartz的列表可以让大家大概地了解到oracle与mysql的共同之处与差别分别体现在哪些方面..
robert treat
1. 有些人说oracle没有限制,实际上他们说得可能是oracle不支持limit语法.不过可以rownum虚列来实现,不过会更加麻烦.
2. oracle不支持偏移(offset)语法.
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. role 帐户与特定的schema联系在一起(反之也一样),类似于mysql数据库中的database概念.(role并不完全与schema联系在一起,系统有一些固定的role,这些role包含部分已经定义好的权限集(privilege set),也可以再自定义部分新的role).
10. 事实上,丢弃一切已知的关于连接访问的设置吧,oracle使用一套全新的系统来处理连接访问.
11. 支持全文搜索,不过语法完全不同.
12. oracle的文档非常丰富,不过,如果需要oracle的专业服务,你需要拥有metalink的访问权限.
13. 在非数据库社区很难找到相关的支持信息(例如,php论坛或者网站开发者的网志)
14. 自增功能可以通过trigger与sequence对象来实现.
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 *或者insert table values来处理数据,而不是在select,insert中指定具体需要处理的字段名列表).
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的外部表(external table)确实是支持csv格式的,在11g版本中还支持对此文件的压缩/加密以及其他处理).
26. oracle中的group by语句必须是确定的,它需要select list中出现的所有列都必须包含在group by从句中.
27. oracle的exp命令输出的dmp文件无法象mysql的转储文件一样可以手工修改.
28. oracle的底层实现有较大变化,需要你学习undo与redo segment,归档,以及dbwr进程. (个人认为oracle相对于其他数据库的主要的优势可能就是其undo/redo的设计了.)
29. oracle不是开源软件,因此你无法在上面进行修补/优化/修复/实现你自己的东西.
robert hodges
30. oracle的查询优化是一件需要专家介入的工作.它的优化器比mysql的要成熟的多,这意味着查询计划也相应的更加难以解释.如果你有一个大的应用,请准备好聘用一位了解如何有效进行此项工作的伙计.
31. oracle的基于成本的优化器的有效运行需要精确的统计信息.对于发生变化的表,需要定期的为其收集统计信息.批量数据加载进程也需要在处理过程中不时的执行estimate/compute statistics命令来收集统计信息以取得满意的性能.
32. 在oracle中,创建连接是个代价高昂的操作.性能良好的oracle应用都倾向于使用连接池来最小化登陆的开销.
33. oracle应用需要应用prepared statement以获取可观的性能.如果你的应用不使用prepared statement的话,需要对应用进行调整.这是应用oracle数据库的标准编程实践.(此处的prepared statement应该更多的是指使用绑定变量).
34. 应用需要关闭结果集游标,否则很快就会遇到著名的”ora-01000 too many open cursors”错误.在oracle中,这被认为是一个用户错误,需要你去调整你的代码.
35. 繁忙系统上的长查询可能会遭遇到” ora-01555 snapshot too old”错误.可以通过调整redo 段的大小(有时通过调整应用)来消除此错误,但是还是需要你关注这一点.(此处的redo segments的表述是有点问题,此处应该是undo tablespace以及对应的undo retention,oracle没有所谓的redo segment的说法).
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在order by语句中不支持使用减号(-).(不清楚这个具体的减号是什么东西).
42. oracle的sqlplus命令行接口不支持高亮显示.
roland bouman
43. oracle不支持group_concat或者类似的分组函数.需要你通过循环调取游标来实现,或者通过组合xmlagg与xmlquery来实现你需要的查询.(在oracle 9r2之后,可以使用自定义聚合函数来实现这个功能,到oracle 11gr1之后,oracle自己还提供了一个新的listagg分组函数来实现这个功能).
44. 对于count(distinct expression)函数,oracle只支持一个表达式(要么一个列名,要么*),而mysql支持一组表达式. (在oracle中要实现一组表达式,可以通过使用子查询来实现).
45. oracle对子查询的支持非常好.不要因为mysql中的习惯而不去使用它.
46. oracle不支持用户变量(@num).如果你需要利用它来计算运行时总和,可以利用分析函数(窗口函数)来实现.如果用用户变量来实现特定的汇总函数功能,你将发现oracle已经有内置得功能支持这些功能.(另外在oracle中,可以通过在package中应用dbms_session来设置context以实现用户变量).
47. oracle没有区分time与date类型,oracle的date类型实际上就是一个datetime类型(但是比mysql支持一个更大的日期范围).
48. 相对于mysql来讲,oracle的存储过程与触发器功能与性能都要好很多.不要习惯性地不去使用它们.
49. 如果需要在oracle中编写存储过程,记得在开始编码前花点时间了解下oracle是不是有相应的内置package.你将发现大部分问题已经解决掉了,或者至少大量的基础代码已经在那儿了.
50 如果你在mysql中有使用blob类型或者text类型,你可能会将他们迁移到oracle地blob与clob中.然而,与mysql不同,oracle并不是透明地实体化这些数据.在大部分情况下,这确实是件好事情,但是它也意味着如果你只是想把blob/clob当作文本处理,你将需要花费大量琐碎的时间来使用lob函数,在使用之初,lob函数还是蛮让人气馁的.(lob相关函数确实挺烦人,lob的处理效率也非常差,即使是使用oracle 11g的securefile).
robert treat
1. 有些人说oracle没有限制,实际上他们说得可能是oracle不支持limit语法.不过可以rownum虚列来实现,不过会更加麻烦.
2. oracle不支持偏移(offset)语法.
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. role 帐户与特定的schema联系在一起(反之也一样),类似于mysql数据库中的database概念.(role并不完全与schema联系在一起,系统有一些固定的role,这些role包含部分已经定义好的权限集(privilege set),也可以再自定义部分新的role).
10. 事实上,丢弃一切已知的关于连接访问的设置吧,oracle使用一套全新的系统来处理连接访问.
11. 支持全文搜索,不过语法完全不同.
12. oracle的文档非常丰富,不过,如果需要oracle的专业服务,你需要拥有metalink的访问权限.
13. 在非数据库社区很难找到相关的支持信息(例如,php论坛或者网站开发者的网志)
14. 自增功能可以通过trigger与sequence对象来实现.
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 *或者insert table values来处理数据,而不是在select,insert中指定具体需要处理的字段名列表).
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的外部表(external table)确实是支持csv格式的,在11g版本中还支持对此文件的压缩/加密以及其他处理).
26. oracle中的group by语句必须是确定的,它需要select list中出现的所有列都必须包含在group by从句中.
27. oracle的exp命令输出的dmp文件无法象mysql的转储文件一样可以手工修改.
28. oracle的底层实现有较大变化,需要你学习undo与redo segment,归档,以及dbwr进程. (个人认为oracle相对于其他数据库的主要的优势可能就是其undo/redo的设计了.)
29. oracle不是开源软件,因此你无法在上面进行修补/优化/修复/实现你自己的东西.
robert hodges
30. oracle的查询优化是一件需要专家介入的工作.它的优化器比mysql的要成熟的多,这意味着查询计划也相应的更加难以解释.如果你有一个大的应用,请准备好聘用一位了解如何有效进行此项工作的伙计.
31. oracle的基于成本的优化器的有效运行需要精确的统计信息.对于发生变化的表,需要定期的为其收集统计信息.批量数据加载进程也需要在处理过程中不时的执行estimate/compute statistics命令来收集统计信息以取得满意的性能.
32. 在oracle中,创建连接是个代价高昂的操作.性能良好的oracle应用都倾向于使用连接池来最小化登陆的开销.
33. oracle应用需要应用prepared statement以获取可观的性能.如果你的应用不使用prepared statement的话,需要对应用进行调整.这是应用oracle数据库的标准编程实践.(此处的prepared statement应该更多的是指使用绑定变量).
34. 应用需要关闭结果集游标,否则很快就会遇到著名的”ora-01000 too many open cursors”错误.在oracle中,这被认为是一个用户错误,需要你去调整你的代码.
35. 繁忙系统上的长查询可能会遭遇到” ora-01555 snapshot too old”错误.可以通过调整redo 段的大小(有时通过调整应用)来消除此错误,但是还是需要你关注这一点.(此处的redo segments的表述是有点问题,此处应该是undo tablespace以及对应的undo retention,oracle没有所谓的redo segment的说法).
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在order by语句中不支持使用减号(-).(不清楚这个具体的减号是什么东西).
42. oracle的sqlplus命令行接口不支持高亮显示.
roland bouman
43. oracle不支持group_concat或者类似的分组函数.需要你通过循环调取游标来实现,或者通过组合xmlagg与xmlquery来实现你需要的查询.(在oracle 9r2之后,可以使用自定义聚合函数来实现这个功能,到oracle 11gr1之后,oracle自己还提供了一个新的listagg分组函数来实现这个功能).
44. 对于count(distinct expression)函数,oracle只支持一个表达式(要么一个列名,要么*),而mysql支持一组表达式. (在oracle中要实现一组表达式,可以通过使用子查询来实现).
45. oracle对子查询的支持非常好.不要因为mysql中的习惯而不去使用它.
46. oracle不支持用户变量(@num).如果你需要利用它来计算运行时总和,可以利用分析函数(窗口函数)来实现.如果用用户变量来实现特定的汇总函数功能,你将发现oracle已经有内置得功能支持这些功能.(另外在oracle中,可以通过在package中应用dbms_session来设置context以实现用户变量).
47. oracle没有区分time与date类型,oracle的date类型实际上就是一个datetime类型(但是比mysql支持一个更大的日期范围).
48. 相对于mysql来讲,oracle的存储过程与触发器功能与性能都要好很多.不要习惯性地不去使用它们.
49. 如果需要在oracle中编写存储过程,记得在开始编码前花点时间了解下oracle是不是有相应的内置package.你将发现大部分问题已经解决掉了,或者至少大量的基础代码已经在那儿了.
50 如果你在mysql中有使用blob类型或者text类型,你可能会将他们迁移到oracle地blob与clob中.然而,与mysql不同,oracle并不是透明地实体化这些数据.在大部分情况下,这确实是件好事情,但是它也意味着如果你只是想把blob/clob当作文本处理,你将需要花费大量琐碎的时间来使用lob函数,在使用之初,lob函数还是蛮让人气馁的.(lob相关函数确实挺烦人,lob的处理效率也非常差,即使是使用oracle 11g的securefile).
上一篇: 陆地巡洋舰2018最新报价!