没有最大吞吐量
合理的预期
资源问题
目标: 通过一系列的手段使得系统协调、平衡的运作,实现资源利用最大化
阻塞运算符和非阻塞运算符
逻辑运算符和物理运算符
数据访问运算符
表
- 堆表
- 聚集索引表
扫描运算符
- 表扫描
- 聚集索引扫描
- 非聚集索引扫描
查找运算符
索引没有覆盖,性能就有问题
- 聚集索引查找
- 非聚集索引查找
关联运算符
- join, 嵌套循环
合并连接
哈希连接(散列连接)
聚合运算符
- min
- max
- sum
逻辑运算符
物理运算符 ,流聚合,哈希聚合
健壮的查询sql语句
select语句组成部分
- 需要查询的表
- 查询的字段
- 查询出符合哪些特定条件的数据
- 对数据进行排序、汇总等操作
select *
from Person.Address as a
join Person.StateProvince as sp
on a.StateProvinceID=sp.StateProvinceID
where sp.Name='Colorado';
问题:
- 查询了所有字段,影响查询效率
- 没有限定结果集 ,可以分页 ,top,
总结:
- 不要插where字段里面进行计算
- where字段里面尽量使用索引,
- 可以针对不同查询语句一起查询,对比查询计划
- Orderby字句性能取决于参与排序操作的数据量的大小
- 执行计划根据查询语句可能会提示创建索引
- 排序会产生中间数据,存储在tempdb,tempdb所有数据库共享,避免tempdb会占用大量磁盘,尽量使用有索引的字段排序
- 分组统计,也会使用排序,可以考虑创建索引
- 索引不能太多,也要取舍
健壮的update语句
update会创建锁
健壮的delete语句
delete会创建排他锁, 也会操作索引,会记录日志
大量数据删除 会有性能影响
总结
合理的判断因素
- 是否有合适的索引可供使用
- 字段是否有函数计算
- 返回结果集是否过大
- 是否仅查询出需要的字段
关联查询(多表查询)
嵌套循环是较好的查询方式
给大表创建索引较为划算
嵌套循环需要 字段都有索引
合并连接, 使用一个表的索引
哈希连接,两个表都没索引,可考虑其中一个表创建索引
嵌套性能最好, 哈希最差,
不同情况 给大表 或者小表增加索引 提升性能
子查询
- 子查询尽量集中在where字句中,方便阅读
- 在一个语句中,子查询数量不超过3个,整个语句设计的表不超过5个
- 避免在子查询中对大量的数据进行汇总或者排序操作
- 尽量缩小子查询中可能返回的结果集,涉及的数据量尽可能小
- 尽量使用确定的判断符号 =,in,exist ,避免使用any,all
执行计划一样,性能一样
sqlserver 2017 以上自动优化
查询存储
强制执行计划
自动优化
候选执行计划
持续监控,自学习,验证 完成自动优化