概述生产库中sqlserver怎么也占了三分之一,所以今天主要聊聊怎么在sqlserver数据库上去建索引。 1、索引概述创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。 大型数据库有两种索引即簇索引和非簇索引: 1)非簇索引的表是按堆结构存储数据,所有的数据均添加在表的尾部; 2)簇索引的表,其数据在物理上会按照簇索引键的顺序存储,一个表只允许有一个簇索引。 因此,根据B树结构,可以理解添加任何一种索引均能提高按索引列查询的速度,但会降低插入、更新、删除操作的性能,尤其是当填充因子(Fill Factor)较大时。所以对索引较多的表进行频繁的插入、更新、删除操作,建表和索引时因设置较小的填充因子,以便在各数据页中留下较多的自由空间,减少页分割及重新组织的工作。 索引是从数据库中获取数据的最高效方式之一。95% 的数据库性能问题都可以采用索引技术得到解决。作为一条规则,我通常对逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列[字段]采用非成组索引。不过,索引就象是盐,太多了菜就咸了。你得考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写,(即:在实际使用当中,应该充分考虑到索引的开销,包括磁盘空间的开销及处理开销(如资源竞争和加锁)。如果数据频繁的更新或删加,就不宜建立索引) 实际上,可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。 2、聚集索引结构在 SQL Server 中,索引是按 B 树结构进行组织的。 聚集索引单个分区中的结构:
3、非聚集索引结构非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点:
下图示意了单个分区中的非聚集索引结构: 非聚集索引 (Unclustered Index) 特点:
4、聚集索引和非聚集索引的区别其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。如果你翻完了所有以“a”开头的部分仍然找不到这个字,那么就说明你的字典中没有这个字;同样的,如果查“张”字,那你也会将你的字典翻到最后部分,因为“张”的拼音是“zhang”。也就是说,字典的正文部分本身就是一个目录,你不需要再去查其他目录来找到你需要找的内容。 两者的存储特点:
总之,聚集索引是一种稀疏索引,数据页上一级的索引页存储的是页指针,而不是行指针。而对于非聚集索引,则是密集索引,在数据页的上一级索引页它为每一个数据行存储一条索引记录。 5、使用 聚集索引 或 非聚集索引 的场景下面的表总结了何时使用聚集索引或非聚集索引: 总结“水可载舟,亦可覆舟”,索引也一样。索引有助于提高检索性能,但过多或不当的索引也会导致系统低效。因为用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片。 |
|