面试题目-MSSql优化-sql语句优化

一、where条件优化


1、 不使用<>,因为用它只会产生全表扫描。(a<>0改为a>0 or a<0)


其实这部分sql已经进行了优化,当你写"a<>0"的时候,系统会帮你转换成"a>0 or a<0"

转换过程基本不耗费资源,手动写"a>0 or a<0"虽然有优化但是不多。

2、避免使用子查询


select * from  dbo.orders where oid = 
(select pid from  dbo.product where pid = 5)

会先执行子查询

select pid from  dbo.product where pid = 5

将查询出来的结果保存到内存中并且再次发送到数据库执行

select * from  dbo.orders where oid = (5)

不仅需要多次访问数据库,且需要多余内存保存中间结果。

子查询不仅导致多次访问数据库,且需要额外的内存,所以避免使用子查询。

可通过联表方式替代子查询:

select * from  dbo.orders o
inner join dbo.product p on p.pid = o.oid where p.pid = 5

涉及知识点:

子查询的查询规则

二、结果集


1、 union在进行表链接后会筛选掉重复的记录。因此会用到排序运算。(若确定没有重复记录的用union all 代替union)


union去重步骤:

→1.union前后所有结果集合并

→2.对结果集排序

→3.扫描一遍比较前一行与当前行,相同的舍弃

union会进行全表扫描,若不需要去重则尽量用union all

涉及知识点:

union运算符的运行流程

三、索引优化


1、单列索引场景:


在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。

这一列不同的值越多,二叉树的节点越多,二叉树节点越多,二叉树越有价值。

涉及知识点:

二叉搜索树;

2、组合索引场景:


如果待排序的列有多个,可以在这些列上建立复合索引;
经常同时存取多列,且每列都含有重复值可考虑建立组合索引;

“且每列都含有重复值”这个条件看似没用,其实是有用的,因为如果其中一个列没有重复值,

是唯一的,那么我可以直接这个字段来做单索引,就没有必要做组合索引了。

涉及知识点:

“组合索引”的应用场景;

3、尽可能的使用索引字段作为查询条件,尤其是聚簇索引


4、当数据库表更新大量数据后,删除并重建索引可以提高查询速度


数据库会把你索引里面添加的列进行排序,根据排序结果生成索引值,

查询数据的时候根据这个索引值使用二叉搜索树进行快速查询数据。

当你大量更新数据的时候(更新到索引里面添加的列),其实索引映射就不那么准确了。

所以如果大量更新数据后,需要删除重建索引。

涉及知识点:

索引更新;

二叉搜索树;


本文是对

https://www.cnblogs.com/haiyabtx/p/3669863.html

的二创,主要是对优化方法的原因、原理添加了详细的解释和例子(原文只说了怎么做没说为什么这么做),且优化排版,让读者知其然更知其所以然;


在原作者整理的基础上,23条只剩下5条,其中有一些是个人验证以后得出是错误的,有一些是新版sqlserver已经自己做了优化,所以那些优化方式已经不需要了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值