第24/24周 数据库维护(Database Maintenance)

哇哦,光阴似箭!欢迎回到性能调优培训的最后一期。今天我会详细讲下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

从代码里你可以看到,你可以指定不同的碎片等级作为参数(FragmentationLevel1FragmentationLevel2)。最后对于这些碎片等级你指定你想要进行的索引操作(FragmentationLowFragmentationMediumFragmentationHigh)。在SQL Server里它是非常简单,却是非常强大的进行索引维护操作的方法。试下——用了包你忘不了!!

小结

在今天的性能调优培训里,我们谈了SQL Server里的数据库维护。你已经学到经常进行索引维护操作来摆脱索引碎片非常重要。因为索引碎片会在存储子系统引入随机I/O,它会降低磁盘读取操作。另外我想你展示通过使用Ola Hallengren提供的SQL Server维护解决方案进行非常高效的索引维护操作。

我希望和我一起的24个星期的性能调优培训很有收获,你已经学到了SQL Server里一些新的东西,尤其是性能调优和故障排除。欢迎大家给我留言,把你的想法告诉我!!再一次感谢您关注性能调优培训,感谢您和我一起度过这个24个星期的培训!! 谢谢您的一路陪伴!!!

时间: 2024-08-02 15:11:32

第24/24周 数据库维护(Database Maintenance)的相关文章

2018.1.24 7周3次课

七周三次课(1月24日) 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法 10.11 Linux网络相关 用ifconfig命令查看网卡IP 前面曾用过ip addr这个命令来查看系统的IP地址.其实在centos 7之前,我们使用最多的命令是ifconfig,它类似于Windows的ipconfig命令,后面不加任何选项和参数时,只打印当前网卡的相关信息 (如子网掩码. 网关等).

Magento database maintenance

OverviewThis article examines the various ways to maintain an efficient Magento database, even when large in size. Magento does many things well, but maintaining an efficient database is not one of them. Having many products is a good reason to have

[Knowledge-based AI] {ud409} Lesson 24: 24 - Meta-Reasoning

Mistakes in Reasoning and Learning Beyond Mistakes: Knowledge Gaps The Blurred Line Between Cognition and Metacognition Strategy Selection Strategy Integration Optional Reading: Metacognition in Computation: A selected research review by Michael T. C

天猫 小游戏 24 point

游戏规则:给你四个整数,当然他给的是有解的,然后用' +  -  *   /   (  )   ,这几种符号任意组合,使运算结果等于24; 用代码快速解决问题,呵呵... 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 #include<string> 7 #include<

JavaSE_ 多线程 总目录(23~24)

黑马程序员_JavaSE学习总结第23天_多线程123.01 多线程程序的引入23.02 进程概述及多进程的意义23.03 线程概述及多线程的意义23.04 并行和并发的区别23.05 Java程序运行原理和JVM的启动是多线程的吗23.06 实现多线程及多线程方式1的思路23.07 多线程方式1的代码实现23.08 获取和设置线程对象名称23.09 线程调度及获取和设置线程优先级23.10 线程控制之休眠线程23.11 线程控制之加入线程23.12 线程控制之礼让线程23.13 线程控制之守护

24点——判断4个数能否经过运算使得结果为24

rqnoj74 Attention: 1.容易忽略(a[1]_a[2])_(a[3]_a[4]) 模式 2.通过两个整数相除,若保存结果为实型形式,不仅设置保存结果的变量为实型,而且还要1.0*x/y. Way1: 从所有的数中任意找到两个,并选择任意运算符并运算,使得两个数变成一个数,最后只剩下一个数,则该数为式子的值. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 5 //正常思路的

java根据日期计算24节气

1 package com.test; 2 3 import java.util.Calendar; 4 import java.util.Date; 5 6 /** 7 * Created by json 8 */ 9 public class SolarTermsUtil { 10 /** 11 * 计算得到公历的年份 12 */ 13 private int gregorianYear; 14 15 /** 16 * 计算得到公历的月份 17 */ 18 private int grego

24点游戏的算法实现

根据要求实现一个24点的游戏算法,要求如下: 输入:n1,n2,m1,m2 如果这个四个数的运算结果是24,则输出运算表达式 如11,8,3,5 输出:(11-8)*(3*5)=24 解法一:蛮力法,遍历所有的表达式组合,首先遍历所有的数字的排列组合,然后遍历运算符的组合,然后计算出 这个表达式的值,看其是否等于24 测试输入: 5,5,5,1 3,3,7,73,3,8,81,4,5,6 3,8,8,10 4,,410,10 9,9,6,2 11,8,3,5 #---*--- encoding=

CodeForces - 468A 24 Game

24点游戏大家应该很熟悉.通过加减乘除四则运算用四个数得到24. 现在考虑一个升级版的游戏:给定1...n这n个数,通过加.减.乘这三种运算得到24. Input 一个正整数n,n<=100000 Output 如果有解,第一行输出"YES" 接下来n-1行,每行输出一个操作,形如"a op b = c" .详情见样例. 无解则输出"NO" 注意:你的中间结果绝对值不得超过10^18 Sample Input 8 Sample Output