一、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已经自己做了优化,所以那些优化方式已经不需要了。