明确的性能低的定义:在现有资源还没有达到最大吞吐量的前提下,系统如果不能满足合理的预期表现。
最小化每个SQL的响应时间;
合理增加吞吐量;
减少网络延时
优化磁盘IO、CPU
能够协调、平衡的运行,合理的响应外部的请求,实现资源利用的最大化。
影响性能的常见因素:
1.数据库结构的设计
--了解业务
--优先考虑第三范式设计:字段冗余,避免多表关联的手段
适当冗余,非常适合查询情况多,更新情况少的情景;
--表关联尽可能少,使用简单SQL语句,避免过多的表关联
--坚持最小原则,尽可能小的字段类型
--适当的使用约束,从安全方面考虑
2.SQL语句的编写
3.数据文件的编写
TempDB系统库,是个全局资源,建议放在独立的磁盘,减少分配争用
4.硬件资源
Sql Server执行计划分析
SQL语句 --语法分析--绑定--优化--执行--返回结果
执行计划中,开销比例高的地方去做优化,会达到很好的优化效果;
Server=localhost\SQLEXPRESS;Database=master;Trusted_Connection=True;
C:\Program Files\Microsoft SQL Server\160\Setup Bootstrap\Log\20240505_191041
阻塞运算符 sort,需要很多内存去存储数据,再操作;
非阻塞运算符
如何编写健壮的SQL语句
不含聚集索引的表叫堆表;
包含聚集索引的表叫聚集索引表;
扫描运算符:表扫描、聚集索引扫描、非聚集索引扫描
表扫描指对堆表的全局扫描
聚集索引扫描
非聚集索引扫描:查询的数据包含在定义好的索引中,索引中以及包含数据,也被称为覆盖索引。 Index Scan Noncluster
扫描操作是性能最大杀手,1.需要大量的磁盘IO 2.消耗许多内存存储相关数据 3.当数据库缓存空间不足时,会应用相应的数据淘汰算法,清理缓存中的数据,填充新查找的数据;如果频繁的大量数据扫描,会导致缓存数据频繁交替。
查找:通过索引去定位数据;
聚集索引查找:
非聚集索引查找
键查找是一种标签查找,指使用了非聚集索引的语句中,用于查询不包含在当前索引中的字段。
RID Loop 行ID查找 【指表中,没有索引,连主键都没有的】
【没有索引,或索引范围没有覆盖,导致的】
--健壮的SQL语句
避免:select *,减少网络开销,更好的利用索引覆盖
限制返回结果集的大小,比如分页,防止扫描操作带来的大量IO和内存的使用
orderby 参与排序操作的数据量的大小,避免对大批量数据进行排序
对中间数据有影响TempDB数据库【存储查询过程中产生的中间数据】
如果对2亿数据进行排序,这些数据占内存5g,那么就需要5g的tempDB磁盘,而tempDB是公共资源,tempDB磁盘阻塞,会影响整个数据库的性能;
group by distinct 也是一样的
where子句:
--是否有合适的索引
--字段是是否存在函数计算
--结果集是否过大
--是否仅查询出需要的字段
语句的优化其实就是合理索引的选择。
覆盖索引,包含了当前查询语句所使用的所有字段信息
需要明确从什么表中,取出什么数据,合理利用索引
SARG写法,可以高效使用索引的写法
非SARG的写法有:
--where 左边出现标量函数 where UPPER(列名)='A' ,导致索引失效
可以改成 where (列名=‘A’ or 列名=‘a’)
where 列-1=某个值 改成 where 列=某个值+1
LEFT(列,3)=‘ABC’ 改成 列 like ‘ABC%’
DateAdd(day,7,列)>getdate() 改成 列>dateadd(day,-7,getdate())
隐式类型转换
子查询 嵌套在查询里的查询语句,出现在where子句,select某个字段表达式中,
尽量出现在where子句中,子查询数量不超过3个,整个语句涉及的表不超过5个;
避免在子查询中对大数据集进行汇总或排序操作;
尽量缩小子查询中可能返回的结果集
尽量使用确定性的判断符号,=,in exists,避免any,some,all
In exists 查询器会转换成inner join
not in not exists 查询器会转换成left join
索引解析
索引最能提升性能;
性能(查询);维护数据一致性;
快速定位到就得数据行;
索引的种类
索引体积=》索引的列数、列的数据类型、数据量
索引是把双刃剑,
标签:语句,--,扫描,sqlserver,笔记,查询,索引,where From: https://www.cnblogs.com/hcy-zyy/p/18173929