• 售前

  • 售后

热门帖子
入门百科

ORACLE数据库应用开发的三十个留意事项

[复制链接]
术数古籍专卖疤 显示全部楼层 发表于 2021-8-14 14:59:51 |阅读模式 打印 上一主题 下一主题
目录


  • 弁言
  • 禁忌1:触发器代码忌复杂
  • 禁忌2:忌使用dblink
  • 禁忌3:忌用大表关联统计
  • 禁忌4:忌用字典式字段索引
  • 禁忌5:慎用主键约束
  • 禁忌6:慎用外键关联
  • 禁忌7:组合索引使用要留意
  • 禁忌8:慎重思量表字段调整
  • 禁忌9:忌直接使用用户名和暗码连接数据
  • 禁忌10:慎用数据库连接
  • 禁忌11:忌用并行
  • 禁忌12:忌SQL语句不使用绑定变量
  • 禁忌13:忌索引数量过多
  • 禁忌14:select for update 要带nowait
  • 禁忌15:批量使命要控制功德件提交的频度
  • 禁忌16:sequence使用留意
  • 禁忌17:慎用rowid更新数据
  • 禁忌18:慎用子查询
  • 禁忌19:忌用SELECT *
  • 禁忌20:where 子句中慎用!=或<>操纵符
  • 禁忌21:where 子句中慎用like
  • 禁忌22:where 子句中慎用in和not in
  • 禁忌23:where字句中慎用字段函数操纵
  • 禁忌24:忌用select count(*)
  • 禁忌25:索引字段访问慎用OR
  • 禁忌26:慎重思量字符集
  • 禁忌27、慎用视图嵌套
  • 禁忌28: 忌数据对象名过长
  • 禁忌29:审慎表和索引的inittrans设置
  • 禁忌30:数据模子和数据对象的计划必须商DBA确认
  • 小结:

弁言


笔者及地点团队从2000年开始的CRM等体系开辟,不绝重要使用ORACLE数据库作为应用数据库,开辟方式包括使用PLSQL编写存储过程/数据库函数/触发器、使用ODBC或OCI和ProC开辟C++应用、使用JDBC开辟Java应用、使用tuxdeo开辟中间件应用等。这些应用开辟笔者地点团队本身做过,也委托华为、亚信、思特奇等国内厂商互助做过,团体来说ORACLE数据库功能强大、性能出众、体系结实,确实是OLTP联机变乱处理的最受接待的数据库。
因ORACLE服务费居高不下、加上近来几年美国的操弄打压,国产数据库也走出了一条本身的路,因此数据库国产化也越来越被提上日程,也有部门应用走出了乐成之路,但众多传统应用举行国产数据库的改造必要大量投入,也必要一个逐步试点及改造的过程,因此ORACLE仍旧是国内众多单元连续应用的选择。
本日老猿联合二十余年的ORACLE数据库应用开辟和运维的经验教训,总结在使用ORACLE数据库环境中的应用开辟中必要留意的一些留意事项,这些题目不光可以作为ORACLE数据库开辟的留意事项,大多数也实用于常见的关系型数据库开辟甚至非关系型数据开辟。
实际上,在数据库应用开辟上,开辟和维护关联度是非常大的,好的开辟计划会给维护带来极大方便。因此固然维护关注的角度和开辟有所不同,但在部门内容上二者是同一的。

禁忌1:触发器代码忌复杂


数据库触发器由于可以基于表级举行所有应用或手工DML操纵数据增编削查的前向或后向处理,易于收敛逻辑,使用方便,容易受到众多开辟人员的喜爱。
但在使用上触发器与操纵数据的变乱处于同一个变乱,因此比力恰当简朴处理逻辑,切忌不能在触发器上使用复杂逻辑,一样寻常保举在10行左右代码比力恰当,否则容易导致变乱处理出现题目。
如果肯定要通过触发器举行复杂逻辑处理,最好的做法是通过触发器将必要处理的数据写入到单独的使命表中,然后使用单独历程对使命表数据举行处理。这样能使得触发器和触发源二者的变乱解耦,又能收敛干系数据处理。

禁忌2:忌使用dblink


dblink提供的机制可以使得在一个数据库的存储过程、触发器、数据库函数中方便的访问另一个数据库,可以方便地为应用只需连接一个数据库就可以访问另一个数据库中的数据,因此给多数据库环境使用带来了很大的便利性。
但dblink在跨数据库变乱提交上容易引发题目,一样寻常可以在不带变乱的DML简朴查询中使用,如果肯定要带变乱必须确保变乱提交灵敏,否则容易引发分布式变乱锁。而应用程序中使用时,由于运行的环境复杂多变,无法百分之百保障变乱的完整性和相应快速,很容易引发分布式变乱锁并有肯定几率触发ORACLE的BUG,同时dblink本身会大概率甚至百分之百带来scn号跳变bug,并引发scn号跳变在数据库间传播。导致体系故障甚至数据库瘫痪。因此不要在代码开辟中使用dblink。平时运维也只管少用,如果肯定要用最好不带变乱,并尽快开释连接。

禁忌3:忌用大表关联统计


在一个体系中,除了实时类生意业务外,也存在肯定要求数据实时的统计或查询需求,针对这种数据统计,切忌使用大表关联举行统计,由于会导致数据库消耗大量盘算资源、占用过多的临时空间,影响其他实时业务的相应甚至导致体系无法相应。
对于这种必要跨多个大表的统计,最理想的是不放在OLTP数据库实行,如果肯定要实行,一是要想办法限定数据的范围(如基于时间限定只能统计当天的),二是对于两个大表关联的SQL举行拆分,拆分成两个SQL,前一个SQL获取的数据通过游标打开后再逐条去另一个大表使用索引逐条数据举行访问,再用客户端举行统计运算,大概通过游标获取数据生产临时表再基于临时表举行统计。

禁忌4:忌用字典式字段索引


索引只有说数据在索引字段比力分散才有用果,如果基于一些字典式字段(如性别、课程等)建索引,起不到很好的结果不说,还浪费存储空间。这种字典式的字段如果肯定要发挥类似索引的结果,可以按字典值建分区键。

禁忌5:慎用主键约束


某个表的主键理论上看起来是个很好的机制,但在一样寻常性应用中,由于主键不能更新,因此在运维时会带来很多不便,一样寻常建议慎用,而是可以用非空和唯一性约束方式来替换。

禁忌6:慎用外键关联


外键关联可以确保某个表的主键被其他表作为非主键使用时来保障两个表数据的一致性,但外键关联给程序开辟、运维都带来了更多的复杂性,而好的开辟风俗能确保两个有外键关联的表满足数据一致性的要求,因此一样寻常环境下慎用外键关联。这实在是根据在方便性、数据一致性之间应用更倾向于哪方面来决策使用方式。

禁忌7:组合索引使用要留意


       
  • 使用多个字段的混淆索引是常见的,但索引使用的字段越多,就意味着开辟时必要关注的字段越多,开辟时部门人员容易忘记索引字段,导致容易写出用不到索引的语句。因此一样寻常建议复合索引使用字段不凌驾5个;   
  • 组合索引中字段的次序是非常重要的,越是唯一的字段越是要靠前;   
  • 程序代码使用组合索引时,在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才气包管体系使用该索引,并且应尽大概的让字段次序与索引次序相一致。

禁忌8:慎重思量表字段调整


当一个初始计划的表在运行一段时间后,随着业务的发展和体系的连续运营,对表结构举行调整是早晚的事,但调整表结构如增长新字段、字段长度调整等都必要慎重,特别是针对数据量大访问频仍的表更要审慎。
在评估表结构调整时,一样寻常必要思量:
       
  • 是否必要停体系调整,对于高并发访问频仍的表至少要比及业务闲时举行调整;   
  • 如果是调整字段巨细必要评估是否有代码限定了字段巨细;   
  • 如果是新增字段必要评估是否有代码接纳了select *方式访问;   
  • 是否必要初始化历史数据?如果有是否会造成行迁徙?是否必要重修表?   
  • 是否会影响外围接口或体系数据的交互?
为了应对字段增长大概带来的风险,有2个方法来提取防备:
       
  • 给一些大表预留肯定的字段,这样可以制止停体系、镌汰行数据迁徙、并制止体系运行时举行表结构调整的风险,但要规划好预留字段的数量、并做好启用管理;   
  • 只管不动大表本身,而是计划扩展表来解决。

禁忌9:忌直接使用用户名和暗码连接数据


在信息安全非常重视的本日,数据库的安全性是重中之重,应用体系不应该在程序代码或设置文件中直接使用用户名和暗码方式连接访问业务数据。如果这样,对开辟人员和维护人员暗码就和没有暗码一样,别的如果出现数据库必须修改暗码时,必要到处改暗码干系的代码或设置文件。
比力好的解决办法是用最小权限的用户登录,登录后通过专用加密设置表获取用户真正使用的用户和暗码,这就是二次登录。

禁忌10:慎用数据库连接


在一个大型体系内,数据库连接是宝贵的资源,ORACLE的连接数单实例一样寻常限定在4096个,看起来不少,但如果连接节点多真正使用起来后会发现连接数往往不够用。为此必要对数据库的访问举行连接收敛管控,实现连接的复用。
要实现连接的收敛,有如下做法:
       
  • WEB服务器通过连接池管理收敛客户端的数据访问;   
  • 后台历程或中间间通过数据访问代理层来举行连接的复用和收敛;   
  • 后台维护限定单机登录会话数。

禁忌11:忌用并行


在程序代码或表的参数设置里,都可以设置并行参数,并行对于单表或单语句能起到灵敏进步实行效率的作用,但这种并行是以抢占其他使命的资源为代价,因此在OLTP数据库应用中,最好别使用并行的DML语句或将表的并行参数打开。临时实行使命思量到实行速度必要使用并行时,肯定要与DBA协商是否可以开启并行,并在使命实行结束后关闭
表的并行参数。
前几年,有个工程割接时为了提拔割接速度,当晚一个参与割接的工程师未和任何人商议就将一个重要的访问频仍的大表的并行参数设置调整多倍,割接后也未关闭,导致第二天业务起来后数据库出现了锁、主机CPU全忙,影响业务凌驾4个小时。经过较长时间定位才发现是该表并行被打开导致的,题目最终解决但造成了不良影响。而谁人导致题目的工程师也在华为年底稽核中得到了处罚离职走人。

禁忌12:忌SQL语句不使用绑定变量


在应用开辟中,SQL语句大多数是动态SQL,这种动态SQL又分为两种,一种是字段取值是变化的,一种是连数据对象名都是动态的。
对于字段取值变化的环境,基本的访问SQL是固定的,针对变化的字段值就必要用绑定变量方式传值,这时数据库才不会重新编译该SQL语句,可以进步实行效率,如果不使用绑定变量,直接将该SQL语句用字符串方式拼接,实在就与数据对象也是不同变更的方式类似,这样SQL语句每回都会被编译,效率会大幅降落。
对于数据对象名都是动态的SQL,不恰当通过绑定变量方式通报数据对象名。

禁忌13:忌索引数量过多


一个表的索引是必要单独占用存储空间的,过多的索引会导致表数据发生变化时索引的调整占用过多的时间,会引发数据的增编削性能降落。对于频仍举行插入、删除、更新的数据表,应控制索引的数量,进步效率,一样寻常一个表的索引数控制在5个以内。如果一个表要建5个以上索引,一样寻常分析表和应用的计划是存在题目的。

禁忌14:select for update 要带nowait


select ... for update语句 对于包管变乱的完整性很有必要,但在一个并发环境中,使用该语句的应用很大概会导致数据库锁甚至死锁,精确的做法是select ... for update nowait,并且在获取锁失败时要有重新处理的机制。

禁忌15:批量使命要控制功德件提交的频度


在后台历程或存储过程处理大批量数据时,变乱提交克制单条提交大概全部完成后再提交,提交太频仍会产生过多的数据库日记,一次性提交容易导致回滚段不够等题目。建议使用100、500大概1000条提交的频度。

禁忌16:sequence使用留意


对于部门表的内部关键ID字段如流水号等使用sequence是个非常不错的主意,可以有用保障并发环境下这种序列号分配的高效和唯一性。但在应用中使用sequence时要留意几点:
       
  • 长度设置要充分思量业务发展的速度,有用序列在初期增长缓慢,但随着业务发展会灵敏增长,因此开辟计划时要举行充分的评估,防止出现sequence很快被耗尽;   
  • 对于长期增长的序列号,最后接纳时间戳+序列号的方式来作为字段值,防止序列号翻转;   
  • 序列号分配时,由于序列号在不同数据库实例的缓冲机制,大概会出现背面的数据记载序列号比前面插入记载序列号还要小的环境,因此序列号字段的值只能作为唯一键值使用,而不能作为业务排序的依据。

禁忌17:慎用rowid更新数据


rowid是数据库记载的一个内部记载ID,使用rowid访问数据比普通索引还要高效,但如果在一个表的数据频仍插入、删除时,不要使用rowid来举行数据的操纵,由于ORACLE的rowid在数据有删除机制时,是有肯定几率出现重复的。

禁忌18:慎用子查询


通过子查询方式举行数据的嵌套查询SQL的可读性比力好,但子查询很容易导致全表扫描,且容易导致回滚段或临时表空间使用过高,因此慎用子查询,特别是子查询的结果集也很大时忌用。

禁忌19:忌用SELECT *


在查询SQL语句中,要只管镌汰返回的结果行,包括行数和字段列数。返回的结果越大,意味着相应的SQL语句的logical reads 就越大,对服务器的性能影响就越甚。
一个特别不好的计划就是使用SELECT * 返回表的所有数据,除了影响服务器性能外,还大概会由于表结构的调整在编译阶段无法发现,导致运行时错误。

禁忌20:where 子句中慎用!=或<>操纵符


使用!=或<>意味着对应字段的访问不会使用索引,因此只有在其他字段使用了索引的基础上才使用!=或<>操纵。

禁忌21:where 子句中慎用like


如果在where字句中使用字段A like ‘%xxx' 或字段A like ‘%xxx%'方式匹配结果记载时,该字段不会使用索引,因此只有在其他字段使用了索引的基础上才使用字段A like ‘%xxx' 或字段A like ‘%xxx%'方式,即忌用前置百分号匹配。

禁忌22:where 子句中慎用in和not in


如果in背面的结果数据比力多,很大概会导致全表扫描。因此只能和其他能使用索引的条件组合使用时使用。

禁忌23:where字句中慎用字段函数操纵


应只管制止在where子句中对字段举行函数操纵,这将导致引擎放弃使用索引而举行全表扫描。不要在 where 子句中的“=”左边举行函数、算术运算或其他表达式运算,否则体系将大概无法精确使用索引。

禁忌24:忌用select count(*)


使用select count(*)的效率不如使用select count(1)。

禁忌25:索引字段访问慎用OR


索引字段用OR的字句容易导致全表扫描,肯定要判定多个值可以分解成多个查询,并且通过UNION 连接多个查询。

禁忌26:慎重思量字符集


在一个应用体系中,涉及应用服务器主机字符集、数据库字符集以及客户端字符集的兼容性题目,要在体系构架时同一思量,确保从前台到后台到数据库的字符集都是兼容的。

禁忌27、慎用视图嵌套


视图最好建在表上,只管不要基于视图嵌套建立视图,一方面一样寻常视图嵌套不要凌驾2个为宜,视图嵌套层级多访问效率会降落,并且可维护性变差。

禁忌28: 忌数据对象名过长


oracle的表名、字段名等对象定名字节个数限定在了30个字节,不能凌驾30。

禁忌29:审慎表和索引的inittrans设置


每个块都有一个块首部。这个块首部中有一个变乱表。变乱表中会建立一些条目来形貌哪些变乱将块上的哪些行/元素锁定。这个变乱表的初始巨细由对象的INITRANS 设置指定。对于表,这个值默认为2(索引的INITRANS 也默认为2)。变乱表会根据必要动态扩展,最大到达MAXTRANS 个条目(假设块上有充足的自由空间)。所分配的每个变乱条目必要占用块首部中的23~24 字节的存储空间。留意,对于Oracle 10g以上版本,MAXTRANS 则会忽略,所有段的MAXTRANS 都是255。
也就是说,如果某个事物锁定了这个块的数据,则会在这个地方记载变乱的标识,固然谁人变乱要先看一下这个地方是不是已经有人占用了,如果有,则去看看谁人变乱是否为活动状态。如果不活动,比如已经提交大概回滚,则可以覆盖这个地方。如果活动,则必要等候(闩的作用)。
所以,如果有大量的并发访问使用的这个块,则参数不能太小,否则资源竞争将导致体系并发性能降落。
在创建表和索引时,必要根据表数据的访问频度和数据量来评估设置的inittrans值,固然不够时Oracle会自动增长,但增长的过程必要ORACLE举行评估,且该评估机制是针对所有对象的,必要列队,如果inittrans值设置过小,就会影响体系的并发性能。因此体系计划和摆设时必要思量不同表的inittrans的设置。

禁忌30:数据模子和数据对象的计划必须商DBA确认


一个业务体系,会有大量的数据模子,会创建大量数据对象,在思量业务需求的同时必须思量体系运维,因此请DBA参与计划是非常必要的。
在做计划时,要思量:
       
  • 订定数据库对象定名规范;   
  • 数据库表空间的使用规划(包括业务数据表和索引、字典表、临时表空间、回滚段等);   
  • 表和索引的inittrans巨细;   
  • 各个表的PCTFREE 和 PCTUSED设置;   
  • 数据维护周期   


小结:


本文具体先容了笔者在二十余年ORACLE应用开辟中遇到的三十条开辟留意事项(原来想写成三十六忌的,怎样没凑够),这些留意事项是实际工作中的经验和教训总结,好些留意事项是笔者的团队以及华为等互助厂商一些工作两三年的人都容易犯的错,笔者前2年遭遇的一次变乱还导致了一个华为工程师的稽核离职。
这些留意事项不光可以在和ORACLE有关的应用开辟中遇到,大部门也可以在其他关系型数据库有关的应用开辟中遇到,甚至部门题目可以在非关系型数据有关的应用开辟中遇到。
以上就是ORACLE数据库应用开辟的三十个留意事项的具体内容,更多关于ORACLE数据库应用开辟的留意事项的资料请关注草根技术分享其它干系文章!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作