CREATE UNIQUE NONCLUSTERED INDEX AK_Product_Name ON Production.Product ( [Name] ) WITH ( IGNORE_DUP_KEY = OFF );
IGNORE_DUP_KEY这个名字容易让人误会。唯一索引存在时重复的值永远不会被忽略。更准确的说,唯一索引中永远不允许存在重复键。这个选项的作用仅仅是在多列插入时有用。
比如,你有两个表,表A和表B,有着完全相同的结构。你可能提交如下语句给SQL Server。
INSERT INTO TableA SELECT * FROM TableB;
SQL Server会尝试将所有表B中的数据插入表A。但如果因为唯一索引拒绝表B中含有和表A相同的数据插入A怎么办?你是希望仅仅重复数据插入不成功,还是整个INSERT语句不成功?
这个取决于你设定的IGNORE_DUP_KEY参数,当你创建唯一索引时,通过设置设个参数可以设定当插入不成功时怎么办,设置IGNORE_DUP_KEY的两种参数解释如下:
二、修改索引
ALTER INDEX命令在其用来做什么方面多少有些欺骗性。截止到现在,ALTER命令总是与修改对象的定义有关。例如ALTER表以添加或禁用约束和列。ALTER INDEX是不同的-该命令与维护有关,而与结构完全不相干。如果需修改索引的组成,那么只能DROP然后CREATE索引,或者用DROP_EXISTING=ON选项CREATE并使用索引。
ALTER INDEX的语法类似于下面这样:
ALTER INDEX { | ALL}
ON
{ REBUILD
[[ WITH (
[PAD_INDEX = {ON | OFF}]
| [[,] 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 =
)]
|[ PARTITION =
[ WITH (< partition rebuild index option>
[,...N])]]]
| DISABLE
| REORGANIZE
[ PARTITION = ]
[ 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 }]
)
}[;]
其中一些选项与CREATE INDEX命令相同,因此这里将略过对这些选项的重新定义。除此之外,相当多的ALTER特定选项都是细节性的,且与处理碎片之类的事情有关。下面解释下参数 1、索引名
如果想维护一个特定的索引可以指定该索引,或者使用ALL表明想要维护与指定的表相关联的所有索引。 2、表名或视图名
要在其上维护的特定对象(表或视图)的名称。注意,必须是一个特定的表(可以给它提供一个列表,然后说“请处理所有这些!”)。 3、REBULD
如果使用该选项运行ALTER INDEX,那么将完全丢弃旧的索引并重新生成新的索引。结果是真正优化的索引,其中所有叶级和非叶级的页都按照定义进行了重新构建。如果是群集索引,那么也会重新组织物理数据。
默认情况下,页将被重新组织为差两行满。和CREATE TABLE语法一样,可以将FILLFACTOR设置为0~100之前的任何值。该值是在数据库完成重新组织后页被填满的程度(以百分比表示)。但在进行页拆分时,数据将被对半分部在两个页上-除了定期重建索引外,不得不断控制填充的百分比。
要小心使用该选项,一旦开始REBUILD,在完成索引重建钱,正在使用的索引实际上就没有了。依赖该索引的所有查询可能会变得异常慢。对于这类事情,首先需要在离线系统上测试,以了解整个过程将花多少时间。然后,计划在非高峰时段运行。 4、DISABLE
该选项名副其实,只是方式有些过激。如果该命令的全部作用只是为了让索引离线,直至您决定了进一步要做什么,则它是不错的选择,但它实际会把索引标记为不可用,一旦禁用了某个索引,在重新激活之前,必须重建索引(不是重新组织,而是重建)。
如果对表禁用了群集索引,那么也会禁用表。数据仍会保留,但在重建群集索引钱,不能被所有索引(因为他们都依赖群集索引)访问。 5、REORGANIZE
如果重新组织索引,就得到了比完全重建索引稍逊一点的完全优化,但这种方法可以联机进行(用户仍能使用索引)。
稍逊一点指的是什么?其实是REORGANIZE只在索引的叶级起作用,而不触及非叶级。这意味着未获得完全优化。但是,对于大部分的索引而言,那不是真正产生碎片的地方。