[转帖]第24/24周 数据库维护(Database Maintenance)
https://www.cnblogs.com/woodytu/p/4795542.html
哇哦,光阴似箭!欢迎回到性能调优培训的最后一期。今天我会详细讲下SQL Server里的数据库维护,尤其是索引维护操作,还有如何进行数据库维护。
索引维护
作为一个DBA,数据库维护是你工作中非常重要的一部分,让数据库获得最佳性能。一个SQL Server数据库就像一辆车:它需要经常的检查来保证运行没有问题,副作用,且拥有最大可能的性能。SQL Server数据库最重要的部分是它的索引及其对应的统计信息对象。SQL Server运行一段时间后会有索引碎片,统计信息必须更新,这样的话查询优化器才可以为你生成“足够好”的执行计划。
我们来详细看下这2个东西。索引(聚集,非聚集)会产生碎片。索引意味着逻辑和物理排列顺序不再一致。如果你在传统旋转存储上存储你的数据库,索引碎片在你的存储子系统里带来随机I/O,与快速的循序I/O相比,它非常耗时。下图展示了索引碎片。

微软建议下列索引维护的最佳实践:
- 碎片低于10%:不进行维护
- 碎片在10-30%:进行索引重组操作
- 碎片大于30%:进行索引重建操作
除此之外,索引重组和索引重建操作应该只有在叶子层的页数至少有10000页才可以。如果你没有达到这个阈值,你不会看到随机I/O带来的副作用消失。索引重建(Index Rebuild)操作会完全重建你的索引。它是一个在事务日志里完全记录的“大”事务。在99%进度的时候回滚你的重建操作是个非常不好的想法,因为SQL Server需要把已做过的(有益的一面)全部重做一遍。因为你的回滚会花费很长时间。因为索引重建会重新生成你的整个索引,你的统计信息也会用全扫描更新。
另外,因为它是个大事务,如果这时你使用基于事务日志的HA技术就会有问题——例如数据库镜像或AlwaysOn可用组。SQL Server需要发送你的整个事务到镜像(或复制的地方)。那就意味着你的网络流量里有大量的事务日志记录。这对你的HA策略会有很大的副作用。
作为一个替代方法,索引重组(Index Reorganize)操作只处理你的索引的叶子层,重组叶子层的逻辑排序。因此,索引重组不会为你更新统计信息。索引重组只包含多个小的系统事务。因此它不会在事务日志上带来太大压力,因为虚拟日志文件可以为了更快的重用而被标记。索引重组操作对使用数据库镜像或AlwaysOn可用组都是有益的,因为使用索引重组操作你没有给网络流量里倒入大量的事务。
如何进行维护操作
我经常被问到的问题是在SQL Server里如何进行维护操作。我绝不,从未建议SQL Server提供的数据库维护计划(Database Maintenance Plans)。使用这些维护计划你使用大锤往SQL Server里砸:维护计划会重组/重建你的索引而不管它们的实际碎片!
我已经看过运行整晚在索引上进行索引重建的维护计划,尽管有些索引没有碎片。使用刚才提到的数据库维护计划,你就不能依据索引碎片情况进行维护。重组和重建索引是要根据索引碎片等级来的。因此我从不推荐这些数据库维护计划给任何人!
我推荐使用Ola Hallengren提供的SQL Server维护解决方案。这个解决方案包含一些列的存储过程,使用它们你可以继续宁数据库一致性检查,备份,还有索引维护操作。索引碎片等级就是你提供存储过程的参数值。我们来看看下列IndexOptimize存储过程的调用:

1 EXEC [master].[dbo].[IndexOptimize]
2 @Databases = 'AdventureWorks2012',
3 @FragmentationLow = 'INDEX_REBUILD_OFFLINE',
4 @FragmentationMedium = NULL,
5 @FragmentationHigh = NULL,
6 @FragmentationLevel1 = 10,
7 @FragmentationLevel2 = 30,
8 @PageCountLevel = 10000,
9 @SortInTempdb = 'N',
10 @MaxDOP = NULL,
11 @FillFactor = NULL,
12 @PadIndex = NULL,
13 @LOBCompaction = 'Y',
14 @UpdateStatistics = NULL,
15 @OnlyModifiedStatistics = 'N',
16 @StatisticsSample = NULL,
17 @StatisticsResample = 'N',
18 @PartitionLevel = 'N',
19 @TimeLimit = NULL,
20 @Indexes = NULL
21 @Delay = NULL,
22 @LogToTable = 'Y',
23 @Execute = 'Y'
24 GO

从代码里你可以看到,你可以指定不同的碎片等级作为参数(FragmentationLevel1, FragmentationLevel2)。最后对于这些碎片等级你指定你想要进行的索引操作(FragmentationLow, FragmentationMedium, FragmentationHigh)。在SQL Server里它是非常简单,却是非常强大的进行索引维护操作的方法。试下——用了包你忘不了!!
小结
在今天的性能调优培训里,我们谈了SQL Server里的数据库维护。你已经学到经常进行索引维护操作来摆脱索引碎片非常重要。因为索引碎片会在存储子系统引入随机I/O,它会降低磁盘读取操作。另外我想你展示通过使用Ola Hallengren提供的SQL Server维护解决方案进行非常高效的索引维护操作。
我希望和我一起的24个星期的性能调优培训很有收获,你已经学到了SQL Server里一些新的东西,尤其是性能调优和故障排除。欢迎大家给我留言,把你的想法告诉我!!再一次感谢您关注性能调优培训,感谢您和我一起度过这个24个星期的培训!! 谢谢您的一路陪伴!!!
注:此文章为WoodyTu学习MS SQL技术,收集整理相关文档撰写,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发作者更大的写作热情,非常感谢!
[转帖]第24/24周 数据库维护(Database Maintenance)的更多相关文章
- 第24/24周 数据库维护(Database Maintenance)
哇哦,光阴似箭!欢迎回到性能调优培训的最后一期.今天我会详细讲下SQL Server里的数据库维护,尤其是索引维护操作,还有如何进行数据库维护. 索引维护 作为一个DBA,数据库维护是你工作中非常重要 ...
- 使用opencv调用24*24点阵字库和8*16ASCII字库在图片显示文字数字
课程实验:编程读汉字点阵字库,把自己的名字和学号叠加到图片的右下位置. 主要步骤分为三部分 第一部分:读取图片(文件读取) 第二部分:读取文字并从字库中提取相应的编码(字库的存储原理) 第三部分:将相 ...
- Day 24 24.2:逆向分析2 - 完美世界案例
完美世界逆向分析 url:https://passport.wanmei.com/login?location=L3NhZmUv 定位到正确的断点位置 进行js改写操作 断点代码的关键字:setPub ...
- Day 24 24.1:逆向分析1 - Steam案例
STEAM逆向分析 url:https://store.steampowered.com/login/?redir=&redir_ssl=1 分析思路: 输入用户名和密码后,点击登录按钮,通过 ...
- SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to some database maintenance or reconfigure operations.
2017-11-01 09:49:44.35 spid166 SQL Server has encountered 1 occurrence(s) of cachestore flush for th ...
- (24/24) webpack小案例--自己动手用webpack构建一个React的开发环境
通过前面的学习,对webpack有了更深的认识,故此节我们就利用前面相关知识自己动手用webpack构建一个React的开发环境,就算是一个小案例吧. 注:此处使用的开发工具是Webstorm. 1. ...
- MySQL Crash Course #21# Chapter 29.30. Database Maintenance & Improving Performance
终于结束这本书了,最后两章的内容在官方文档中都有详细介绍,简单过一遍.. 首先是数据备份,最简单直接的就是用 mysql 的内置工具 mysqldump MySQL 8.0 Reference Man ...
- 第0/24周 SQL Server 性能调优培训引言
大家好,这是我在博客园写的第一篇博文,之所以要开这个博客,是我对MS SQL技术学习的一个兴趣记录. 作为计算机专业毕业的人,自己对技术的掌握总是觉得很肤浅,博而不专,到现在我才发现自己的兴趣所在,于 ...
- JavaSE_ 多线程 总目录(23~24)
JavaSE学习总结第23天_多线程123.01 多线程程序的引入23.02 进程概述及多进程的意义23.03 线程概述及多线程的意义23.04 并行和并发的区别23.05 Java程序运行原理和JV ...
- JavaSE学习总结第24天_多线程2
24.01 JDK5之后的Lock锁的概述和使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK ...
随机推荐
- Vulntarget-b-wp
Vulntarget-b 环境配置 centos7 用户 密码 root root vulntarget root 宝塔Linux面板http://192.168.0.104:8888/045b276 ...
- export详解
linux下export命令详解 export:将自定义变量设定为系统环境变量(当前shell中有效) 功能说明:设置或显示环境变量. 语 法:export [-fnp][变量名称]=[变量设置值] ...
- JavaFx之ScrollPane滚动板面、CheckBox复选框(二十四)
JavaFx之ScrollPane滚动板面.CheckBox复选框(二十四) 多个复选框时可能会超出屏幕,需要使用滚动版面. 布局方式:ScrollPane包括VBox.VBox 包括多个 Check ...
- Unix 文件权限位
简介 在 Unix 或者类 Unix 文件系统中,每个文件(或者目录,目录也被视为文件)都有自己的所属对象和一个与之相关的 Unix 用户组关联,可以通过设置对应的文件的权限标记指定对于所属用户.所属 ...
- Spring Cloud(一)Eureka
单体应用存在的问题 在传统应用程序中,一般都会将整个的应用程序作为一个单独的可执行文件部署到相应的服务器上执行.一般的应用程序结构可能如下图所示: 这种方式的优点很明显,比如:架构简单,服务之间调用逻 ...
- 【Android】深入Binder拦截
☞ Github ☜ ☞ Gitee ☜ 说明 Binder作为Android系统跨进程通信的核心机制.网上也有很多深度讲解该机制的文章,如: Android跨进程通信详解Binder机制原理 And ...
- 技术实操丨SoundNet迁移学习之由声音分类到语音情感识别
摘要:声音也是识别对象的一种重要数据源.其中根据声音来识别声音所处的环境也是语音识别的研究内容之一. 一.思路 1.SoundNet模型在视频数据中先预训练,视频任务可能是场景识别,可参考这篇文章So ...
- 一文带你了解两种Transformer文字识别方法
摘要:受Transformer模型的启发,目前一些学者将该结构应用到文本行识别中,以替代RNN,取得了良好的效果,如在HGA-STR和 SRN. 当前的文本行识别器为拥有更强的序列语义能力,模型多采用 ...
- PanGu-Coder:函数级的代码生成模型
摘要:华为诺亚方舟实验室语音语义实验室联合华为云PaaS技术创新实验室基于PanGu-Alpha研制出了当前业界最新的模型PanGu-Coder 本文分享自华为云社区<PanGu-Coder 函 ...
- DataLeap的全链路智能监控报警实践(二):概念介绍
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 概念介绍 基线监控 根据监控规则和任务运行情况,DataLeap的基线监控能够决策是否报警.何时报警.如何报警以及 ...