【一些网课后的笔记与后续学习的思考】
平时我们觉得查数据很慢,这个慢是什么意思?
就是在现有资源达到最大吞吐量的前提下,系统不能满足合理的数据请求的一些表现。
一、调优时,可以从以下五点考虑
① 最小化SQL相应时间
② 合理地增加吞吐量
③ 减少网络延迟
④ 优化IO
⑤ 减少最小化
二、调优要达到的目标
使系统能有协调、平衡地运作,合理地响应外部及内部请求,实现资源利用的最大化。
三、性能调优的误区
1、增加硬件就能缓解性能问题
增加硬件或许会让系统性能更好,但没有解决真正的问题所在
2、只要数据库性能好就没问题
不要把很多本该在应用层实现的逻辑放到数据库实现,以此希望优化数据库就能解决性能问题
3、任何的数据库性能问题都可以通过索引解决
性能问题的解决思路:
检查日志,发现问题所在——优化SQL语句或修改表结构——最后才是考虑建立索引
4、编码过于激进或极端
任何功能都有自己的场景,要根据自己的企业形式、开发模式和技术栈去综合考虑,切忌一刀切(比如:要么全部使用存储过程实现功能,要么完全不允许使用存储过程)
四、影响性能的常见因素:
1、数据库结构的设计
①了解业务、满足业务,性能只是业务之外的附属属性
②优先考虑第三范式设计(字段冗余可以避免过多的表关联,但是字段冗余会让维护成本提升。这时就需要对维护成本和过
③多关联查询影响性能进行权衡)
④表关联要尽可能地少
⑤坚持最小原则:使用尽可能小的字段长度
⑥在适当的地方使用约束:但是,安全方面还是最重要的,千万不要为了性能而放弃对安全的追求!因为我们并不需要极致的性能,而是性能在一定范围内可以承受就可以了。
2、事务和隔离的级别
3、T-SQL的编写
数据库性能的优化,基本都是针对SQL语句的优化。编写健壮的T-SQL语句,让我们的代码更稳定,更高效地执行
①编写语句前,要完全了解业务的需求,知道表的用途和用法,明确查询目的
②只查询需要的字段,避免返回所有字段(select * from )
③限定好查询地结果集(select top 100 …)
④使用有效的索引,确保业务需要用到的过滤字段能使用索引,是否有必要在字段上添加索引
(当需要对数据进行过滤时,应当优先考虑使用索引字段。要是有多个索引字段可供选择,优先选择筛选率较高、重复率较低的索引字段作为过滤条件)
⑤不要对有索引的字段使用计算、函数等运算符,因为会导致查询优化器无法使用索引进行数据的检索,从而导致表触发扫描操作
⑥order by字句的性能,取决于参与排序操作的数据量大小。
(排序操作会在数据筛选完以后,对筛选出的结果集进行排序。因此对需要进行排序的操作,应将排序的操作控制在结果集和数据量都尽量小的查询中,避免不必要的CPU消耗。不然,当排序操作超过可以分配的内存大小时,就会把排序的中间数据放在TempDb,增加I/O操作,导致性能大大下降)
⑦尽量使用简单的SQL语句来实现业务功能
简单的SQL语句:只关联2-4个表、单表查询、只有2-3个过滤条件,并且有一个过滤条件明确可以使用索引查找操作
4、硬件资源
五、执行计划的分析
在SQL优化中,都是以SQL语句的执行计划中的开销去判断最优的语句。
SQL语句的处理流程如图示:
1、T-SQL语句
没啥好说的,就是你的SQL语句
2、语法分析
编译语法,检验语句和语法是否合规、正确,然后把T-SQL语句转化为逻辑查询树(树里包含各种逻辑代数运算:inner join…)