[转帖]第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 ...
随机推荐
- 中文语音识别转文字的王者,阿里达摩院FunAsr足可与Whisper相颉顽
君不言语音识别技术则已,言则必称Whisper,没错,OpenAi开源的Whisper确实是世界主流语音识别技术的魁首,但在中文领域,有一个足以和Whisper相颉顽的项目,那就是阿里达摩院自研的Fu ...
- Java中单体应用锁的局限性&分布式锁
互联网系统架构的演进 在互联网系统发展之初,系统比较简单,消耗资源小,用户访问量也比较少,我们只部署一个Tomcat应用就可以满足需求.系统架构图如下: 一个Tomcat可以看作是一个JVM进程,当大 ...
- flutter中显示年月日、星期与时间
代码 import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'dart:async'; imp ...
- LeetCode 二分查找篇(69、33、704)
69. x 的平方根 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: ...
- 【华为云技术分享】玩转物联网IoTDA服务系列三-自动售货机销售分析场景示例
摘要:物联网解决方案中,作为数据主体的"物"可能数量会非常大,产生的数据已经无法通过传统的数据处理服务进行处理.如何分析与利用这庞大的物联网设备数据对物联网企业来说又是一个新的挑战 ...
- 数仓性能优化:倾斜优化-表达式计算倾斜的hint优化
本文分享自华为云社区<GaussDB(DWS)性能调优:倾斜优化-表达式计算倾斜的hint优化>,作者: 譡里个檔 . 1.原始SQL SELECT TMP4.TAX_AMT, CATE. ...
- 云计算的三种模式IaaS/PaaS/SaaS/BaaS对比:SaaS架构设计分析
SaaS--软件即服务(Software as a Service)的出现改变了传统使用软件转变为使用服务. SaaS与传统软件的最大区别是,前者按年付费租用服务,后者一次买断.这貌似只是" ...
- 再谈BOM和DOM(3):DOM节点操作-元素样式修改及DOM内容增删改查
操作节点,先得选择节点,就得知道节点选择器与DOM节点查找 DOM节点选择器 W3C提供了比较方便的定位节点的方法和属性 getElementById() 一个参数:元素标签的ID getElemen ...
- Snack3 3.1.10的新特性及应用
<dependency> <groupId>org.noear</groupId> <artifactId>snack3</artifactId& ...
- 无法获得数据库 'model' 上的排他锁。请稍后重试该操作
标题: Microsoft SQL Server Management Studio 数据库 "XXXX" 的 创建 失败. (Microsoft.SqlServer.Smo) 有 ...