数据库SQL调优
1、创建索引
(1) 要尽量避免全表扫描,首先应考虑在where 及order by涉及的列上建立索引
(2) 在经常需要进行检索的字段上创建索引,一个表中的索引最好不要超过6个
2、避免在索引上使用计算
3、使用预编译查询
(1) 程序中通常是根据用户的输入来动态执行SQL ,这时应该尽量使用参数化SQL,这样不仅可以避免SQL 注入漏洞攻击,最重要数据库会对这些参数化SQL进行预编译,这样第一次执行的时候DBMS会为这个SQL语句进行查询优化并且执行与便于,这样以后再执行这个SQL的时候就直接使用预编译的结果,这样可以大大提高执行的速度
4、调整where字句中的连接顺序
(1) DBMS一般采用自上而下的顺序解析where字句,根据这个原理表连接最好写在其他where条件之前,那些可以过滤掉最大数据记录
5、尽量将多条SQL语句压缩到一句sql中
(1) 每次执行SQL的时候都要建立网络连接,进行权限校检、进行SQL 语句的查询优化发送执行结果,这个过程是非常耗时的,因此尽量避免过多的执行SQL语句,能够压缩到一句SQL执行的语句就不要用多条来执行
6、用where字句替换having字句
(1) Having只会只会在检索出所有记录之后才对结果集进行过滤,而where则是在聚合前刷选记录,having中的条件一般用于聚合函数的过滤,初次之外,应将条件写在where字句中
7、使用表的别名
(1) 涉及多张表时,使用表别名可以减少解析的时间并减少哪些列名歧义引起的语法错误
8、使用UNION ALL替换UNION
9、使用临时表暂存中间结果
(1) 临时表避免了多次扫描主表,减少了程序中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能,但是也得避免频繁创建和删除临时表,以减少系统表资源的消耗
10、只在必要的情况下使用事务begin translation
11、尽量避免使用游标
(1) 尽量避免向客户返回大数据量,若数据量过大,应该考虑相应的需求是否合理,因为游标的效率较差,如果游标操作的数据超过一万行,那么应该考虑改写
12、用varchar/nvarchar代替char/nchar
(1) 变长字段存储空间小,变长字段的null是不占用空间的
13、查询语句优化
(1) 任何地方不要使用* ,要用具体的字段名替换*
(2) 尽量避免在where子句中进行null值判断,否则导致引擎放弃使用索引而进行全表扫描
(3) 不能前置%
(4) 对于连续的数值,能用between就不要用in了
(5) 如果查询的两个表相当,那么用in和exists差别不大
(6) 考虑在where及order by涉及涉及的列上建立索引
(7) 避免在where字句中使用!=或<>操作符
(8) 避免在where字段字段进行表达书和函数操作
14、更新update语句优化
(1) 如果只更改1、2个字段,不要update全部字段,频繁调用会引起明显的性能消耗,同时带来大量的日志
15、删除delete语句优化
(1) 最高效的删除重复记录的方法
DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
16、插入insert语句优化
(1) 如果一次插入数据量很大,可以使用select into代替create table,避免造成大量log,如果数据量不大,应先create table 然后insert
17、避免频繁创建和删除临时表,以减少系统表资源的消耗
18、避免向客户返回大量的数据量
19、尽量避免大事务操作