能够经过下列方法实现非汇集索引:数据库
UNIQUE 约束express
在建立 UNIQUE 约束时,默认状况下将建立惟一非汇集索引,以便强制 UNIQUE 约束。 若是不存在该表的汇集索引,则能够指定惟一汇集索引。 有关详细信息,请参阅 Unique Constraints and Check Constraints。服务器
独立于约束的索引架构
默认状况下,若是未指定汇集,将建立非汇集索引。 对于每一个表可建立的最大非汇集索引数为 999。 这包括使用 PRIMARY KEY 或 UNIQUE 约束建立的任何索引,但不包括 XML 索引。工具
索引视图的非汇集索引性能
对视图建立惟一的汇集索引后,即可以建立非汇集索引。 有关详细信息,请参阅 建立索引视图。spa
一、链接数据库,选择数据库,选择数据表-》右键点击-》选择设计。设计
二、在表设计器窗口-》选择要添加索引的数据列-》右键点击-》选择索引/键。对象
三、在索引/键弹出框-》点击添加,添加索引-》在常规窗口类型选择索引-》点击列选择索引列。排序
四、在索引列弹出框-》选择索引数据列-》选择索引排序方式-》能够选择把索引建在多个数据列上-》点击肯定。
五、在索引/键弹出框-》输入索引名称-》输入索引描述-》选择建立非汇集索引-》其它能够选择本身默认,也能够根据实际状况本身设置-》点击关闭。
六、点击保存按钮(或者按下ctrl+s)-》关闭表设计器-》刷新表查看结果。
一、链接数据库,选择数据库,选择数据表-》展开数据表-》右键点击索引-》选择新建索引-》选择非汇集索引。
![图片上传中...]
二、在新建索引弹出框-》输入索引名称-》选择是否建立为惟一非汇集索引-》点击添加,添加索引数据列。
三、在数据表弹出框中-》选择须要建立索引的数据列,能够选择多个-》点击肯定。
四、在新建索引弹出框-》点击选项-》可自行设置索引属性。
五、在新建索引弹出框-》点击储存-》选择索引存储位置和分区方法。
六、在新建索引弹出框-》点击筛选器-》输入筛选规则。
七、在新建索引弹出框-》点击扩展属性-》输入属性名称-》输入属性值-》点击肯定。
八、不须要刷新可直接查看结果。
语法:
--声明数据库引用
use 数据库名;
go
--判断索引是否存在
if exists(select * from sysindexes where name=索引名)
drop index 索引名 on 表名 with (online=off);
go
--添加索引
create
--[unique] --指定汇集索引是否惟一
[clustered | nonclustered] --指定为汇集索引
index 索引名称 --索引名称
on 表名 --索引添加在哪一个表
(列名 [asc | desc],列名 [asc | desc]) --索引添加在哪一个数据列
with(
--pad_index:指定索引填充
--pad_index=on:FILLFACTOR 指定的可用空间百分比应用于索引的中间级页。
--pad_index=off或未指定 fillfactor:考虑到中间级页上的键集,能够将中间级页几乎填满,但至少要为最大索引行留出足够空间。
pad_index={ on | off },
--statistics_norecompute:指定是否从新计算统计信息。
--statistics_norecompute=on:过期的统计信息不会自动从新计算。
--statistics_norecompute=off:启用自动统计信息更新。
statistics_norecompute={ on | off },
--sort_in_tempdb:指定是否将排序结果存储在 tempdb 中。
--sort_in_tempdb=on:在tempdb中存储用于生成索引的中间排序结果。若是tempdb与用户数据库不在同一组磁盘上,就可缩短建立索引所需的时间。可是,这会增长索引生成期间所使用的磁盘空间量。
--sort_in_tempdb=off:中间排序结果与索引存储在同一数据库中。
sort_in_tempdb={ on | off },
--ignore_dup_key:指定在插入操做尝试向惟一索引插入重复键值时的响应类型。 IGNORE_DUP_KEY 选项仅适用于建立或从新生成索引后发生的插入操做。 当执行 CREATE INDEX、ALTER INDEX 或 UPDATE 时,该选项无效。 默认为 OFF。
--ignore_dup_key=on:打开,将重复键值插入惟一索引时会出现警告消息。只有违反惟一性的行为才会失败。
--ignore_dup_key=off:关闭,将重复键值插入惟一索引时会出现错误消息。回滚整个INSERT操做。对于对视图建立的索引、非惟一索引、XML 索引、空间索引以及筛选的索引,IGNORE_DUP_KEY 不能设置为 ON
ignore_dup_key={ on | off },
--drop_existing:表示若是这个索引还在表上就 drop 掉而后在 create 一个新的。 默认为 OFF。
--drop_existing=on:指定要删除并从新生成现有索引,其必须具备相同名称做为参数 index_name。
--drop_existing=off:指定不删除和从新生成现有的索引。 若是指定的索引名称已经存在,SQL Server 将显示一个错误。
drop_existing={ on | off },
--online:指定在索引操做期间基础表和关联的索引是否可用于查询和数据修改操做。 默认为 OFF。 REBUILD 可做为 ONLINE 操做执行。
--online=on:在索引操做期间不持有长期表锁。 在索引操做的主要阶段,源表上只使用意向共享 (IS) 锁。
--这使得可以继续对基础表和索引进行查询或更新。
--操做开始时,在很短的时间内对源对象持有共享 (S) 锁。
--操做结束时,若是建立非汇集索引,将在短时间内获取对源的 S(共享)锁;
--当联机建立或删除汇集索引时,以及从新生成汇集或非汇集索引时,将在短时间内获取 SCH-M(架构修改)锁。 但联机索引锁是短的元数据锁,特别是 Sch-M 锁必须等待此表上的全部阻塞事务完成。
--在等待期间,Sch-M 锁在访问同一表时阻止在此锁后等待的全部其余事务。 对本地临时表建立索引时,ONLINE 不能设置为 ON。
--online=off:在索引操做期间应用表锁。这样能够防止全部用户在操做期间访问基础表。
--建立、从新生成或删除汇集索引或者从新生成或删除非汇集索引的脱机索引操做将对表获取架构修改 (Sch-M) 锁。
--这样能够防止全部用户在操做期间访问基础表。 建立非汇集索引的脱机索引操做将对表获取共享 (S) 锁。 这样能够防止更新基础表,但容许读操做(如 SELECT 语句)。
online={ on | off },
--aloow_row_locks:指定是否容许行锁。
--allow_row_locks=on:访问索引时容许行锁。数据库引擎肯定什么时候使用行锁。
--allow_row_locks=off:不使用行锁。
allow_row_locks={ on | off },
--allow_page_locks:指定是否容许使用页锁。
--allow_page_locks=on:访问索引时容许页锁。数据库引擎肯定什么时候使用页锁。
-- allow_page_locks=off:不使用页锁。
allow_page_locks={ on | off },
--fillfactor=n:指定一个百分比,指示在数据库引擎建立或修改索引的过程当中,应将每一个索引页面的叶级填充到什么程度。 指定的值必须是 1 到 100 之间的整数。 默认值为 0。
fillfactor=n
--maxdop=max_degree_of_parallelism:在索引操做期间替代 max degree of parallelism 配置选项。 有关详细信息,请参阅 配置 max degree of parallelism 服务器配置选项。 使用 MAXDOP 能够限制在执行并行计划的过程当中使用的处理器数量。 最大数量为 64 个处理器。
--max_degree_of_parallelism 能够是:
--1 - 取消生成并行计划。
-->1 - 将并行索引操做中使用的最大处理器数量限制为指定数量。
--0(默认值)- 根据当前系统工做负荷使用实际数量的处理器或更少数量的处理器。
--有关详细信息,请参阅 配置并行索引操做。
--maxdop=max_degree_of_parallelism,
--data_compression=row:为指定的表、分区号或分区范围指定数据压缩选项。 选项以下所示:
--none
--不压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
--row
--使用行压缩来压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
--page
--使用页压缩来压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
--columnstore
--适用范围: SQL Server 2014 (12.x) 到 SQL Server 2017。
--仅适用于列存储表。 COLUMNSTORE 指定对使用 COLUMNSTORE_ARCHIVE 选项压缩的分区进行解压缩。 还原数据时,将继续经过用于全部列存储表的列存储压缩对 COLUMNSTORE 索引进行压缩。
--columnstore_archive
--适用范围: SQL Server 2014 (12.x) 到 SQL Server 2017。
--仅适用于列存储表,这是使用汇集列存储索引存储的表。 COLUMNSTORE_ARCHIVE 会进一步将指定分区压缩到更小。 这可用于存档,或者用于要求更少存储而且能够付出更多时间来进行存储和检索的其余情形
--data_compression={ none | row | page | columnstore | columnstore_archive }
--on partitions ( { <partition_number_expression> | <range> } [ ,...n ] ) 适用范围: SQL Server 2008 到 SQL Server 2017。
--指定对其应用 DATA_COMPRESSION 设置的分区。 若是表未分区,ON PARTITIONS 参数将生成错误。 若是不提供 ON PARTITIONS 子句,DATA_COMPRESSION 选项将应用于已分区表的全部分区。
--能够按如下方式指定 <partition_number_expression>:
--提供一个分区号,例如:ON PARTITIONS (2)。
--提供若干单独分区的分区号并用逗号将它们隔开,例如:ON PARTITIONS (1, 5)。
--同时提供范围和单个分区,例如:ON PARTITIONS (2, 4, 6 TO 8)。
--<range> 能够指定为以单词 TO 隔开的分区号,例如:ON PARTITIONS (6 TO 8)。
--,请屡次指定 DATA_COMPRESSION 选项
--on partitions(1-2)
)
on [primary];--数据空间规范
go
--添加注释
execute sp_addextendedproperty N'MS_Description',N'索引说明',N'schema',N'dbo',N'table',N'test1',N'index',N'索引名称';
go
示例:
--声明数据库引用
use testss;
go
--判断是否存在非汇集索引
if exists(select * from sys.indexes where name='nonclus1')
drop index nonclus1 on test1 with(online=off);
go
--添加非汇集索引
create
--[unique] --指定汇集索引是否惟一
nonclustered --指定为非汇集索引
index
nonclus1 --索引名称
on test1 --指定为哪一个表建立索引
(name asc) --指定索引建在哪一个数据列上
where name is not null --筛选器
with(
--pad_index:指定索引填充
--pad_index=on:FILLFACTOR 指定的可用空间百分比应用于索引的中间级页。
--pad_index=off或未指定 fillfactor:考虑到中间级页上的键集,能够将中间级页几乎填满,但至少要为最大索引行留出足够空间。
pad_index=on,
--statistics_norecompute:指定是否从新计算统计信息。
--statistics_norecompute=on:过期的统计信息不会自动从新计算。
--statistics_norecompute=off:启用自动统计信息更新。
statistics_norecompute=on,
--sort_in_tempdb:指定是否将排序结果存储在 tempdb 中。
--sort_in_tempdb=on:在tempdb中存储用于生成索引的中间排序结果。若是tempdb与用户数据库不在同一组磁盘上,就可缩短建立索引所需的时间。可是,这会增长索引生成期间所使用的磁盘空间量。
--sort_in_tempdb=off:中间排序结果与索引存储在同一数据库中。
sort_in_tempdb=on,
--ignore_dup_key:指定在插入操做尝试向惟一索引插入重复键值时的响应类型。 IGNORE_DUP_KEY 选项仅适用于建立或从新生成索引后发生的插入操做。 当执行 CREATE INDEX、ALTER INDEX 或 UPDATE 时,该选项无效。 默认为 OFF。
--ignore_dup_key=on:打开,将重复键值插入惟一索引时会出现警告消息。只有违反惟一性的行为才会失败。
--ignore_dup_key=off:关闭,将重复键值插入惟一索引时会出现错误消息。回滚整个INSERT操做。对于对视图建立的索引、非惟一索引、XML 索引、空间索引以及筛选的索引,IGNORE_DUP_KEY 不能设置为 ON
ignore_dup_key=off,
--drop_existing:表示若是这个索引还在表上就 drop 掉而后在 create 一个新的。 默认为 OFF。
--drop_existing=on:指定要删除并从新生成现有索引,其必须具备相同名称做为参数 index_name。
--drop_existing=off:指定不删除和从新生成现有的索引。 若是指定的索引名称已经存在,SQL Server 将显示一个错误。
--若是删除开关为on,不存在索引,会报7999消息错误,把开关设置为off便可解决。
drop_existing=off,
--online:指定在索引操做期间基础表和关联的索引是否可用于查询和数据修改操做。 默认为 OFF。 REBUILD 可做为 ONLINE 操做执行。
--online=on:在索引操做期间不持有长期表锁。 在索引操做的主要阶段,源表上只使用意向共享 (IS) 锁。
--这使得可以继续对基础表和索引进行查询或更新。
--操做开始时,在很短的时间内对源对象持有共享 (S) 锁。
--操做结束时,若是建立非汇集索引,将在短时间内获取对源的 S(共享)锁;
--当联机建立或删除汇集索引时,以及从新生成汇集或非汇集索引时,将在短时间内获取 SCH-M(架构修改)锁。 但联机索引锁是短的元数据锁,特别是 Sch-M 锁必须等待此表上的全部阻塞事务完成。
--在等待期间,Sch-M 锁在访问同一表时阻止在此锁后等待的全部其余事务。 对本地临时表建立索引时,ONLINE 不能设置为 ON。
--online=off:在索引操做期间应用表锁。这样能够防止全部用户在操做期间访问基础表。
--建立、从新生成或删除汇集索引或者从新生成或删除非汇集索引的脱机索引操做将对表获取架构修改 (Sch-M) 锁。
--这样能够防止全部用户在操做期间访问基础表。 建立非汇集索引的脱机索引操做将对表获取共享 (S) 锁。 这样能够防止更新基础表,但容许读操做(如 SELECT 语句)。
online=off,
--aloow_row_locks:指定是否容许行锁。
--allow_row_locks=on:访问索引时容许行锁。数据库引擎肯定什么时候使用行锁。
--allow_row_locks=off:不使用行锁。
allow_row_locks=on,
--allow_page_locks:指定是否容许使用页锁。
--allow_page_locks=on:访问索引时容许页锁。数据库引擎肯定什么时候使用页锁。
-- allow_page_locks=off:不使用页锁。
allow_page_locks=on ,
--fillfactor=n:指定一个百分比,指示在数据库引擎建立或修改索引的过程当中,应将每一个索引页面的叶级填充到什么程度。 指定的值必须是 1 到 100 之间的整数。 默认值为 0。
fillfactor=1,
--maxdop=max_degree_of_parallelism:在索引操做期间替代 max degree of parallelism 配置选项。 有关详细信息,请参阅 配置 max degree of parallelism 服务器配置选项。 使用 MAXDOP 能够限制在执行并行计划的过程当中使用的处理器数量。 最大数量为 64 个处理器。
--max_degree_of_parallelism 能够是:
--1 - 取消生成并行计划。
-->1 - 将并行索引操做中使用的最大处理器数量限制为指定数量。
--0(默认值)- 根据当前系统工做负荷使用实际数量的处理器或更少数量的处理器。
--有关详细信息,请参阅 配置并行索引操做。
maxdop=1
--data_compression=row:为指定的表、分区号或分区范围指定数据压缩选项。 选项以下所示:
--none
--不压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
--row
--使用行压缩来压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
--page
--使用页压缩来压缩表或指定的分区。 仅适用于行存储表;不适用于列存储表。
--columnstore
--适用范围: SQL Server 2014 (12.x) 到 SQL Server 2017。
--仅适用于列存储表。 COLUMNSTORE 指定对使用 COLUMNSTORE_ARCHIVE 选项压缩的分区进行解压缩。 还原数据时,将继续经过用于全部列存储表的列存储压缩对 COLUMNSTORE 索引进行压缩。
--columnstore_archive
--适用范围: SQL Server 2014 (12.x) 到 SQL Server 2017。
--仅适用于列存储表,这是使用汇集列存储索引存储的表。 COLUMNSTORE_ARCHIVE 会进一步将指定分区压缩到更小。 这可用于存档,或者用于要求更少存储而且能够付出更多时间来进行存储和检索的其余情形
--data_compression=none
--on partitions ( { <partition_number_expression> | <range> } [ ,...n ] ) 适用范围: SQL Server 2008 到 SQL Server 2017。
--指定对其应用 DATA_COMPRESSION 设置的分区。 若是表未分区,ON PARTITIONS 参数将生成错误。 若是不提供 ON PARTITIONS 子句,DATA_COMPRESSION 选项将应用于已分区表的全部分区。
--能够按如下方式指定 <partition_number_expression>:
--提供一个分区号,例如:ON PARTITIONS (2)。
--提供若干单独分区的分区号并用逗号将它们隔开,例如:ON PARTITIONS (1, 5)。
--同时提供范围和单个分区,例如:ON PARTITIONS (2, 4, 6 TO 8)。
--<range> 能够指定为以单词 TO 隔开的分区号,例如:ON PARTITIONS (6 TO 8)。
--,请屡次指定 DATA_COMPRESSION 选项
--on partitions(1-2)
)
on [primary]; --数据空间规范
go
--添加注释
execute sp_addextendedproperty N'MS_Description',N'第一个非汇集索引',N'schema',N'dbo',N'table',N'test1',N'index',N'nonclus1';
go
优势:
一、能够对表或索引视图建立多个非汇集索引, 对于每一个表可建立的最大非汇集索引数为999。
二、非汇集索引一般可帮助您经过比搜索基础表更快的速度查找数据;有时能够彻底由非汇集索引中的数据回答查询,或非汇集索引可将数据库引擎指向基础表中的行。
三、建立非汇集索引是为了提升汇集索引不涵盖的频繁使用的查询的性能,或在没有汇集索引的表(称为堆)中查找行。
四、非汇集索引比汇集索引层次多,添加记录不会引发数据顺序的重组。
五、基础表的数据行不按非汇集键的顺序排序和存储。
缺点:
一、查询速度没有汇集索引查询速度快。
二、索引须要占物理空间。