第十章——维护索引(3)——通过重建索引提高性能

简介: 原文: 第十章——维护索引(3)——通过重建索引提高性能 前言:重建一个索引只是在内部删除并重建索引,使得碎片消失、统计信息更新、物理顺序重新排列组织。
原文: 第十章——维护索引(3)——通过重建索引提高性能

前言:

重建一个索引只是在内部删除并重建索引,使得碎片消失、统计信息更新、物理顺序重新排列组织。它会压缩数据页,按照填充因子填充适当的数据。如果有需要,也会添加新的数据页。这些操作有利于提高数据查找的速度,但是这个工作如果发生在大表上面,将是非常耗时耗资源的。

 

准备工作:

首先先要决定是否达到了重建索引的临界值。否则,重组索引会更好。当碎片超过30%,那么重建索引会比较好。

重建索引有两种方式,在重建之前应该考虑使用哪种会更好:

1、 脱机:脱机重建索引是默认选项。它会锁住整个表,知道重建结束,没有人可以访问这个表。如果表非常大,这将持续几个小时甚至更久。但是它运行得更快,并且占用Tempdb的资源更少。

2、 联机:如果环境不允许脱机,那么可以使用联机重建,但是会占用非常多的资源,如果表数据类型为varchar(max),nvarchar(max)和text类型,将不会在联机模式下工作。

注意:是否联机重建索引只有开发版和企业版可用。其他版本只有脱机重建。

 

步骤:

1、 创建测试表:


USE [AdventureWorks]
GO
 
IF EXISTS( SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'[dbo].[ordDemo]')
                    AND type IN( N'U' ) )
    DROP TABLE [dbo].[ordDemo]
GO
 
CREATE TABLE [dbo].[ordDemo]
    (
      [OrderID] [int] IDENTITY(1, 1)
                      NOT NULL ,
      [OrderDate] [datetime] NULL ,
      [Amount] [money] NULL ,
      [Refno] [int] NULL
    )
ON  [PRIMARY]
 
GO


再创建一个聚集索引idx_refno:

 USE [AdventureWorks]
GO

IF EXISTS ( SELECT  *
            FROM    sys.indexes
            WHERE   object_id = OBJECT_ID(N'[dbo].[ordDemo]')
                    AND name = N'idx_refno' ) 
    DROP INDEX [idx_refno] ON [dbo].[ordDemo] WITH ( ONLINE = OFF )
GO



现在使用下面的脚本重建索引:

 --使用联机方式重建索引idx_refno 
ALTER INDEX [idx_refno] ON [ordDemo] REBUILD WITH (FILLFACTOR=80,ONLINE =ON)
GO

--使用脱机方式重建索引idx_refno 
ALTER INDEX [idx_refno] ON [ordDemo] REBUILD WITH (FILLFACTOR=80,ONLINE =OFF)
GO

--使用脱机方式重建表上所有索引:
ALTER INDEX ALL ON [ordDemo] REBUILD WITH (FILLFACTOR=80,ONLINE =OFF )
GO

--使用DROP_EXISTING 来重建索引:
CREATE CLUSTERED INDEX [idx_refno] ON [ordDemo](Refno)
WITH (DROP_EXISTING=ON ,FILLFACTOR=70,ONLINE=ON )
GO

--使用DBCC DBREINDEX重建标上所有索引:
DBCC DBREINDEX('ordDemo')
GO

--重建带有填充因子的索引:
DBCC DBREINDEX('ordDemo','idx_refno',90)
GO




2、 注意,DBCC DBREINDEX命令将在未来版本删除,所以不建议使用,并尽快改成其他方式实现。 

 

分析:

在重建索引时,会锁住资源,直到进程完毕为止。重建会移除空白或者未使用的页,创建新的页,如果达到填充因子的限定,会分页,并以B-TREE方式存放这些数据页。

 

扩充信息:

基于个人经验,建议重建大表的索引时,把恢复模式改成大容量日志或者简单模式,避免日志文件的过度增长。但是更改恢复模式应该慎重,并在更改后立即做日志备份。

因为重建大表索引会非常耗时,所以不要不耐烦并停止重建操作,这样会引起一些危险的后果,并可能使得数据库进入恢复模式。

重建索引需要有sysadmin、db_onwer或者db_ddladmin角色。

目录
相关文章
|
存储 网络协议 API
「译文」CMDB 最佳实践技术指南 -2- 主流的 CMDB 发现技术
「译文」CMDB 最佳实践技术指南 -2- 主流的 CMDB 发现技术
|
5月前
|
监控 网络协议 视频直播
UDP协议(特点与应用场景)
UDP(用户数据报协议)是传输层的一种无连接协议,具有简单高效、低延迟的特点。其主要特点包括:无连接(无需握手)、不可靠传输(不保证数据完整性)、面向数据报(独立传输)。尽管UDP不如TCP可靠,但在实时通信(如语音通话、视频会议)、在线游戏、多媒体流媒体(如直播、点播)及网络监控等领域广泛应用,满足了对速度和实时性要求较高的需求。
800 19
|
Web App开发 安全 物联网
常见物联网操作系统介绍
物联网操作系统是运行在物联网设备上的提供物物相连能力的操作系统,其核心在于能够将各种物体连接到互联网,并提供数据通信能力。
3944 1
|
监控 安全 BI
ERP系统中的移动应用与远程访问
【7月更文挑战第25天】 ERP系统中的移动应用与远程访问
343 2
|
10月前
|
机器学习/深度学习 运维 监控
灵骏智算实例异常预测技术
本文介绍了灵骏智算实例异常预测技术,旨在提前预测GPU等设备的故障,确保大模型训练的稳定性。文章首先探讨了为何需要进行异常预测,指出大规模GPU集群在大模型训练中面临的稳定性挑战。接着阐述了预测的可行性和原理,通过分析复杂系统中的小异常逐步积累导致故障的现象,利用时序指标和关键指标分布模式进行预测。目前该技术可在1-250分钟内提前预测故障,准确率达95%以上,召回率超过20%。最后介绍了系统的集成与应用,强调了端侧部署预测模型的优势,包括降低网络开销、保护用户数据隐私等。
|
10月前
|
监控 安全 网络安全
社会工程学:概念、技术与防范
社会工程学是一种利用人性弱点而非技术漏洞来获取敏感信息或进行攻击的策略。常见技术包括钓鱼攻击、预设信任、尾随、垃圾箱搜寻、电话欺诈和社交媒体工程。防范措施包括提高意识、双重验证、物理安全、信息管理和技术防护等。通过综合措施,可以有效降低社会工程学攻击的风险,保护信息安全。
555 10
|
JSON 前端开发 测试技术
API接口 |产品经理一定要懂的10%技术知识
作为产品经理,掌握约10%的技术知识对处理API相关工作至关重要。这包括理解API的基本概念及其作为数据交换的桥梁作用;熟悉JSON和XML两种主要数据格式及其特点;了解常见HTTP请求方法(GET、POST、PUT、DELETE)及响应状态码;关注API安全性,如认证授权和数据加密;掌握API版本管理和错误处理技巧;重视性能优化,以提升用户体验;参与API联调测试,确保稳定可靠;并与前后端团队紧密协作,选择合适的第三方API服务,推动产品高效开发。
|
监控 数据可视化 BI
ERP系统中的财务报告与财务分析解析
【7月更文挑战第25天】 ERP系统中的财务报告与财务分析解析
656 4
|
人工智能 算法 自动驾驶
AI的伦理困境:我们如何应对?
随着人工智能(AI)的发展,其伦理问题也日益凸显。本文将探讨AI的伦理困境,包括数据隐私、算法偏见和AI决策的透明度等问题,并提出可能的解决方案。
|
定位技术 Python
ArcGIS批量拼接大量栅格遥感影像:Mosaic工具
ArcGIS批量拼接大量栅格遥感影像:Mosaic工具
487 1