数据库SQL调优

一.创建索引
1.避免全表扫表,首先考虑在where及order by涉及的列建立索引
2.在经常需要进行检索的字段上创建索引,一个表的索引最后不要超过6个。提高了select的效率,但同时也降低了insert及update的效率。
二.避免在索引上使用计算
如果索引列是计算或者函数的一部分,DBMS的优化器将不会使用索引而是全表查询。
效率低:

select * from user where salary*22>11000(salary是索引列)

效率高:

select * from salary where salary>11000/22(salary是索引列)

三.使用预编译查询
程序根据用户的输入动态执行sql,尽量使用参数化sql。数据库会对这些参数化sql进行预编译。(不太懂)
四.调整where字句的连接顺序
DBMS一般自下而上解析where语句,表连接最好写在where之前,可以过滤掉掉大量记录。
五.多条sql语句压缩到一句sql(为什么?举例子)
六.用where替换having
having只会在检索出所有记录之后才会对结果进行过滤,where是在聚合前刷选记录。having用于聚合函数的过滤。
七.使用表的别名
八.用union all代替union
如果可以判断检索结果中不会有重复的记录时候,应该使用union all.
九.使用临时表暂存中间结果
采用临时表暂存中间结果可以避免多次扫描主表,减少程序执行中共享锁,阻塞,更新锁,减少阻塞,提高并发性能。避免频繁创建和删除临时表,减少系统表资源的消耗。
十.只有在必要的情况下才使用 事务begin translation
十一.尽量避免使用游标
十二.用varchar/nvarchar代替char/nchar
十三. 查询select语句优化
select具体字段
表A(小表),表B(大表)

select * from A where cc in(select cc from B)效率低,用到了A表上cc列的索引;
select * from A where exists (select cc from B where cc=A.cc)效率高,用到了B表的索引

相反

select * from B where cc in (select cc from A)效率高,用到了B表上cc列的索引;
select * from B where exists (select cc from A where cc=B.cc)效率低,用到A表cc列的索引

十四.更新update语句优化
不要update全部字段
十五.删除delete语句优化语句
delete from emp e where e.rowid > (select min(x.rowid) from emp x where x.emp_no=e.emp_no);
十六插入insert语句优化
新建临时表时,如果数据量大,使用select into代替create table,避免大量log。如果数据量不大,为了缓和系统表的资源,先create table,然后insert。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值