SQL Server教程第8章索引的创建与维护

SQL Server教程第8章索引的创建与维护
SQL Server教程第8章索引的创建与维护

学校教师教案

第8章索引的创建与维护

8.1 索引概述

1. 索引的概念

2. 索引的特点

3. 建立索引的原则

(1) 考虑建索引的列

(2) 不考虑建索引的列

4. 索引的类型

(1) 聚集索引

(2) 非聚集索引

5. 数据的访问方式

(1) 表扫描

(2) 索引查找

8.2 索引的创建

可以通过CREATE INDEX命令创建索引,该命令的语法如下所示。

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX IndexName

ON {TableName | ViewName } (column [ ASC | DESC ] [ ,...n ] )

[ WITH (< IndexOption > [ ,...n]) ][ON filegroup]

< IndexOption >::=

{

PAD_INDEX = { ON | OFF }

| FILLFACTOR = FillFactor

| SORT_IN_TEMPDB = { ON | OFF }

| IGNORE_DUP_KEY = { ON | OFF }

| STATISTICS_NORECOMPUTE = { ON | OFF }

| DROP_EXISTING = { ON | OFF }

}

例8-1 在数据库BlueSkyDB中的表Books上,为ISBN列创建唯一的非聚集索引,索引名为IX_Books_ISBN。

USE BlueSkyDB

GO

CREATE UNIQUE NONCLUSTERED INDEX IX_Books_ISBN

ON Books (ISBN)

GO

例8-2 在数据库BlueSkyDB的OrderItems表上,为bookID列创建聚集索引,索引名为IX_OrderItems_bookid。

USE BlueSkyDB

GO

CREATE CLUSTERED INDEX IX_OrderItems_bookid

ON OrderItems(bookID)

GO

第8章索引的创建与维护例8-3 在数据库BlueSkyDB的OrderItems表中,为orderID和bookID两列的组合创建聚集索引,索引名为IX_OrderItems_bookid。

USE BlueSkyDB

GO

CREATE CLUSTERED INDEX IX_OrderItems_bookid

ON OrderItems(orderID,bookID)

WITH (DROP_EXISTING = ON)

GO

例8-4 在数据库BlueSkyDB的Orders表中,为orderDate列创建非聚集索引,索引名为IX_Orders_orderDate,该索引的中间结点和叶级结点的填满度均为50%,并将该索引创建在文件组UserGroup1上。

USE BlueSkyDB

GO

CREATE NONCLUSTERED INDEX IX_Orders_orderDate

ON Orders(orderDate)

WITH (FILLFACTOR = 50,PAD_INDEX = ON)

ON UserGroup1

GO

8.3 索引的管理

8.3.1 查看索引信息

查看索引信息的命令是存储过程sp_helpindex,该系统存储过程的使用方法如下所示。

sp_helpindex [ @objname = ] 'ObjectName'

例8-5 查看数据库BlueSkyDB的Orders表的索引信息。

USE BlueSkyDB

GO

EXEC sp_helpindex Orders

GO

运行结果如图8-2所示。

图8-2 查看索引信息

8.3.2 重命名索引

在建立索引后,索引的名称是可以更改的。重新命名索引的命令是存储过程sp_helpindex,该系统存储过程的使用方法如下所示。

sp_rename [ @objname = ] 'ObjectName' , [ @newname = ] 'NewName'

[ , [ @objtype = ] 'ObjectType' ]

例8-6 将数据库BlueSkyDB的OrderItems表的索引文件IX_OrderItems_bookid重命名为IX_OrderItems_bidoid。

USE BlueSkyDB

GO

EXEC sp_rename 'OrderItems.IX_OrderItems_bookid','IX_OrderItems_bidoid','INDEX'

GO

第8章索引的创建与维护8.3.3 重新生成索引和禁用索引

用ALTER INDEX命令可重新生成索引或者禁用索引,该命令的语法如下所示。

ALTER INDEX { IndexName | ALL }

ON

{ REBUILD [ WITH ( [ ,...n ] ) ]

| DISABLE}

< RebuildIndexOption >::=

{

PAD_INDEX = { ON | OFF }

| FILLFACTOR = fillfactor

| SORT_IN_TEMPDB = { ON | OFF }

| IGNORE_DUP_KEY = { ON | OFF }

| STATISTICS_NORECOMPUTE = { ON | OFF }

}

例8-7 将数据库BlueSkyDB的Orders表的索引文件IX_Orders_orderDate重新生成。

USE BlueSkyDB

GO

ALTER INDEX IX_Orders_orderDate ON Orders REBUILD

GO

例8-8 将数据库BlueSkyDB的Books表的所有索引文件重新生成,这些索引的叶级结点的填满度均为60%,不会自动重新计算过时的统计信息,且在tempdb中存储临时排序结果。

USE BlueSkyDB

GO

ALTER INDEX ALL ON Books

REBUILD WITH(FILLFACTOR=60, SORT_IN_TEMPDB = ON,

STATISTICS_NORECOMPUTE = ON)

GO

例8-9 将数据库BlueSkyDB的OrderItems表的索引文件IX_OrderItems_bidoid禁用。

USE BlueSkyDB

GO

ALTER INDEX IX_OrderItems_bidoid ON OrderItems

DISABLE

GO

例8-10 将数据库BlueSkyDB的OrderItems表的索引文件IX_OrderItems_bidoid重新启用。

USE BlueSkyDB

GO

ALTER INDEX IX_OrderItems_bidoid ON OrderItems

REBUILD

GO

第8章索引的创建与维护8.3.4 删除索引

用DROP INDEX命令删除索引,该命令的语法如下所示。

DROP INDEX .

例8-11 删除数据库BlueSkyDB的Books表的索引文件IX_Books_ISBN和OrderItems表的索引文件IX_OrderItems_bidoid。

USE BlueSkyDB

GO

DROP INDEX Books.IX_Books_ISBN,OrderItems.IX_OrderItems_bidoid

GO

例8-12 查看数据库BlueSkyDB的Orders表的索引文件信息,然后删除创建主键约束时自动创建的索引。

USE BlueSkyDB

GO

EXEC sp_helpindex Orders

GO

DROP INDEX Orders.PK_Orders_023D5A04

GO

运行结果如图8-3所示。

图8-3 删除索引

8.4 索引的维护

8.4.1 查看碎片信息

用DBCC SHOWCONTIG命令查看碎片信息,该命令的语法如下所示。

DBCC SHOWCONTIG

[ ( { 'TableName' | TableId | 'ViewName' | ViewId }

[ , 'IndexName' | IndexId ]

)]

例8-13查看数据库BlueSkyDB的Orders表的索引文件IX_Orders_orderDate的碎片信息。

USE BlueSkyDB

GO

DBCC SHOWCONTIG (Orders,IX_Orders_orderDate)

GO

运行结果如图8-4所示。

图8-4 查看碎片信息

8.4.2 维护索引统计信息

用UPDATE STATISTICS命令修改索引统计信息,该命令的语法如下所示。

UPDATE STATISTICS table | view [index]

第8章索引的创建与维护例8-14 对数据库BlueSkyDB的Orders表的索引文件IX_Orders_orderDate进行统计信息更新。

USE BlueSkyDB

GO

UPDATE STATISTICS Orders IX_Orders_orderDate

GO

8.4.3 索引性能分析

1. SHOWPLAN语句

使用SHOWPLAN语句可以查看指定查询的查询规划,该命令的语法如下所示。

SET SHOWPLAN_ALL { ON | OFF }

SET SHOWPLAN_TEXT { ON | OFF }

例8-15 在数据库BlueSkyDB的Orders表上查询orderDate (订购日期)为2009-2-12的订单信息,并分析哪些索引被系统采用。

USE BlueSkyDB

GO

SET SHOWPLAN_ALL ON

GO

SELECT * FROM Orders WHERE orderDate='2009-2-12'

GO

SET SHOWPLAN_ALL OFF

GO

运行结果如图8-5所示。

图8-5 使用SHOWPLAN进行索引性能分析

2. STATISTICS IO语句

命令的语法如下所示。

SET STATISTICS IO { ON | OFF }

例8-16 在数据库BlueSkyDB的Orders表上查询orderDate(订购日期)为2009-2-12的订单信息,并显示查询处理过程中的磁盘活动统计信息。

USE BlueSkyDB

GO

SET STATISTICS IO ON

GO

SELECT * FROM Orders WHERE orderDate='2009-2-12'

GO

SET STATISTICS IO OFF

GO

运行结果如图8-6所示。

图8-6 使用STATISTICS IO进行索引性能分析

相关主题