1、索引不能创建在超过900bytes的字段上
若强行创建会提示
Warning! The maximum key length is 900 bytes. The index 'IX_test_tony_col1' has maximum length of 1000 bytes. For some combination of large values, the insert/update operation will fail.
此时会创建成功,但若插入超过900宽度的内容就会插入失败,并提示一下错误
Msg 1946, Level 16, State 3, Line 2
Operation failed. The index entry of length 990 bytes for the index 'IX_test_tony_col1' exceeds the maximum length of 900 bytes.
2、聚合索引应该尽量建立在int类型的identity列上
因为
<1>所有的非聚合索引都要应用主键做书签查找,应该足够短,且唯一。若不唯一SQL会为索引重复键值 的每行自动增加一个叫uniquifier的东西使得每一行唯一,这个uniquifier对客户端是透明的。这会增加额外的负担,并且插入数据时,SQL 还需要判断该值是否唯一,若不唯一产生uniquifier值再插入数据。而这个uniquifier本身对业务数据无意义,不仅需要占用聚合索引,还会占用非聚合索引空间,所以必须避免这一情况。
<2>数据添加时,若数据不是添加在数据表中数据页的最后面,那么插入数据的操作可能牵涉分页,产生碎片和不比要的空间。而顺序增加的identity列可以避免此问题
<3>因为所有非聚合索引中都是索引键 列和书签组成的,一旦聚合索引发生更改,所有非聚合索引都需要发生更改。所有而int类型的 identiy的主键一般不具有具体含义,不会发生更改。
3、创建/删除索引顺序
若要删除聚合索引,需要先删除所有非聚合索引
要创建索引顺序 应该先创建聚合索引 ,再创建非聚合索引
因为
非聚合索引都是由 索引键 列和书签 值 组成 ,书签值 在存在 聚合索引的时候为聚合索引键值 ,在不存在聚合索引时为行定位器(文件号:页号:行号)。
若不依据以上顺寻更改,在新增和删除聚合索引时 ,就会导致存在的非聚合索引一起发生更改 ,会导致严重性能问题。
4、大型索引重键时候得注意事项
存在索引停用的最重要的目的是为了节省磁盘空间。假如重建索引的时候不停用索引,则SQL Server需要维护两个版本的索引,新建的索引成功后才会删除老索引,因此造成磁盘空间的浪费。而重建索引之前首先删除索引的话,就能剩下磁盘空间了。通常来说,重建一个已经删除的索引需要的空间是重建没有删除索引的五分之一。
也就是说重建索引得时候必须考虑到硬盘空间大小,若空间十分紧张应该考虑是否能够先停用索引或删除索引。否则用需要额外得磁盘空间来保证重建期间原有索引得被是使用。