数据库优化方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库优化方案相关的知识,希望对你有一定的参考价值。

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

以上是关于数据库优化方案的主要内容,如果未能解决你的问题,请参考以下文章

[数据库优化]数据库SQL优化大总结之 百万级数据库优化方案

数据库SQL优化大总结1之- 百万级数据库优化方案

数据库SQL优化大总结之 百万级数据库优化方案

数据库SQL优化大总结之 百万级数据库优化方案

DataX大数据量同步优化方案

SQL数据库数据优化SQL优化总结( 百万级数据库优化方案)