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

下载本文档

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

文档简介

1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。数据库优化方案1. 高效地进行 SQL语句设计 :一般情况下 ,能够采用下面的方法优化SQL对数据操作的表现:( 1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象能够减少对数据库的查询次数。( 2) 尽量使用相同的或非常类似的 SQL语句进行查询 , 这样不但充分利用 SQL共享池中的已经分析的语法树 , 要查询的数据在 SGA 中命中的可能性也会大大增加。( 3) 避免不带任何条件的 SQL语句的执行。没有任何条件的 SQL 语句在执行时 , 一般要进行 FTS, 数据库先定位一个数据块 ,

2、然后按顺序依次查找其它数据 , 对于大型表这将是一个漫长的过程。( 4) 如果对有些表中的数据有约束 , 最好在建表的 SQL语句用描述完整性来实现 , 而不是用 SQL程序中实现。一、操作符优化:1、IN操作符用 IN 写出来的 SQL的优点是比较容易写及清晰易懂 , 这比较适合现代软件开发的风格。可是用 IN 的 SQL性能总是比较低的 , 从Oracle执行的步骤来分析用IN的 SQL与不用IN的 SQL有以下区别:ORACLE试图将其转换成多个表的连接 , 如果转换不成功则先执行 IN 里面的子查询 , 再查询外层的表记录 , 如果转换成功则直接资料内容仅供您学习参考,如有不当或者侵权

3、,请联系改正或者删除。采用多个表的连接方式查询。由此可见用转换的过程。一般的 SQL都能够转换成功方面的 SQL就不能转换了。在业务密集的操作符。IN 的 SQL至少多了一个, 但对于含有分组统计等SQL当中尽量不采用IN优化 sql 时, 经常碰到使用 in 的语句 , 一定要用 exists 把它给换掉 , 因为 Oracle 在处理 In 时是按 Or 的方式做的 , 即使使用了索引也会很慢。2、 NOT IN操作符强列推荐不使用的,因为它不能应用表的索引。用NOTEXISTS或 (外连接 +判断为空 )方案代替3、 IS NULL 或 IS NOT NULL 操作判断字段是否为空一般是

4、不会应用索引的,因为 B 树索引是不索引空值的。用其它相同功能的操作运算代替, a is not null改为 a0或a等。不允许字段为空,而用一个缺省值代替空值,如业扩申请中状态字段不允许为空,缺省为申请。避免在索引列上使用IS NULL 和 IS NOT NULL 避免在索引中使用任何能够为空的列 , ORACLE将无法使用该索引对于单列索引 , 如果列包含空值 , 索引中将不存在此记录 . 对于复合索引 , 如果每个列都为空 , 索引中同样不存在此记录 . 如果至少有一个列不为空 ,资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。 存在于索引中 例: 如果唯一性索引建立在表

5、的A 列和 B列上 , 而且表中存在一条 的A,B 值为 (123,null) , ORACLE将不接受下一条具有相同A,B 值( 123,null)的 ( 插入 ). 然而如果所有的索引列都 空, ORACLE 将 整个 空而空不等于空. 因此你能 插入1000 条具有相同 的 , 当然它 都是空!因 空 不存在于索引列中, 因此 WHERE子句中 索引列 行空 比 将使ORACLE停用 索引.低效 : (索引失效 )SELECTFROM DEPARTMENT WHERE DEPT_CODE ISNOTNULL;高效 : (索引有效 )SELECTFROM DEPARTMENT WHERE

6、DEPT_CODE =0;4、 及 2与 A=3的效果就有很大的区 了 , 因 A2 时 ORACLE会先找出 2 的 索引再 行比 , 而 A=3 时 ORACLE 直接找到 =3 的 索引。用 =替代 高效 :SELECTFROM DEPARTMENT WHERE DEPT_CODE =0;资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。低效 :SELECT*FROM EMPWHERE DEPTNO 3两者的区别在于,前者 DBMS将直接跳到第一个DEPT等于 4 的记录而后者将首先定位到DEPTNO=3的记录而且向前扫描到第一个DEPT大于 3 的记录 .5、 LIKE 操

7、作符 :LIKE 操作符能够应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,可是如果用得不好则会产生性能上的问题,如 LIKE %5400%这种查询不会引用索引 , 而 LIKE X5400%则会引用范围索引。 一个实际例子 : 用 YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE%5400% 这个条件会产生全表扫描 , 如果改成 YY_BHLIKE X5400% OR YY_BHLIKE B5400%则会利用 YY_BH的索引进行两个范围的查询,性能肯定大大提高。6、 用 EXISTS 替换 DISTINCT:当提交一个包含一对多表信息 ( 比如部

8、门表和雇员表 ) 的查询时 , 避免在 SELECT子句中使用 DISTINCT. 一般能够考虑用 EXIST 替换 , EXISTS使查询更为迅速 , 因为 RDBMS核心模块将在子查询的条件一旦满足后 , 马上返回结果 .例子 :资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。( 低效 ):SELECTDISTINCT DEPT_NO,DEPT_NAMEFROM DEPT D , EMP EWHERE D.DEPT_NO = E.DEPT_NO( 高效 ):SELECT DEPT_NO,DEPT_NAMEFROM DEPT D WHEREEXISTS (SELECTXFROM

9、 EMP EWHERE E.DEPT_NO = D.DEPT_NO);如 :用 EXISTS 替代 IN 、 用 NOT EXISTS替代 NOT IN:在许多基于基础表的查询中, 为了满足一个条件, 往往需要对另一个表进行联接 . 在这种情况下 , 使用 EXISTS(或 NOT EXISTS)一般将提高查询的效率 . 在子查询中 ,NOT IN 子句将执行一个内部的排序和合并 . 无论在哪种情况下 ,NOT IN 都是最低效的 ( 因为它对子查询中的表执行了一个全表遍历 ). 为了避免使用 NOT IN , 我们能够把它改写成外连接 (Outer Joins) 或 NOT EXISTS.例

10、子 :( 高效 ):SELECT*FROM EMP基(础表 )WHERE EMPNO 0ANDEXISTS (SELECTXFROM DEPTWHERE DEPT.DEPTNO= EMP.DEPTNO ANDLOC=MELB)( 低效 ):SELECT*FROM EMP基(础表 )WHERE EMPNO 0AND DEPTNOIN资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。(SELECT DEP TNOFROM DEPT WHERE LOC =MELB)7、 用 UNION替 OR ( 适用于索引列 )一般情况下 ,用 UNION替 WHERE子句中的OR 将会起到 好的效果

11、 . 索引列使用 OR 将造成全表 描 . 注意 , 以上 只 多个索引列有效 . 如果有 column 没有被索引 , 效率可能会因 你没有 OR而降低 . 在下面的例子中 , LOC_ID 和 REGION上都建有索引 .( 高效 ):SELECTLOC_ID,LOC_DESC,REGIONFROMLOCATIONWHERELOC_ID =10 UNIONSELECTLOC_ID , LOC_DESC, REGIONFROMLOCATIONWHERE REGION =MELBOURNE( 低效 ):SELECT LOC_ID,LOC_DESC,REGIONFROMLOCATION WHER

12、ELOC_ID= 10OR REGION = MELBOURNE如果你 持要用OR, 那就需要返回 最少的索引列写在最前面.8、 用 IN 来替 OR 是一条 易 的 , 可是 的 行效果 , 在ORACLE8i下 , 两者的 行路径似乎是相同的低效 :SELECT.FROMLOCATION WHERE LOC_ID =10OR LOC_ID=20OR资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。LOC_ID=30高效 :SELECTFROM LOCATION WHERE LOC_IN IN (10,20,30);二、 SQL 句 构 化1、 SELECT子句中避免使用*:2、 用 TRUNCATE替代 DELETE :用 TRUNCATE替代 DELETE 除全表 : ( 大数据量的表用次方法 )当 删 除 表 中 的 记 录 时 , 在 一 般 情 况 下 , 回 滚 段 (rollback segments ) 用来存放能 被恢复的信息 . 如果你没有 COMMIT事务,ORACLE会将数据恢复到 除之前的状 ( 准确地 是恢复到 行 除命令之前的状况 ) 而当运用 TRUNCATE时 , 回 段不再存放任何可被恢复的信息 .3、 用 Where 子句替 HAVING 子句 :避

温馨提示

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

评论

0/150

提交评论