目前本人在看《SQL Server性能调优实战》 ,以下内容是本人看本书的笔记
数据库性能取决于各方面综合因素:
硬件,操作系统,软件
硬件:内存,CPU,磁盘
当服务器的物理内存不足时,会产生大量的磁盘I/O,给磁盘带来压力;
当内存不足时,一些占用CPU资源较多的对象可能就无法被正常缓存在内存中,需要使用大量的CUP资源来处理这些对象的计算,从而给CPU带来更大的压力
内存:
1.执行计划缓存
数据库引擎接收到需要执行的语句时,首先会经过一系列复杂的计算和分析,得到相应的执行计划,然后再根据执行计划进行各种操作,
由于执行计划的计算和分析需要的CPU资源比较多,所以很容易引起CPU资源的紧张,为了解决这个问题,数据库就会把执行计划缓存起来
2.数据缓存
若遇到数据访问操作符,则会首先检查对应的数据是否在数据缓存中,如果存在就从缓存中取数据,否则会从磁盘中读取数据,然后再把数据缓存到缓存中
如果数据库内存不足,数据库引擎会算法把不常用的缓存清理,把需要的数据从磁盘中读取并缓存到数据缓存中,这会引起大量的磁盘I/O,并且导致执行语句的执行效率低下
若大批的语句出现这种情况,就会导致服务器CPU占用率飙高。如果服务器CPU长期处于繁忙状态,并且数据库的磁盘I/O偏高,估计是数据库的内存达到了瓶颈
CPU:
数据库在进行任务调度,执行计划分析,排序等计算时都需要使用大量的CPU资源
CPU资源在30%上下时:当前服务器较空闲
CPU资源在60%上下时:当前服务器较繁忙
CPU资源达到80%时:服务器非常繁忙,就要查找原因了(通常情况下,一些执行效率较高,并且性能不理想的语句会造成这样的问题;少数情况下是由于数据库服务器达到了瓶颈)
针对高并发的数据库系统,建议使用如下配置方案:
将主数据库的数据文件拆分成多个文件
将数据文件和日志文件存放在不同的物理磁盘,从而提高I/O的并发。
系统数据库文件,特别是Tempdb的数据文件要放在独立的物理磁盘,并将数据文件拆分成多个,建议与逻辑CPU的个数相同,以提高并发
设计表建议:
尽可能的添加数据完整约束,例如:非空约束,默认值约束,check约束,唯一约束,外键约束等,这些约束的添加降有助于数据库关系引擎分析执行计划
使用尽可能小的字段类型,特别是大表,尽量小的空间将可以带来更佳的性能
表结构的设计应考虑业务需求带来的操作及频率,尽可能的使业务逻辑实现简洁,使用简单的SQL语句,可避免过多的表关联
编写SQL语句建议:
编写语句前,先明确已经完全理解了业务需求,并知道表的用途及用法
确定业务需要用到的过滤字段能否使用索引,是否有必要在字段上添加索引
不要多有索引的字段进行任何的计算,包括函数,因为这会导致无法使用索引进行数据检索,从而导致扫描操作
小表操作优先,以小表驱动大表,使其尽量使用NESTED LOOP-嵌套循环(NESTED LOOP是表关联操作的一种物理操作方式,它使用foreach的方式以较小数据量的数据集为驱动,内嵌foreach循环较大的表进行对比,其效率比其他几个关联操作高,)
只查询需要的字段,避免*
尽量使用简单的SQL语句来实现业务功能,如果功能过于复杂,可以考虑将其拆分成若干个简单的SQL语句
简单的SQL:
关联的表最多不超过4个
没有复杂的过滤条件,只有2到3个过滤条件,可以使用索引查找操作