码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server索引技术

时间:2015-09-16 15:48:37      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:

索引的分类说明

聚集索引:基于记录在数据表内的排序和存储位置。因为数据的物理排序只能有一种方式,所以在一个表中,只能有一个字段设为聚集索引。

 

非聚集索引:将索引建立在索引页上,查询时从索引中找到记录存放的位置。

 

唯一索引:当字段设置了唯一索引,那么不同记录的同一字段就是唯一的。当数据表中创建了主键后,数据库会自动为该主键创建唯一索引。

 

复合索引:将多个字段组合起来作为索引,称为复合索引。只有用到复合索引的第一个字段或整个复合索引字段作为条件查询才会用到该索引。

 

包含性列索引:创建索引时,最多的字段数不能超过16个,并且所有字段大小之和不能超过900字节,包含性列索引就是为解决该类问题而产生的。

 

视图索引:如果为视图创建索引,将会具体化视图,并将结果集永久存储在视图中。

 

全文索引:全文索引有全文引擎服务来创建和维护。主要用于大量文本中搜索字符串,效率比T-SQLlike语句高得多。

 

XML索引:在xml字段上创建的索引就是XML索引。

创建索引的语法

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]INDEX <index name> ON <table or view name>(<column name> [ASC|DESC][,...n])INCLUDE (<column name> [,...n])[    WITH    [PAD_INDEX = {ON | OFF}]    [[,] FILLFACTOR = <fillfactor>]    [[,] IGNORE_DUR_KEY = {ON | OFF}]    [[,] DROP_EXISTING = {ON | OFF}]    [[,] STATISTICS_NORECOMPUTE = {ON | OFF}]    [[,] SORT_IN_TEMPDB = {ON | OFF}]    [[,] ONLINE = {ON | OFF}]    [[,] ALLOW_ROW_LOCKS = {ON | OFF}]    [[,] ALLOW_PAGE_LOCKS = {ON | OFF}]    [[,] MAXDOP = <maxinum degree of parallelism>][ON {<filegroup> | <partition scheme name> | DEFAULT}]

参数说明:

填充因子:创建索引页时,每个叶子节点的填入数据的填满率。如果表中数据很少变动,则将填充因子设得大一点,反之则小一点。

有待补充。。。

创建各种索引示例:有待补充。。。

 

查看与修改索引

使用sp_helpindex查看索引:

语法:sp_helpindex [@objname] ‘name’

示例:exec sp_helpindex ‘Student’

 

使用:sys.indexes查看索引的全部参数信息:

示例:select * from sys.indexes

 

 sys.indexs视图字段说明:

字段名

字段说明

object_id

索引所属对象的编号

name

索引名称

index_id

索引ID

type

索引类型:0为堆,1为聚集索引,2为非聚集索引,3xml索引

type_desc

索引类型说明

is_unique

0:不是唯一索引,1:唯一索引

data_space_id

索引的文件组或分区方案的编号

ignore_dup_key

是否忽略重复键值:1为是,0为否

is_primary_key

是否主键约束的一部分:1是,0

is_unique_constraint

是否Unique约束的一部分:1是,0

fill_factor

填充因子

ispadded

是否填充索引

is_disabled

是否禁用索引

is_hypothetica

是否假设索引

allow_row_locks

是否使用行锁

allow_page_lock

是否使用页锁

 

使用Alter index语句修改索引

ALTER INDEX {<name of index> | ALL}ON<table or view name>{ REBUILD[[ WITH (  [PAD_INDEX = {ON | OFF}]    | [[,] FILLFACTOR = <fillfactor>    | [[,] SORT_IN_TEMPDB = { ON | OFF }]    | [[,] IGNORE_DUP_KEY = { ON | OFF }]    | [[,] STATISTICS_NORECOMPUTE = { ON | OFF }]    | [[,] ONLINE = { ON| OFF }]    | [[,] ALLOW_ROW_LOCKS = { ON | OFF }]    | [[,] ALLOW_PAGE_LOCKS = { ON | OFF }]    | [[,] MAXDOP = <max degree of parallelism>  )]  |[ PARTITION = <partition number>    [ WITH (< partition rebuild index option>    [,...N])]]]    | DISABLE    | REORGANIZE    [ PARTITION = <partition number> ]    [ WITH (LOB_COMPACTION = { ON | OFF })]    | SET ([ ALLOW_ROW_LOCKS = { ON | OFF} ]    | [[,] ALLOW_PAGE_LOCKS = { ON | OFF } ]    | [[,] IGNORE_DUP_KEY = { ON | OFF } ]    | [[,] STATISTICS_NORECOMPUTE = { ON | OFF }]  )}[;]

重新生成和重新组建索引

无论何时对基础数据执行插入、更新或删除操作,SQL Server 数据库引擎都会自动维护索引。随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片)。当索引包含的页中的逻辑排序(基于键值)与数据文件中的物理排序不匹配时,就会存在碎片。碎片非常多的索引可能会降低查询性能,导致应用程序响应缓慢。

 

重新组织索引:

重新组织索引是通过对叶页进行物理重新排序,使其与叶节点的逻辑顺序(从左到右)相匹配,从而对表或视图的聚集索引和非聚集索引的叶级别进行碎片整理。使页有序可以提高索引扫描的性能。索引在分配给它的现有页内重新组织,而不会分配新页。如果索引跨多个文件,将一次重新组织一个文件,不会在文件之间迁移页。

重新组织还会压缩索引页。如果还有可用的磁盘空间,将删除此压缩过程中生成的所有空页。压缩基于 sys.indexes 目录视图中的填充因子值。

重新组织进程使用最少的系统资源。而且,重新组织是自动联机执行的。该进程不持有长期阻塞锁,所以不会阻止运行查询或更新。

 

重新生成索引:

重新生成索引将删除该索引并创建一个新索引。此过程中将删除碎片,通过使用指定的或现有的填充因子设置压缩页来回收磁盘空间,并在连续页中对索引行重新排序(根据需要分配新页)。这样可以减少获取所请求数据所需的页读取数,从而提高磁盘性能。

 

重新组合和重心生成索引的选择:

索引碎片不太多时(索引碎片小于30%),可以重新组织索引。如果索引碎片非常多(大于30%),重新生成索引则可以获得更好的结果。

 

查看索引碎片

使用sys.dm_db_index_physical_stats函数查看索引碎片:

sys.dm_db_index_physical_stats ( 
    {database_id | NULL }
    , { object_id | NULL }
    , { index_id | NULL | 0 }
    , { partition_number | NULL }
    , { mode | NULL | DEFAULT }
)

示例,查看SC表的所有索引碎片信息:

DECLARE @databaseid int

DECLARE @objectid int

SET @databaseid = DB_ID(N‘DB‘)

SET @objectid = OBJECT_ID(N‘SC‘)

SELECT * FROM sys.dm_db_index_physical_stats(@databaseid,@objectid,NULL,NULL,NULL) 

重命名、删除、禁用索引

重命名索引:

sp_rename index_name_old ,‘index_name_new‘

删除索引:

drop index table_name.index_name

禁用索引:

alter index idxname on S disable--禁用指定索引

alter index all on S disable--禁用所有索引(包括主键)

索引视图

创建索引的注意事项:

l 一个表只能有一个聚集索引,但可以有多个非聚集索引。非聚集索引不能超过249个。

l 一个索引最多只能包含16个字段,并且所有字段长度之和不能超过900字节,如果超过16个字段或者超过900字节,可以考虑使用包含性列索引。

l 当表中的记录很少时,除了系统自己为主键字段和Unique字段创建的索引外,不需要再创建索引。

 

什么情况下应该避免使用索引?

虽然索引是为了提高数据库的性能,还有的时候,他们应该是可以避免的。使用索引时,应重新考虑下列准则:

l 小表上的索引不应该使用。

l 有频繁的,大批量的更新或插入操作的表。

l 索引不应该使用的列中包含了大量的NULL值。

l 经常操作的列不应该被编入索引。

总结

 技术分享

补充:并不是所有的索引都需要手动创建,在SQL Server 2008中创建表时,只要设置了主键或unique条件约束,SQL Server就会自动创建索引,并且主键索引为聚集索引,索引名与主键名相同。

 

SQL Server索引技术

标签:

原文地址:http://www.cnblogs.com/cst11021/p/4813326.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!