提起csdn 数据库(数据库类型) 大家在熟悉不过了,被越来越多的人所熟知,那你知道csdn 数据库(数据库类型) 吗?快和小编一起去了解一下吧!
【资料图】
Csdn数据库(数据库类型)CSDN2021-05-19 16:39:24
作者| LaoYuanPython编辑|欧阳玉丽
生产| CSDN部队计划
介绍
从2000年开始,作者和他的团队一直在开发CRM等系统,主要使用Oracle数据库作为应用数据库。开发方法包括使用PLSQL编写存储过程/数据库函数/触发器,使用ODBC或OCI和ProC开发C++应用,使用JDBC开发Java应用,使用tuxdeo开发中间件应用。这些应用有作者团队开发的,也有华为、亚信、思奇等国内厂商开发的。总体来看,Oracle数据库功能强大,性能突出,系统健壮,确实是OLTP在线事务处理更受欢迎的数据库。
由于Oracle高昂的服务费,以及国内数据库走出了自己的路,数据库的本地化越来越被提上日程,一些应用已经走出了成功之路。而很多传统应用对国产数据库的改造需要大量的投入,也需要一个循序渐进的试点和改造过程。所以Oracle依然是国内很多单位持续的应用选择。
今天,Laoape根据20多年Oracle数据库应用开发和运维的经验教训,总结了Oracle数据库环境下应用开发的一些注意事项。这些问题不仅可以作为Oracle数据库开发中的注意事项,大部分也适用于常见的关系型数据库开发,甚至非关系型数据开发。
其实在数据库应用开发中,开发和维护的相关性是非常大的,好的开发和设计会给维护带来很大的便利。因此,虽然维护和开发的角度不同,但在某些方面是统一的。
1.禁忌:避免触发器代码的复杂性。
由于数据库可以基于表级向前或向后处理所有的应用程序或手工DML操作数据,所以容易收敛逻辑,易于使用,容易受到很多开发者的喜爱。
但是在使用中,触发器和操作数据的事务在同一个事务中,所以更适合简单的处理逻辑。禁止在触发器上使用复杂的逻辑。一般建议10行左右的代码比较合适,否则容易导致交易处理出现问题。
如果必须通过触发器进行复杂的逻辑处理,更好的办法是通过触发器把要处理的数据写入单独的任务表,然后用单独的进程处理任务表数据。这可以解耦触发器和触发器源之间的事务,并融合相关的数据处理。
2:避免使用dblink。
dblink提供的机制可以在一个数据库的存储过程、触发器和数据库函数中方便地访问另一个数据库,并且可以方便地连接一个数据库访问另一个数据库中的数据供应用程序使用,因此给多数据库环境的使用带来了很大的方便。
但是dblink在跨数据库事务提交中容易出现问题,一般可以用在没有事务的DML简单查询中。如果一定要带事务,一定要保证事务快速提交,否则很容易造成分布式事务锁。但应用在使用时,由于运行环境复杂多变,无法100%保证事务的完整性和快速响应,很容易以一定概率触发分布式事务锁和ORACLE bugs。同时,dblink本身会带来大概率甚至100%的scn跳号bug,并导致scn跳号在数据库间传播。导致系统故障甚至数据库瘫痪。所以不要在代码开发中使用dblink。平时尽量少用运维。如果一定要用,更好没有事务,尽快释放连接。
3:禁忌:避免使用大表关联统计。
在一个系统中,除了实时事务外,对实时数据的统计或查询也有一定的要求。对于这种数据统计,禁止使用大表关联进行统计,因为这样会导致数据库消耗大量计算资源,占用过多的临时空室,影响其他实时业务的响应甚至使系统无法响应。
对于这种需要跨多个大型表的统计,更好不要在OLTP数据库中执行。如果一定要执行,之一,尽量限制数据范围(比如只能根据时间限制统计当天);其次,我们应该将与两个大表相关联的SQL拆分成两个SQL。前面SQL获取的数据用游标打开后,会一个一个的去另一个大表,逐个访问索引数据,然后用客户端进行统计操作,或者用游标获取数据进行临时生产。
4.禁忌:不要使用字典字段索引。
只有当数据分散在索引字段中时,索引才有效。如果索引是基于一些字典字段(如性别、课程等)建立的。),不会有很好的效果,还会浪费存储空。如果这个类似字典的字段必须扮演类似索引的角色,可以根据字典值构建分区键。
禁忌:谨慎使用主键约束。
从理论上来说,表的主键似乎是一个很好的机制,但是在一般的应用中,因为主键不能更新,会带来很多运维上的不便。一般建议慎用,相反可以用非空和唯一性约束代替。
6.禁忌:谨慎使用外键关联
当一个表的主键被其他表用作非主键时,外键关联可以确保两个表之间的数据一致性。但是外键关联给程序开发和运维带来了更多的复杂性,良好的开发习惯可以保证有外键关联的两个表满足数据一致性要求。因此,通常应谨慎使用外键关联。实际上是基于应用在便捷性和数据一致性之间更倾向于哪个方面来决定使用方式。
禁忌七:注意组合指标的使用。
使用多个字段的混合索引是很常见的,但是索引中使用的字段越多,开发时需要关注的字段就越多。在开发过程中,有些人容易忘记索引字段,导致编写不需要索引的语句变得很容易。因此,一般建议复合索引使用不超过5个字段;
索引中字段的顺序非常重要,字段越唯一,它就越高。
当代码使用复合索引时,如果使用索引字段作为条件,则必须使用索引中的之一个字段作为条件,以保证系统使用该索引,并且字段顺序应尽可能与索引顺序一致。
禁忌八:慎重考虑表字段调整。
当一个最初设计的表运行一段时间后,随着业务的发展和系统的持续运行,调整表结构是迟早的事。但在调整表结构时需要谨慎,如添加新字段、调整字段长度等,尤其是数据量大、访问频繁的表。
在评估表结构调整时,通常需要考虑:
需要停止系统调整吗?对于高并发访问、频繁访问的表,至少要等到业务空闲时再调整;
如果是调整字段大小,需要评估是否有限制字段大小的代码;
如果是新字段,需要评估是否有代码被select *访问;
需要初始化历史数据吗?如果是,会不会造成线路迁移?需要重建表吗?
会影响外设接口或者系统数据的交互吗?
为了应对字段增加可能带来的风险,有2种方法提取预防:
为一些大表预留一定的字段,可以避免停止系统,减少行数据迁移,避免系统运行时表结构调整的风险。但需要规划好预留字段的数量,做好启用管理。
尽量不要移动大桌子本身,而是设计一个扩展的桌子来解决。
9.禁忌:不要直接使用用户名和密码连接数据。
在信息安全受到高度重视的今天,数据库的安全是重中之重。应用系统不应直接使用程序代码或配置文件中的用户名和密码来连接和访问业务数据。这样,开发人员和维护人员的密码和没有密码是一样的。此外,如果数据库必须更改密码,则需要到处更改与密码相关的代码或配置文件。
更好的解决方案是使用更低特权用户登录。登录后可以通过专用的加密配置表获取用户实际使用的用户和密码,这是第二次登录。
禁忌10:慎用数据库连接。
在大型系统中,数据库连接是一种宝贵的资源。Oracle的连接列表实例一般限制在4,096个,这似乎很多。但是如果连接节点很多,你会发现连接的数量往往不够。因此,有必要控制数据库访问的连接收敛,以实现连接的重用。
要实现连接的收敛,有以下做法:
WEB服务器通过连接池管理汇聚客户端的数据访问;
后台或中间流程通过数据访问 *** 层进行复用和融合;
后台维护限制了单次登录会话的数量。
禁忌11:避免排比。
在程序代码或表格的参数设置中,可以设置并行参数。并行性可以快速提高单个表或单个语句的执行效率,但这种并行性是以抢占其他任务的资源为代价的。因此,在OLTP数据库应用中,更好不要使用并行DML语句或打开表的并行参数。当一个任务的执行速度需要临时使用时,需要和DBA协商是否可以开启并行,任务完成后关闭表的并行参数。
几年前一个项目割接时,为了加快割接速度,当晚参与割接的一个工程师在没有和任何人商量的情况下,对一个重要的、经常访问的大表的并行参数设置进行了多次调整,割接后没有关闭,导致第二天业务开始后数据库被锁,主机CPU满负荷,影响业务4个多小时。经过长时间定位,发现桌子被平行打开,问题最终解决但造成不良影响。造成问题的工程师也在华为年终考核中被处分,离职。
禁忌12:不要在SQL语句中使用绑定变量。
在应用开发中,大多数SQL语句都是动态SQL,分为两种:一种是字段的值发生变化,另一种是连数据对象的名字都是动态的。
对于改变字段值的情况,基本access SQL是固定的,对于改变的字段值,需要通过绑定变量来传递值,这样数据库就不会重新编译SQL语句,可以提高执行效率。如果不使用绑定变量,SQL语句直接用字符串拼接,实际上和数据对象是一样的,这样SQL语句每次都会被编译,效率会大打折扣。
由于数据对象名是动态SQL,所以不适合通过绑定变量来传递数据对象名。
禁忌13:避免过多的索引。
表的索引需要单独占用存储空。过多的索引会在表数据发生变化时花费过多的时间来调整索引,从而导致数据添加、删除和修改的性能下降。对于频繁插入、删除和更新的数据表,应该控制索引的数量以提高效率。一般情况下,一个表中的索引数应控制在5以内。如果一个表需要建立5个以上的索引,一般说明表和应用的设计有问题。
禁忌14:选择用nowait更新
挑选...for update语句是保证事务完整性的必要条件,但在并发环境中,该语句的应用很可能导致数据库锁甚至死锁。正确的方法是选择...对于update nowait,当锁获取失败时,应该有一个重新处理机制。
禁忌15:批量任务要控制事务提交的频率。
当后台进程或存储过程处理大量数据时,事务提交禁止单独提交或全部完成后提交。过于频繁的提交会导致数据库日志过多,一次性提交容易导致回滚段不足。建议使用100、500或1000次提交的频率。
禁忌16:使用顺序
对于一些表的内部键ID字段,比如序列号,使用sequence是一个非常好的想法,可以有效保证这种序列号分配在并发环境下的效率和唯一性。但是,在应用中使用顺序时,需要注意几点:
长度设置要充分考虑业务发展速度。有效序列初期增长缓慢,但随着业务发展会快速增长。因此,应充分评估开发和设计,以防止序列很快耗尽。
对于长期增长的序列号,最后用时间戳+序列号作为字段值,防止序列号翻转;
在分配序列号时,由于序列号在不同数据库实例中的缓冲机制,后面的数据记录的序列号可能小于前面插入的记录的序列号,因此序列号字段的值只能作为唯一键值,不能作为业务排序的依据。
禁忌17:小心使用rowid更新数据
Rowid是数据库记录的内部记录id。使用rowid访问数据比普通索引更高效。但是如果一个表的数据被频繁的插入和删除,就不要用rowid来操作数据,因为Oracle的rowid在数据有删除机制的情况下有一定的被重复的概率。
禁忌18:谨慎使用子查询。
SQL对于子查询嵌套查询数据的可读性是好的,但是子查询容易导致全表扫描,容易导致回滚段或者临时表空的过度使用。因此,应该谨慎使用子查询,尤其是当子查询的结果集也非常大时。
禁忌19:避免使用SELECT *
在查询SQL语句中,尽量减少返回的结果行数,包括行数和字段列数。返回的结果越大,相应SQL语句的逻辑读取就越多,对服务器性能的影响也就越大。
一个特别不好的设计是用SELECT *返回表的所有数据,这样不仅影响服务器的性能,还可能因为在编译阶段找不到表结构的调整而造成运行时错误。
禁忌20:小心20:where子句!= or运算符
用!= or表示对相应字段的访问不会使用索引,所以只会在其他字段已经使用索引的基础上使用!= or运算。
禁忌21:在21:where子句中谨慎使用like
如果字段A如“%xxx%”或字段A如“% xxx%”用于匹配where语句中的结果记录,则该索引将不会用于该字段。所以像“% xxx%”这样的字段A或者像“% xxx%”这样的字段A,只有在其他字段都有索引的基础上才会被使用,也就是禁止与前导百分号匹配。
禁忌22:在22:where子句中小心使用in和not in
如果in之后有更多的结果,很可能会导致全表扫描。因此,它只能与其他可以使用索引的条件结合使用。
禁忌23:在WHERE语句中小心使用字段函数
应尽可能避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引并扫描整个表。不要在where子句中的“=”左侧执行函数、算术运算或其他表达式运算,否则系统可能无法正确使用索引。
禁忌24:避免使用选择计数(*)
Select count(*)不如select count(1)有效。
禁忌25:访问索引字段时要小心使用OR
通过在索引字段中使用OR字,可以很容易地扫描整个表。必须判断多个值可以分解成多个查询,多个查询可以通过UNION连接。
禁忌26:仔细考虑字符集
在应用系统中,涉及到应用服务器的主机字符集、数据库字符集和客户端字符集的兼容性。应该在系统架构中考虑,保证前台到后台到数据库的字符集兼容。
禁忌27。小心使用视图嵌套
更好在表上构建视图,尽量不要基于视图嵌套构建视图。一方面,嵌套的视图一般不超过两个是可取的,这样会降低视图嵌套层次的多路访问效率,恶化可维护性。
禁忌28:避免数据对象名称太长。
Oracle的表名、字段名等对象的命名字节数限制为30字节,不能超过30字节。
禁忌29:在设置表和索引的inittrans时要小心
每个块都有一个块头。该块的标题中有一个交易表。将在事务表中建立一些条目来描述哪些事务锁定块上的哪些行/元素。此事务表的初始大小由对象的INITRANS设置指定。对于表,该值默认为2(索引的INITRANS也默认为2)。transaction表会根据需要动态扩展,最多有MAXTRANS个条目(假设块中有足够的空闲空空间)。每个分配的事务条目需要在块头中占用23 ~ 24字节的存储空。注意,对于Oracle及以上版本,MAXTRANS将被忽略,所有段的MAXTRANS都是255。
也就是说,如果有什么东西锁定了这个区块的数据,这个地方就会记录交易标识。当然,对于那个事务,首先检查这个地方是否已经被占用,如果是,检查那个事务是否是活动的。如果它是非活动的,如已提交或已回滚,您可以覆盖此位置。如果它是活动的,你需要等待(闩锁的功能)。
所以,如果有大量并发访问这个块,参数不能太小,否则资源竞争会造成系统并发性能下降。
以上内容摘自《[Transfer ]Oracle中的INITRANS和MAXTRANS参数》。
创建表和索引时,需要根据表数据的访问频率和数据量来评估set init trans值。虽然Oracle会在不够用的时候自动增加,但是增加的过程需要Oracle来评估,评估机制是针对所有对象的,所以需要排队。如果inittrans的值设置过小,会影响系统的并发性能。因此,在系统设计和部署时,需要考虑不同表的inittrans的设置。
禁忌30:数据模型和数据对象的设计必须和DBA确认。
一个业务系统将拥有大量的数据模型,并创建大量的数据对象。在考虑业务需求的同时,还要考虑系统的运维。因此,有必要邀请DBA参与设计。
设计时,请考虑:
制定数据库对象的命名规范;
使用表间规划空(包括业务数据表和索引、字典表、临时表空、回滚段等。);
以及表和索引的inittrans大小;
每个表的PCTFREE和PCTUSED设置;
数据维护周期
…
总结:
详细介绍了20年来Oracle应用开发的30个注意点(本来想写36条禁忌,没写够)。这些注意事项是实践经验和教训的总结。
这些注意事项不仅在Oracle相关的应用开发中可以遇到,在其他关系数据库相关的应用开发中也可以遇到,甚至在非关系数据相关的应用开发中也会遇到一些问题。
收集4条评论
\