sql语句的执行过程和优化

一、执行过程

在这里插入图片描述

二、优化

1.select查询优化

(1)保证不查询多余的列与行,应尽量避免全表扫描

尽量避免select * 的存在,使用具体的列代替*,避免多余的列。
使用where限定具体要查询的数据,避免多余的行
使用top,distinct关键字减少多余重复的行
给经常查询或需要排序的数据加上索引。

(2) 慎用distinct关键字

distinct在查询一个字段或者很少字段的情况下使用,会避免重复数据的出现,给查询带来优化效果。
但是查询字段很多的情况下使用,则会大大降低查询效率。
很明显带distinct的语句cpu时间和占用时间都高于不带distinct的语句。原因是当查询很多字段时,如果使用distinct,数据库引擎就会对数据进行比较,过滤掉重复数据,然而这个比较,过滤的过程则会毫不客气的占用系统资源,cpu时间。

(3)慎用union关键字

关键字主要功能是把各个查询语句的结果集合并到一个结果集中返回给你,满足union的语句必须满足:1.列数相同。
2.对应列数的数据类型要保持兼容。
执行过程:
依次执行select语句–>>合并结果集—>>对结果集进行排序,过滤重复记录。
这样效率就很低。

--exist代替in
select id from table where num exist(1,2,3,4,5,6)
--where字句使用or连接条件的替代方案
select id from table where num=10
union
select id from table where num=20;
 
--连续的数值,能用between就不要用in
select id from table where num between 1 and 3;
 
--使用参数的替代方案
--如果在where子句中使用参数(num = @num;),也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引的输入项。
select id from table where num=@num;
替代为:强制查询使用索引:
select id from table with(index(索引名)) where num=@num;
 
--使用表达式的替代方案
select id from table where num/2=100;
替代为
select id from table where num=100*2;
 
--使用函数操作的替代方案
select id from t where substring(name, 1, 3) = ’abc’–name; //以abc开头
替代为
select id from t where name like ‘abc%’;//单个百分号

(4)判断表中是否存在数据

select count(*) from product 
select top(1) id from product

下面就很快

(5)连接查询的优化

先你要弄明白你想要的数据是什么样子的,然后再做出决定使用哪一种连接,这很重要。

各种连接的取值大小为:
内连接结果集大小取决于左右表满足条件的数量。
左连接取决与左表大小,右相反。
完全连接和交叉连接取决与左右两个表的数据总数量。

2.insert插入优化

insert into select批量插入,明显提升效率。所以尽量避免循环插入

3.优化修改删除语句

如果你同时修改或删除过多数据,会造成cpu利用率过高从而影响别人对数据库的访问。
如果你删除或修改过多数据,采用单一循环操作,那么会是效率很低,也就是操作时间过程会很漫长。
折中的办法就是,给个范围,分批操作数据。

delete product where id<1000
delete product where id>=1000 and id<2000
delete product where id>=2000 and id<3000

4.其他方面

索引的设计,详情可点击
尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
尽量避免大事务操作,提高系统并发能力。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值