您的位置:首页 > 数据库

数据库优化

2015-11-04 00:00 176 查看
摘要: 数据库优化总结

首先对数据的优化不能仅仅盯着SQL语句,首先要解决的就是对数据库的设计,尽量符合数据的三大范式再去考虑优化SQL语句。

数据库的三大范式可以这样来简单理解:

第1规范:没有重复的组或多值的列,这是数据库设计的最低要求。

第2规范:每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组成部分,消除部分依赖,大部分情况下,数据库设计都应该达到第二范式。

第3规范:一个非关键字段不能依赖于另一个非关键字段。消除传递依赖,达到第三范式应该是系统中大部分表的要求,除非一些特殊作用的表。

一:SQL语句设计优化

1.外键约束会影响插入和删除的性能,所以对一些表如果可以没有外键尽量不要设置,如果对有些表中的数据有约束,最好在建表的SQL语句用描述完整性来实现,而不是用SQL程序中实现。

2.尽量使用相同的或非常类似的SQL语句进行查询,这样不仅充分利用SQL共享池中的已经分析的语法树,要查询的数据在SGA中命中的可能性也会大大增加。

3.SQL语句尽量全部大写,特别是表名和列名,尤其是在使用SQL命令的缓存功能更加要统一大小写。因为oracle 总是先解析SQL语句,把小写的字母转换成大写的再执行。

4.根据缓存的特点,尽量不要拼凑条件,而是使用占位符

5.避免不带任何条件的SQL语句的执行。没有任何条件的SQL语句在执行时,通常要进行FTS,数据库先定位一个数据块,然后按顺序依次查找其它数据,对于大型表这将是一个漫长的过程。

6.减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象可以减少对数据库的查询次数。

7.注意组合主键的字段次序,对于组合主键来说,不同的字段次序的主键的性能差别可能会很大,一般应该选择重复率低、单独或者组合查询可能性大的字段放在前面。

8.字段是数据库最基本的单位,其设计对性能的影响是很大的。

A、数据类型尽量用数字型,数字型的比较比字符型的快很多。

B、数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的。

C、 尽量不要允许NULL,除非必要,可以用NOT NULL+DEFAULT代替。

D、少用TEXT和IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用。

E、自增字段要慎用,不利于数据迁移。

9.索引

A、根据数据量决定哪些表需要增加索引,数据量小的可以只有主键。

B、根据使用频率决定哪些字段需要建立索引,选择经常作为连接条件、筛选条件、聚合查询、排序的字段作为索引的候选字段。

C、把经常一起出现的字段组合在一起,组成组合索引,组合索引的字段顺序与主键一样,也需要把最常用的字段放在前面,把重复率低的字段放在前面。

D、一个表不要加太多索引,因为索引影响插入和更新的速度。

10.创建视图

二:操作符优化

1、IN

用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:

ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。在业务密集的SQL当中尽量不采用IN操作符。
优化SQL时,经常碰到使用IN的语句,一定要用exists把它给换掉,因为Oracle在处理In时是按Or的方式做的,即使使用了索引也会很慢。
2、NOT IN

强列推荐不使用的,因为它不能应用表的索引。用NOT EXISTS或(外连接+判断为空)方案代替

3、IS NULL或IS NOT NULL操作 也是尽量避免

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 …FROM DEPARTMENTWHERE DEPT_CODE >=0;
低效:
SELECT*FROM EMPWHERE DEPTNO>3
两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPT NO=3的记录并且向前扫描到第一个DEPT大于3的记录.

5、LIKE操作符:尽量使用 'aaa%' 而不是 '%aaa%'

6、用EXISTS替换DISTINCT:

7、用UNION替换OR (适用于索引列)

8、用IN来替换OR

9、当判断真假是,如果带and 或者 or :(当存在 “where 条件1 and 条件2” 时,数据库先执行右边的语句)

and尽量把假的放到右边(一个为假就为假) Or尽量把为真的放到右边(一个为真就为真)

10、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。 如:

SELECT * FROM T1 WHERE F1/2=100

应改为:

SELECT * FROM T1 WHERE F1=100*2

参考博客:http://www.mahaixiang.cn/znseo/820.html

http://blog.csdn.net/axin66ok/article/details/7891386
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: