SQLSERVER⽇常运维巡检系列之三——结构设计
前⾔
做好⽇常巡检是数据库管理和维护的重要步骤,⽽且需要对每次巡检⽇期、结果进⾏登记,同时可能需要出⼀份巡检报告。 本系列旨在解决⼀些常见的困扰:
不知道巡检哪些东西
不知道怎么样便捷体检
机器太多体检⿇烦
⽣成报告困难,⽆法直观呈现结果
前⾯两篇对服务器软硬件配置、数据库概况进⾏了巡检,下⾯我们要对数据库的⼀些结构设计进⾏检查,这些检查主要针对系统开发初期⼀些不优化的结构设计或在系统不断有新功能增加或运维变动⽽产⽣的结构变化。
消谐柜物理结构概览
在【检查项】-【全部】中查看每个数据库的信息,当数据库结构未通过常规检查,平台会提⽰出警告。
注:检查信息主要包含不规范的表、缺失索引、⽆索引外键、没有使⽤的索引、重复索引、⽼化的索引。
不规范的表
在【数据库】-【不规范的表】中检查系统中表是否存在有不规范设计。这些不规范设计主要包含⽆聚集索引,使⽤旧数据类型,聚集索引的列是随机增长的(GUID,uniqueidentifier类型)
注:
1.微软建议在表中都建议有聚集索引。聚集索引除了可以提⾼查询性能之外,还可以按需重新⽣成或重新组织来控制表碎⽚。
2.在 Microsoft SQL Server 的未来版本中将删除 ntext、text 和 image 数据类型。请避免在新开发⼯作中使⽤这些数据类型,并考虑修改当前使⽤这些数据类型的应⽤程序。请改⽤、和。
3.聚集索引本⾝是要排序的,⽽GUID(uniqueidentifier类型)这样插⼊数据时导致过多的页拆分。 缺失索引
(图略)
数据库设计中索引是性能的⼀⼤关键,当数据库缺失⼤量索引,那么也必然导致数据库的性能很差。
⽆索引外键
(图略)
对主表数据操作时(如删除),需要到外键表中查校验,如果缺少外键索引可能导致全表扫描,严重影响性能。
当在查询中组合相关表中的数据时,经常在联接条件中使⽤外键列,⽅法是将⼀个表的 FOREIGN KEY 约束中的列与另⼀个表中的主键列或唯⼀键列匹配。索引使数据库引擎可以在外键表中快速查相关数据,提升性能。
没有使⽤的索引
(图略)
随着开发和优化的进⾏,很多⼈会对数据库进⾏索引的创建操作,很多时候创建了⼀个较优的联合索引或者覆盖索引,会让原本单列的索引失去使⽤的场景,这部分索引会出现在,长时间未使⽤的索引中,建议删除。
重复索引
(图略)
金融查询 随着开发和优化的进⾏,很多⼈会对数据库进⾏索引的创建操作,那么页难免会产⽣⼀些功能相近或相同的索引,索引本⾝也是有维护成本,在更新、插⼊、删除时会有⼀定的开销,那么重复的索引只会增加这部分维护开销。
⽼化的索引
(图略)
索引维护是配置常规维护任务之⼀,随着数据的不断写⼊和变更,会产⽣⼤量的索引碎⽚,缺少维护任务的索引,⽆法及时重新组织索引数据,导致索引低效,甚⾄失效。
程序设计结构概览
1.在【检查项】-【结构设计】中查看会话信息和执⾏计划,当设计结构未通过常规检查,平台会提⽰出警告。
注:检查信息主要会话隔离级别、是否存在带有事务的长时间会话、执⾏计划中是否存在隐式转换。 会话信息
1.在【会话】-【空闲会话】中查看会话信息。
注:主要关注,长时间未关闭会话和长时间未关闭并带有事务的会话。长时间带有事务的会话可能是因为程序连接泄露导致,长时间带有事务会阻塞其他会话的正常进⾏,造成系统卡死等严重性能问题。
2.在【会话】-【概览】页中查看会话详细信息,主要关注事务隔离级别。
新菠萝灰粉蚧 事务隔离级别简述:事务隔离级别主要控制查询(共享锁),隔离级别越⾼并发能⼒就越差。(详细信息请参见:平台技术资料,最佳配置)
如果在程序中发现⼤量REPEATABLE_READ(可重复读)或SERIALIZABLE(可序列化),请检查程序是否有必要使⽤⾼级别的隔离级别,⽽导致阻塞等待增加,数据库并发能⼒下降。
注:如果在系统中存在⼤量⾼级别的事务级别,请确认是否需要⾼的隔离级别⽽牺牲并发能⼒。
隐式转换
存在隐式转换的执⾏计划:语句存在隐式转换导致性能消耗,或不能使⽤索引。
玻璃模具设计 注:隐式转换常发⽣在表设计的字段类型(varchar)优先级别低于程序传递的参数类型(nvarchar)
在【执⾏计划】-【隐式转换】页中查看具体信息。辐射取暖器
黄粉虫筛选机
总结
整个程序和数据库是否稳定、⾼效和结构设计的好坏密不可分,在巡检过程中,结构设计时⽐较重要的⼀部分。很多时候运维⼈员和设计⼈员、开发⼈员沟通不畅、专业技能有差距,所以结构设计常常出现问题。