在第十级中我们看到了索引的内部结构,在第十一级中我们看到了平衡树结构潜在的负面影响:索引碎片。有了索引内部结构的知识,我们可以检查在执行数据定义语句和数据操作语句的时候,都发生了什么。在本级中我们介绍数据定义语言的三个动词: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索引进阶:第十二级,创建,修改,删除的更多相关文章

  1. SQL Server索引进阶:第二级,深入非聚集索引

    原文地址: Stairway to SQL Server Indexes: Level 2, Deeper into Nonclustered Indexes 本文是SQL Server索引进阶系列( ...

  2. SQL Server索引进阶:第十级,索引内部结构

    原文地址: Stairway to SQL Server Indexes: Level 10,Index Internal Structure 本文是SQL Server索引进阶系列(Stairway ...

  3. 【译】SQL Server索引进阶第八篇:唯一索引

    原文:[译]SQL Server索引进阶第八篇:唯一索引     索引设计是数据库设计中比较重要的一个环节,对数据库的性能其中至关重要的作用,但是索引的设计却又不是那么容易的事情,性能也不是那么轻易就 ...

  4. SQL Server索引进阶:第九级,读懂执行计划

    原文地址: Stairway to SQL Server Indexes: Level 9,Reading Query Plans 本文是SQL Server索引进阶系列(Stairway to SQ ...

  5. SQL Server索引进阶:第八级,唯一索引

    原文地址: Stairway to SQL Server Indexes: Level 8,Unique Indexes 本文是SQL Server索引进阶系列(Stairway to SQL Ser ...

  6. SQL Server索引进阶:第七级,过滤的索引

    原文地址: Stairway to SQL Server Indexes: Level 7,Filtered Indexes 本文是SQL Server索引进阶系列(Stairway to SQL S ...

  7. SQL Server索引进阶:第六级,标签

    原文地址: Stairway to SQL Server Indexes: Level 6,Bookmarks 本文是SQL Server索引进阶系列(Stairway to SQL Server I ...

  8. SQL Server索引进阶:第五级,包含列

    原文地址: Stairway to SQL Server Indexes: Level 5, Included Columns 本文是SQL Server索引进阶系列(Stairway to SQL ...

  9. SQL Server索引进阶:第四级,页和区

    原文地址: Stairway to SQL Server Indexes: Level 4, Pages and Extents 本文是SQL Server索引进阶系列(Stairway to SQL ...

  10. SQL Server索引进阶:第三级,聚集索引

    原文地址: Stairway to SQL Server Indexes: Level 3, Clustered Indexes 本文是SQL Server索引进阶系列(Stairway to SQL ...

随机推荐

  1. AndroidUI 视图动画-旋转动画效果 (RotateAnimation)

    RotateAnimation,能实现Android的视图的旋转效果,废话不多说直接上代码. 新建一个Android 项目,在activity_main.xml中添加一个按钮,然后使用Relative ...

  2. 探求C#.Net中ArrayList与Array的区别 【转】

    ArrayList与Array的区别概述     ArrayList 是数组的复杂版本.ArrayList 类提供在大多数 Collections 类中提供但不在 Array 类中提供的一些功能.例如 ...

  3. Objective-C 内存管理之 _ARC

    内存管理之 ARC 和 自己主动释放池 一.ARC 中的变量全部权修饰符 变量修饰符,主要用来标识对象的生命周期.在手动内存管理方式中没有这些概念. ARC 环境下变量全部权修饰符主要有以下几个: _ ...

  4. 关于Resharper的使用经验

    发现Resharper这东西真的有点累赘,重构也是,一开始用会有很多莫名其妙的提示.现在的项目用了Resharper,js是很方便,有定位功能,但连TypeScript的js都有了.

  5. 图片的像素和Android的dp值之间的关系。

    这是一个困扰我很就得问题.今天在我的反复摸索下,总结出了一些个规律. 以下测试以魅族mx5为例. 手机参数:5.5英寸:高:1920:宽1080. /** * 获得屏幕的宽度 * * @param c ...

  6. ASP.NET不通过添加web引用的方式调用web service接口

    尊重原著作:本文转载自http://bbs.csdn.net/topics/360223969 创建方法 //动态调用web服务 public static object InvokeWebSer(s ...

  7. 【转】java jawin api 中文 invoke方法

    org.jawin Class FuncPtr java.lang.Object org.jawin.FuncPtr ----------------------------------------- ...

  8. mysql存储过程和触发器的应用

    ***********[mysql 存储过程和触发器 -- 别安驹]********************* 1.什么情况下使用存储过程? 完成一些比较麻烦的逻辑,比如多表在mysql端的cpu很空 ...

  9. Git 系列(三):建立你的第一个 Git 仓库

    现在是时候学习怎样创建你自己的 Git 仓库了,还有怎样增加文件和完成提交. 在本系列前面的文章中,你已经学习了怎样作为一个最终用户与 Git 进行交互:你就像一个漫无目的的流浪者一样偶然发现了一个开 ...

  10. C#开发者通用性代码审查清单

    这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考.这是为了确保在编码过程中,大部分通用编码指导原则都能注意到.对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助 ...