数据库优化方案

1. 高效地进行SQL语句设计:

通常情况下,可以采用下面的方法优化SQL对数据操作的表现:
(1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象可以减少对数据库的查询次数。
(2)尽量使用相同的或非常类似的SQL语句进行查询,这样不仅充分利用SQL共享池中的已经分析的语法树,要查询的数据在SGA中命中的可能性也会大大增加。
(3)避免不带任何条件的SQL语句的执行。没有任何条件的SQL语句在执行时,通常要进行FTS,数据库先定位一个数据块,然后按顺序依次查找其它数据,对于大型表这将是一个漫长的过程。
(4)如果对有些表中的数据有约束,最好在建表的SQL语句用描述完整性来实现,而不是用SQL程序中实现。

2、操作符优化

(1)IN操作符:经常碰到使用in的语句,一定要用exists把它给换掉,因为Oracle在处理In时是按Or的方式做的,即使使用了索引也会很慢

(2)NOT IN操作符:不能应用表的索引。用NOT EXISTS或(外连接+判断为空)方案代替

(3)IS NULL或IS NOT NULL操作:低效: (索引失效) SELECT …FROM DEPARTMENT WHERE DEPT_CODE ISNOTNULL;高效: (索引有效)SELECT …                             FROM DEPARTMENT WHERE DEPT_CODE >=0;

(4)>及 < 操作符(大于或小于操作符):用>=替代>  高效: SELECT …FROM DEPARTMENT WHERE DEPT_CODE >=0;低效:SELECT*FROM EMPWHERE DEPTNO >两者的            区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPT NO=3的记录并且向前扫描到第一个DEPT大于3的记录.

(5)LIKE操作符:LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’这种查询不会引用索引,而LIKE‘X5400%’则会引用范围索引

(6)用EXISTS替换DISTINCT: 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   (SELECT'X'FROM EMP EWHERE E.DEPT_NO = D.DEPT_NO);

(7)用UNION替换OR (适用于索引列):用UNION替换WHERE 子句中的OR 将会起到较好的效果.对索引列使用OR 将造成全表扫描  (高效): SELECT LOC_ID,LOC_DESC,REGIONFROM LOCATION WHERE LOC_ID =10   UNIONSELECT LOC_ID , LOC_DESC ,  EGIONFROM LOCATION WHERE REGION ='MELBOURNE'  (低效):     SELECT LOC_ID,LOC_DESC,REGIONFROM LOCATION WHERE LOC_ID= 10OR REGION = 'MELBOURNE'  如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面.

(8)用IN来替换OR: 低效:  SELECT….FROM LOCATION WHERE LOC_ID =10OR LOC_ID=20OR LOC_ID=30  高效: SELECT…FROM LOCATION WHERE LOC_IN IN (10,20,30);

3、SQL语句结构优化

(1)、SELECT子句中避免使用‘ * ‘:

(2)、用TRUNCATE替代DELETE :

(3)、用Where子句替换HAVING 子句:

(4)、sql语句用大写  因为oracle 总是先解析sql语句,把小写的字母转换成大写的再执行。

(5)、在Java代码中尽量少用连接符“+”连接字符串!

(6)、避免改变索引列的类型.:

7、优化GROUP BY:  提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY之前过滤掉.下面两个  低效:  1SELECT JOB,AVG(SAL)FROM EMP GROUPby JOBHAVING JOB= 'PRESIDENT' OR JOB ='MANAGER' 

高效:  1SELECT JOB,AVG(SAL)FROM EMP WHERE JOB ='PRESIDENT'OR JOB='MANAGER'GROUPby JOB

转载于:https://www.cnblogs.com/bobo242643/p/7097571.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值