SQL Server索引进阶:第十二级,创建,修改,删除
在第十级中我们看到了索引的内部结构,在第十一级中我们看到了平衡树结构潜在的负面影响:索引碎片。有了索引内部结构的知识,我们可以检查在执行数据定义语句和数据操作语句的时候,都发生了什么。在本级中我们介绍数据定义语言的三个动词:create,alter和drop。在下一级中,我们介绍数据操作语言的三个动词:insert,update,delete。
创建,修改,删除索引都是索引维护的范围。create,alter,drop作为维护索引的动词,只是因为SQL Server团队认为队友对象的维护应该使用相同的DDL动词。在文中你会看到,这几个动词做的工作要比表面的多,使得你可以创建,重建,重新组织,禁用,删除索引,还可以修改元数据。
在你创建或者修改索引的时候,你可以指定一个选项。这些选项是索引元数据的一部分,存储在系统表中,通过sys.indexes视图查看这些内容。在查询和更新数据的时候,还有维护索引的时候,会被SQL Server使用。在本文中的很多地方我们用到了这些选项,但是没有详细介绍。但是,我们在文章的最后面详细介绍这些选项。
你的表越大,在索引上执行DDL的影响越大。执行DDL的同时,会消耗服务器资源,以及减慢其他查询。在理解了你的索引在DDL和DML的过程中发生了什么,你可以:
- 理解定期的索引维护的需要。
- 最大化维护操作的性能。
- 最小化维护操作给其他查询带来的影响。
- 减少维护的次数。
创建索引
我们先看创建聚集索引,稍后再看创建非聚集索引。
如果在创建聚集索引的时候,可能会出现如下的信息。
The table already is a clustered index:
发生了错误。一张表不能创建两个聚集索引,将会导致一张表在同时有两种排序,这是不可能的。
The table is empty:
SQL Server更新了系统表中的聚集索引,还没有分配空间。
The table has rows. The table does not have nonclustered indexes:
SQL Server更新了系统表中的聚集索引。
SQL Server用索引键的顺序对表进行排序。
The table has rows. The table has nonclustered indexes:
SQL Server释放了非聚集索引占用的空间,但是保留了元数据。
SQL Server更新了系统表中的聚集索引。
SQL Server构建聚集索引。
根据元数据重建非聚集索引。没有其他选择,非聚集索引一定要重建。每个入口的标签,以前是RID,现在是聚集索引的键值。因此,每个入口的大小和原来的大小不一样。
因此,如果你将在表中创建多个索引,为了节省时间和降低影像,应该先创建聚集索引,然后创建非聚集索引。
创建非聚集索引
The table is empty:
SQL Server更新了系统表中的非聚集索引。这时候还没有分配空间。
The table has rows:
SQL Server更新了系统表中的非聚集索引。
SQL Server扫描表,包含需要列的其他非聚集索引,为每一行构建索引入口,以索引顺序排序入口。
修改索引
修改索引允许你做四件事:
- 禁用索引。
- 重建索引。
- 重新组织索引。
- 改变索引的选项。
记住:有一件事修改索引不允许你做,那就是改变组成索引键的列。如果需要的话,只能删除索引,然后新建索引,或者是在create index的时候使用drop_existing选项。
禁用索引
禁用索引,使用disable关键字。
ALTER INDEX PK_FragTest_PKCol
ON FragTest
DISABLE;
GO
禁用索引,不会从系统表中删除索引的定义。所有禁用的索引可以在以后重建或者删除。
禁用非聚集索引会释放索引占用的磁盘空间。禁用非聚集索引之后,所有的查询和没有索引一样。
禁用聚集索引会释放索引中非叶子层占用的空间。禁用聚集索引之后,表不能进行查询和更新操作。
因为禁用索引伴随着空间释放,处理过程会需要少量的处理器时间和日志文件的IO。
禁用索引的主要原因是在重建索引的时候节省一些磁盘空间。如果没有禁用索引,重建过程会维护旧版本的索引,直到新版本的索引创建完成,导致两个版本同时消费磁盘空间。首先删除索引,在重建的过程中就会节省整个索引的空间。
重建索引
重建索引使用下面的语句。
ALTER INDEX PK_FragTest_PKCol
ON FragTest
REBUILD
WITH ( FILLFACTOR = 75
, SORT_IN_TEMPDB = ON
, MAXDOP = 3 );
SQL Server索引进阶:第十二级,创建,修改,删除的更多相关文章
- SQL Server索引进阶:第二级,深入非聚集索引
原文地址: Stairway to SQL Server Indexes: Level 2, Deeper into Nonclustered Indexes 本文是SQL Server索引进阶系列( ...
- SQL Server索引进阶:第十级,索引内部结构
原文地址: Stairway to SQL Server Indexes: Level 10,Index Internal Structure 本文是SQL Server索引进阶系列(Stairway ...
- 【译】SQL Server索引进阶第八篇:唯一索引
原文:[译]SQL Server索引进阶第八篇:唯一索引 索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就 ...
- SQL Server索引进阶:第九级,读懂执行计划
原文地址: Stairway to SQL Server Indexes: Level 9,Reading Query Plans 本文是SQL Server索引进阶系列(Stairway to SQ ...
- SQL Server索引进阶:第八级,唯一索引
原文地址: Stairway to SQL Server Indexes: Level 8,Unique Indexes 本文是SQL Server索引进阶系列(Stairway to SQL Ser ...
- SQL Server索引进阶:第七级,过滤的索引
原文地址: Stairway to SQL Server Indexes: Level 7,Filtered Indexes 本文是SQL Server索引进阶系列(Stairway to SQL S ...
- SQL Server索引进阶:第六级,标签
原文地址: Stairway to SQL Server Indexes: Level 6,Bookmarks 本文是SQL Server索引进阶系列(Stairway to SQL Server I ...
- SQL Server索引进阶:第五级,包含列
原文地址: Stairway to SQL Server Indexes: Level 5, Included Columns 本文是SQL Server索引进阶系列(Stairway to SQL ...
- SQL Server索引进阶:第四级,页和区
原文地址: Stairway to SQL Server Indexes: Level 4, Pages and Extents 本文是SQL Server索引进阶系列(Stairway to SQL ...
- SQL Server索引进阶:第三级,聚集索引
原文地址: Stairway to SQL Server Indexes: Level 3, Clustered Indexes 本文是SQL Server索引进阶系列(Stairway to SQL ...
随机推荐
- Flex中如何通过horizontalTickAligned和verticalTickAligned样式指定线图LineChart横竖方向轴心标记的例子
原文http://blog.minidx.com/2008/12/03/1669.html 接下来的例子演示了Flex中如何通过horizontalTickAligned和verticalTickAl ...
- 280行代码:Javascript 写的2048游戏
2048 原作者就是用Js写的,一直想尝试,但久久未动手. 昨天教学生学习JS代码.最好还是就做个有趣的游戏好了.2048这么火,是一个不错的选择. 思路: 1. 数组 ,2维数组4x4 2. 移动算 ...
- Cocos2dx 中的CCCallFunc,CCCallFuncN,CCCallFuncND,CCCallFuncO比较
qinning199原创,欢迎转载.转载请注明:http://www.cocos2dx.net/?p=27 首先看一张图片,表示了CCCallFunc的继承关系: 1.CCCallFunc,回调,调用 ...
- tky项目第①个半月总结
增加tky项目开发组已经有半个月了,这半个月一直是伴随着加班度过,学习了不少东西,也有不少抱怨,这些都是宝贵的工作经验体会.有必要在此好好总结一下. 我是中途加进这个项目的.也就是说.组内其它人员已经 ...
- C结构体中位域
C结构体中位域的一点小知识,最近在看资料时遇到结构体中的一种特殊操作——位域,在下面的程序中我将根据自己的理解进行简单介绍.程序只是为了了解位域的一些性质,运行时有些编译器可能会报错. 程序代码如下( ...
- for应用
应用:迭代法,穷举法.一.迭代法:有一定规律. 每次循环都是从上次运算结果中获得数据,本次运算的结果都是要为下次运算做准备.例:1.100以内所有数的和.2.求阶乘3.求年龄.4.折纸.5.棋盘放粮食 ...
- javascript高级知识点——实例类型
代码信息来自于http://ejohn.org/apps/learn/. 分析一下对象的结构 function Ninja(){} var ninja = new Ninja(); console.l ...
- Fedora、CentOS install TTF/otf fonts
Step 1:切换至字体下载目录: [Richard@localhost Downloads]$ ll | grep otf -rw-rw-r--. Richard Richard 7月 RBNo2L ...
- 查看EBS R12应用中使用CONTEXT_FILE的版本及路径
SELECT * FROM APPLSYS.FND_OAM_CONTEXT_FILES;
- UTL_FILE 的用法
UTL_FILE 的用法 UTL_FILE 是用来进行文件IO处理的专用包,使用这外包的注意事项如下: 1. 生成的文件好象只能放置在DATABASE所在的服务器路径中. 2. 生成的文件如何DO ...