重新组织 vs 重新生成索引
索引是数据库引擎中针对表(有时候也针对视图)建立的特别数据结构,用来帮助查找和整理数据。索引的重要性体现在能够使数据库引擎快速返回查询 结果。当对索引所在的基础数据表进行修改时(包括插入、删除和更新等操作),会导致索引碎片的产生。当索引的逻辑排序和基础表或视图的物理排序不匹配时, 就会产生索引碎片。随着索引碎片的不断增多,查询响应时间就会变慢,查询性能也会下降。在SQL Server 2005中,要解决这个问题,要么重新组织索引要么重新生成索引。
重新组织VS重新生成
修复索引碎片的方法有两种:重新组织索引或重新生成索引。重新组织索引会对最外层数据页里的数据进行重新排序,并压缩索引页。重新组织的过程中 不会添加任何额外的数据,所以索引可能还残留着一定程度的碎片。重新组织索引操作不会占用很多系统资源,在运行过程中外部进程也能够对该索引所在的数据表 进行查询,所以能够说是联机(online)执行。
重新生成索引操作基本上删除掉目标索引并创建一个新索引。旧索引中的任何碎片都会被删除,新索引的逻辑排序将和对象的物理排序相匹配。由于整个 过程需要删除索引并重新创建,所以外部进程无法访问数据表,而且访问性能也大受影响。事实上,在重新生成索引的过程中,其他进程并不能完全锁定数据表。这 是重新生成索引的一大障碍。
联机重新生成索引
SQL Server 2005引进了以联机方式重新生成索引的能力,这样其他进程就能够在此过程中正常访问数据表,而且也就无需限制在非繁忙时段进行索引重新生成操作。
要做到联机操作,数据库引擎会采取若干特别配置,以便在重新生成索引的同时允许对该索引的访问。首先,将保留原始索引以供用户读取数据和对数据 进行修改。其次通过行版本控制(row versioning,在tempdb数据库存储旧版本的行的过程)使事务读取保持连贯性。在重新生成过程中,仿效旧索引创建一个新索引。任何改变原始索 引的数据修改操作都会在重新生成索引的过程中被SQL Server引用到新索引中。新索引不能读取,只能对其进行写入操作。关键的一点是,联机重新生成索引过程中必须为两个并发索引提供足够的磁盘空间来容纳 数据。重建进行的过程中,假如原始索引发生改变,SQL Server会利用一个映射索引来确定新索引中哪些记录需要进行相应修改。一旦重新生成的过程顺利完成,任何查询或数据修改操作都将指向新索引,同时删除 原始索引。
例子
联机重新生成索引的过程和一般的重新生成索引过程没有太大区别。但是,能够通过几个方法来完成整个重生过程。第一个方法就是简单地删除索 引,CREATE INDEX语句后加上一条DROP INDEX就能够。用这种方式重新生成索引会使数据表保持没有索引的状态直到新索引完全创建完毕。所以并不推荐使用这种方法来删除索引。
假如使用DROP_EXISTING语句,仍然能够用CREATE INDEX来重新生成索引。这个特点使我们能够改变指定索引的定义,并且使数据库管理员能够把索引的存储位置改到另外一个文档组或分区里。
ALTER INDEX语句使我们能够重新生成数据表上的聚集索引和任何非聚集索引。这个语句的缺点是,您不能改变索引的定义。这些语句都含有能够联机生成索引的选项。
以下的语句是用来重新生成FlightHistory表上的聚集索引(位于FlightID列)。在这个过程中,既存的索引将会被删除,但是由于指定了ONLINE选项,所以在操作过程中该索引还能够被访问。
以下是引用片段: CREATE CLUSTERED INDEX cl_FlightHistory_FlightID ON FlightHistory(FlightID) WITH(DROP_EXISTING = ON, ONLINE = ON) |
下面的语句和上面的很相似,但是改变实际的索引定义,包含了一个额外列。索引还是按照相同的方式重新生成。
以下是引用片段:
CREATE CLUSTERED INDEX cl_FlightHistory_FlightID ON FlightHistory(FlightID ASC, FlightDate ASC)
WITH(DROP_EXISTING = ON, ONLINE = ON)
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
重新组织 vs 重新生成索引的更多相关文章
- SQL Server 重新组织生成索引
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引/统计信息 概述 无论何时对基础数据执行插入.更新或删除操作,SQL Server 数据库引擎都会自动维护索引.随着时间的推移 ...
- MSSQL 重新生成索引,重新组织索引
> 5% 且 < = 30% ALTER INDEX REORGANIZE > 30% ALTER INDEX REBUILD WITH (ONLINE = ON)* * 重新生成索 ...
- 无法重新组织表 "ty_wf_ex_local_process_info" 的索引 "idx_prc_act_id" (分区 1),因为已禁用页级锁定。
无法重新组织表 "ty_wf_ex_local_process_info" 的索引 "idx_prc_act_id" (分区 1),因为已禁用页级锁定. ALT ...
- 利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引)
利用 Oracle EM 企业管理器 进行oracle SQL的优化(自动生成索引) ##应用情景 项目中有大量的SQL,尤其是涉及到统计报表时,表关联比较多,当初开发建表时也没搞好索引关联的,上线后 ...
- MSIL实用指南-生成索引器
MSIL实用指南-生成索引器 索引器是一种特殊的属性,它有参数的,也有get和set方法,属性名称一般是"Item",并且方法名称一般名称是"get_Item" ...
- 使用word设置标题级别, 自动生成和大纲对应的多级列表, 自动生成索引目录
作为程序员,只会开发是不够的, 在日常工作中还需要掌握一些办公软件的的操作方法,word excel ppt精通不敢, 暂且入个门吧, 在前后台开发配合过程中,能写的一手好文档将会达到事半功倍的效果, ...
- 「懒惰的美德」我用 python 写了个自动生成给文档生成索引的脚本
我用 python 写了一个自动生成索引的脚本 简介:为了刷算法题,建了一个 GitHub仓库:PiperLiu / ACMOI_Journey,记录自己的刷题轨迹,并总结一下方法.心得.想到一个需求 ...
- sqlserver索引维护(重新组织生成索引)
sqlserver索引的维护 1:查看索引碎片大于百分三十以上的索引 select object_id= object_id,indexid = index_id,partitionnum = par ...
- Sphinx 的介绍和原理探索——不存储原始数据,原始数据来源于SQL,而生成索引放在内存或者磁盘中
摘自:http://blog.jobbole.com/101672/ What/Sphinx是什么 定义:Sphinx是一个全文检索引擎. 特性: 索引和性能优异 易于集成SQL和XML数据源,并可使 ...
随机推荐
- kali ssh 登录
kali 开启ssh 登录:可在windows 中通过 xshell 登录,方便操作. 修改sshd_config文件, vi /etc/ssh/sshd_config 将#PasswordAuthe ...
- 代理模式(proxy)
1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般 ...
- 应用删除后 Launchpad 上仍有应用图标无法删除的解决方法
应用删除后 Launchpad 上仍有应用图标上带有问号且无法删除时,可以将 launchpad 重置. 在终端输入: defaults write com.apple.dock ResetLaunc ...
- geeksforgeeks@ Largest Number formed from an Array
http://www.practice.geeksforgeeks.org/problem-page.php?pid=380 Largest Number formed from an Array G ...
- 第三百四十天 how can I 坚持
感觉还是要制定个计划,做不做不到是一回事,但是得制定.目标,一年时间进小米,加油,fordream 计划好好想想,技不在多,精就好. 晚上写了写杨辉三角,都不记得什么是杨辉三角了. 人言落日是天涯,望 ...
- accelerated C++ 中查找url(学习笔记)
这个程序用来查找被称为url(统一资源地)的万维网地址,输入一行包含url的字符串,程序会帮你识别并输出字符串里所包含的全部url. url的格式: protocol-name(协议名称)://res ...
- hdu 1084 What Is Your Grade?
http://acm.hdu.edu.cn/showproblem.php?pid=1084 What Is Your Grade? Time Limit: 2000/1000 MS (Java/Ot ...
- Spring.Scheduling.Quartz的使用
最近因使用Spring.Net框架而接触.了解到其与Quartz.Net的集成,即Spring.Scheduling.Quartz模块. Spring通过对Quartz.Net的封装,采用了sprin ...
- ebj笔记
所有EJB3.0开发商都必须提供一个JMS provider的实现,JMS provider对于message-driven bean而言绝对是必须的.JMS是一套用于访问企业消息系统的开发商中立的A ...
- jsp页面加载readyState的五种状态根据我们状态添加进度条
这段代码放在页面最下面 原文如下: document.onreadystatechange = subSomething;//当页面加载状态改变的时候执行这个方法. function subSomet ...