数据库优化方案样本_第1页
数据库优化方案样本_第2页
数据库优化方案样本_第3页
数据库优化方案样本_第4页
数据库优化方案样本_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库优化方案1.高效地进行SQL语句设计:普通状况下,可以采用下面办法优化SQL对数据操作体现:(1)减少对数据库查询次数,即减少对系统资源祈求,使用快照和显形图等分布式数据库对象可以减少对数据库查询次数。(2)尽量使用相似或非常类似SQL语句进行查询,这样不但充分运用SQL共享池中已经分析语法树,要查询数据在SGA中命中也许性也会大大增长。(3)避免不带任何条件SQL语句执行。没有任何条件SQL语句在执行时,普通要进行FTS,数据库先定位一种数据块,然后按顺序依次查找其他数据,对于大型表这将是一种漫长过程。(4)如果对有些表中数据有约束,最佳在建表SQL语句用描述完整性来实现,而不是用SQL程序中实现。一、操作符优化:1、IN操作符用IN写出来SQL长处是比较容易写及清晰易懂,这比较适合当代软件开发风格。但是用INSQL性能总是比较低,从Oracle执行环节来分析用INSQL与不用INSQL有如下区别:ORACLE试图将其转换成各种表连接,如果转换不成功则先执行IN里面子查询,再查询外层表记录,如果转换成功则直接采用各种表连接方式查询。由此可见用INSQL至少多了一种转换过程。普通SQL都可以转换成功,但对于具有分组记录等方面SQL就不能转换了。在业务密集SQL当中尽量不采用IN操作符。优化sql时,经常遇到使用in语句,一定要用exists把它给换掉,由于Oracle在解决In时是按Or方式做,虽然使用了索引也会很慢。2、NOTIN操作符强列推荐不使用,由于它不能应用表索引。用NOTEXISTS或(外连接+判断为空)方案代替3、ISNULL或ISNOTNULL操作判断字段与否为空普通是不会应用索引,由于B树索引是不索引空值。用其他相似功能操作运算代替,aisnotnull改为a>0或a>’’等。不容许字段为空,而用一种缺省值代替空值,如业扩申请中状态字段不容许为空,缺省为申请。避免在索引列上使用ISNULL和ISNOTNULL避免在索引中使用任何可觉得空列,ORACLE将无法使用该索引.对于单列索引,如果列包括空值,索引中将不存在此记录.对于复合索引,如果每个列都为空,索引中同样不存在此记录.如果至少有一种列不为空,则记录存在于索引中.举例:如果唯一性索引建立在表A列和B列上,并且表中存在一条记录A,B值为(123,null),ORACLE将不接受下一条具备相似A,B值(123,null)记录(插入).然而如果所有索引列都为空,ORACLE将以为整个键值为空而空不等于空.因而你可以插入1000条具备相似键值记录,固然它们都是空!由于空值不存在于索引列中,因此WHERE子句中对索引列进行空值比较将使ORACLE停用该索引.低效:(索引失效)SELECT…FROMDEPARTMENTWHEREDEPT_CODEISNOTNULL;高效:(索引有效)SELECT…FROMDEPARTMENTWHEREDEPT_CODE>=0;4、>及<操作符(不不大于或不大于操作符)不不大于或不大于操作符普通状况下是不用调节,由于它有索引就会采用索引查找,但有状况下可以对它进行优化,如一种表有100万记录,一种数值型字段A,30万记录A=0,30万记录A=1,39万记录A=2,1万记录A=3。那么执行A>2与A>=3效果就有很大区别了,由于A>2时ORACLE会先找出为2记录索引再进行比较,而A>=3时ORACLE则直接找到=3记录索引。用>=代替>高效:SELECT…FROMDEPARTMENTWHEREDEPT_CODE>=0;低效:SELECT*FROMEMPWHEREDEPTNO>3两者区别在于,前者DBMS将直接跳到第一种DEPT等于4记录而后者将一方面定位到DEPTNO=3记录并且向前扫描到第一种DEPT不不大于3记录.5、LIKE操作符:LIKE操作符可以应用通配符查询,里面通配符组合也许达到几乎是任意查询,但是如果用得不好则会产生性能上问题,如LIKE‘%5400%’这种查询不会引用索引,而LIKE‘X5400%’则会引用范畴索引。一种实际例子:用YW_YHJBQK表中营业编号背面户标记号可来查询营业编号YY_BHLIKE‘%5400%’这个条件会产生全表扫描,如果改成YY_BHLIKE’X5400%’ORYY_BHLIKE’B5400%’则会运用YY_BH索引进行两个范畴查询,性能必定大大提高。6、用EXISTS替代DISTINCT:当提交一种包括一对多表信息(例如部门表和雇员表)查询时,避免在SELECT子句中使用DISTINCT.普通可以考虑用EXIST替代,EXISTS使查询更为迅速,由于RDBMS核心模块将在子查询条件一旦满足后,立即返回成果.例子:(低效):SELECTDISTINCTDEPT_NO,DEPT_NAMEFROMDEPTD,EMPEWHERED.DEPT_NO=E.DEPT_NO(高效):SELECTDEPT_NO,DEPT_NAMEFROMDEPTDWHEREEXISTS(SELECT'X'FROMEMPEWHEREE.DEPT_NO=D.DEPT_NO);如:用EXISTS代替IN、用NOTEXISTS代替NOTIN:在许多基于基本表查询中,为了满足一种条件,往往需要对另一种表进行联接.在这种状况下,使用EXISTS(或NOTEXISTS)普通将提高查询效率.在子查询中,NOTIN子句将执行一种内部排序和合并.无论在哪种状况下,NOTIN都是最低效(由于它对子查询中表执行了一种全表遍历).为了避免使用NOTIN,咱们可以把它改写成外连接(OuterJoins)或NOTEXISTS.例子:(高效):SELECT*FROMEMP(基本表)WHEREEMPNO>0ANDEXISTS(SELECT'X'FROMDEPTWHEREDEPT.DEPTNO=EMP.DEPTNOANDLOC='MELB')(低效):SELECT*FROMEMP(基本表)WHEREEMPNO>0ANDDEPTNOIN(SELECTDEPTNOFROMDEPTWHERELOC='MELB')7、用UNION替代OR(合用于索引列)普通状况下,用UNION替代WHERE子句中OR将会起到较好效果.对索引列使用OR将导致全表扫描.注意,以上规则只针对各种索引列有效.如果有column没有被索引,查询效率也许会由于你没有选取OR而减少.在下面例子中,LOC_ID和REGION上都建有索引.(高效):SELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHERELOC_ID=10UNIONSELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHEREREGION='MELBOURNE'(低效):SELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHERELOC_ID=10ORREGION='MELBOURNE'如果你坚持要用OR,那就需要返回记录至少索引列写在最前面.8、用IN来替代OR这是一条简朴易记规则,但是实际执行效果还须检查,在ORACLE8i下,两者执行途径似乎是相似.低效:SELECT….FROMLOCATIONWHERELOC_ID=10ORLOC_ID=20ORLOC_ID=30高效:SELECT…FROMLOCATIONWHERELOC_ININ(10,20,30);二、SQL语句构造优化1、SELECT子句中避免使用‘*‘:2、用TRUNCATE代替DELETE:用TRUNCATE代替DELETE删除全表记录:(大数据量表用次办法)当删除表中记录时,在普通状况下,回滚段(rollbacksegments)用来存储可以被恢复信息.如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前状态(精确地说是恢复到执行删除命令之前状况)而当运用TRUNCATE时,回滚段不再存储任何可被恢复信息.3、用Where子句替代HAVING子句:避免使用HAVING子句,HAVING只会在检索出所有记录之后才对成果集进行过滤.这个解决需要排序,总计等操作.如果能通过WHERE子句限制记录数目,那就能减少这方面开销.(非oracle中)on、where、having这三个都可以加条件子句中,on是最先执行,where次之,having最后,由于on是先把不符合条件记录过滤后才进行记录,它就可以减少中间运算要解决数据,按理说应当速度是最快,where也应当比having快点4、sql语句用大写由于oracle总是先解析sql语句,把小写字母转换成大写再执行。5、在Java代码中尽量少用连接符“+”连接字符串!6、避免变化索引列类型.:当比较不同数据类型数据时,ORACLE自动对列进行简朴类型转换.假设EMPNO是一种数值类型索引列.SELECT…FROMEMPWHEREEMPNO=‘123'事实上,通过ORACLE类型转换,语句转化为:SELECT…FROMEMPWHEREEMPNO=TO_NUMBER(‘123')幸运是,类型转换没有发生在索引列上,索引用途没有被变化.当前,假设EMP_TYPE是一种字符类型索引列.SELECT…FROMEMPWHEREEMP_TYPE=123这个语句被ORACLE转换为:SELECT…FROMEMPWHERETO_NUMBER(EMP_TYPE)=123由于内部发生类型转换,这个索引将不会被用到!为了避免ORACLE对你SQL进行隐式类型转换,最佳把类型转换用显式体现出来.注意当字符和数值比较时,ORACLE会优先转换数值类型到字符类型7、优化GROUPBY:提高GROUPBY语句效率,可以通过将不需要记录在GROUPBY之前过滤掉.下面两个查询返回相似成果但第二个明显就快了许多.低效:1SELECTJOB,AVG(SAL)FROMEMPGROUPbyJOBHAVINGJOB='PRESIDENT'ORJOB='MANAGER'高效:1SELECTJOB,AVG(SAL)FROMEMPWHEREJOB='PRESIDENT'ORJOB='MANAGER'GROUPbyJOB数据库优化方案运用表分区分区将数据在物理上分隔开,不同分区数据可以制定保存在处在不同磁盘上数据文献里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,此外处在不同磁盘分区也将对这个表数据传播分散在不同磁盘I/O,一种精心设立分区可以将数据传播对磁盘I/O竞争均匀地分散开。对数据量大时时表可采用此办法。可按月自动建表分区。别名使用别名是大型数据库应用技巧,就是表名、列名在查询中以一种字母为别名,查询速度要比建连接表快1.5倍。索引Index优化设计索引可以大大加快数据库查询速度,索引把表中逻辑值映射到安全RowID,因而索引能进行迅速定位数据物理地址。对一种建有索引大型表查询时,索引数据也许会用完所有数据块缓存空间,ORACLE不得不频繁地进行磁盘读写来获取数据,因而在对一种大型表进行分区之后,可以依照相应分区建立分区索引。但是个人觉得不是所有表都需要建立索引,只针对大数据量表建立索引。缺陷:第一,创立索引和维护索引要耗费时间,这种时间随着数据量增长而增长。第二,索引需要占物理空间,除了数据表占数据空间之外,每一种索引还要占一定物理空间,如果要建立聚簇索引,那么需要空间就会更大。第三,当对表中数据进行增长、删除和修改时候,索引也要动态维护,这样就减少了数据维护速度。索引需要维护:为了维护系统性能,索引在创立之后,由于频繁地对数据进行增长、删除、修改等操作使得索引页发生碎块,因而,必要对索引进行维护。调节硬盘I/O这一步是在信息系统开发之前完毕。数据库管理员可以将构成同一种表空间数据文献放在不同硬盘上,做到硬盘之间I/O负载均衡。在磁盘比较富裕状况下还应当遵循如下原则:将表和索引分开;创造顾客表空间,与系统表空间(system)分开磁盘;创立表和索引时指定不同表空间;创立回滚段专用表空间,防止空间竞争影响事务完毕;创立暂时表空间用于排序操作,尽量防止数据库碎片存在于各种表空间中。咱们在使用物化视图过程中基本可以“把它当作一种实际数据表来看待”,不用再紧张视图自身基本表效率、优化等物化视图1.对于复杂而高消耗查询,如果使用频繁,应建成物化视图2.物化视图是一种典型以空间换时间性能优化方式3.对于更新频繁表慎用物化视图4.选取适当刷新方式普通视图是虚拟,而物化视图是实实在在数据区域,是要占据存储空间。固然,物化视图在创立和管理上和普通视图有不同地方。相比来讲,物化视图占用了一定存储空间,此外系统刷新物化视图也需要耗费一定资源,但是它却换来了效率和灵活性。减少IO与网络传播次数1.尽量用较少数据库祈求,获取到需要数据,能一次性取出不分多次取出2.对于频繁操作数据库批量操作,应采用存储过程,减少不必要网络传播死锁与阻塞1.对于需要频繁更新数据,尽量避免放在长事务中,以免导致连锁反映2.不是迫不得已,最佳不要在ORACLE锁机制外再加自己设计锁3.减少事务大小,及时提交事务4.尽量避免跨数据库分布式事务,由于环境复杂性,很容易导致阻塞5.慎用位图索引,更新时容易导致死锁自动增长表分区:该程序可以做为一种OracleJOB执行在每月28日前执行(考虑2月28天因素),自动为该顾客下分区表增长分区.createorreplaceprocedureguan_add_partition/*/*为一种顾客下所有分区表自动增长分区.分区列为date类型,分区名类似:p06./*createbyDavid*/asv_table_namevarchar2(50);v_partition_namevarchar2(50);v_monthchar(6);v_add_month_1char(6);v_sql_stringvarchar2();v_add_monthvarchar2(20);cursorcur_partisselectdistinctu.table_name,max(p.partition_name)max_part_namefromuser_tablesu,user_tab_partitionspwhereu.table_name=p.table_namea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论