减少磁盘I/O和逻辑读次数的最佳方法之一就是使用索引,索引允许SQLSERVER在表里查询数据而不需要扫描整个表。
当没有聚簇索引存在以建立数据的存储顺序时,存储引擎将简单地遍历整个表以查找所需要的。没有聚簇索引的表被称为堆表(Heaptable)
一个页面的空间有限,所以一行包含的列数越少,它就能保存越多的行。非聚簇索引通常不包含所表列,它一般只包含有限数量的列,因此一个页面将能包含比表行本身更多行的非聚簇索引。因此,SQLServer能够从表现一个非聚簇索引的页面中读到比从表现包含该列的表的页面上更多的值。
非聚簇索引的好处是,它有一个独立于数据表的结构,所以可以被放置在不同的文件组,使用不同的I/O路径,这意味着SQLSERVER可以并行访问索引和表,使找更快速。
索引用B-树结构存储,所以查找特定行所需要的读操作被最小化了。
索引给性能带来的好处是有一定的代价的。有索引的表需要更多的存储空间和内存空间以容纳表数据之外的索引页面,在操作表时,还要维护索引。聚簇索引开销更大,因为行必须以正确的顺序添加到数据页面中。
索引设计的主要建议如下
- 检查 WHERE子句和连接条件
- 使用窄索引(窄索引可以在8KB)
- 检查列唯一性
- 检查列的数据类型
- 考虑列顺序
- 考虑索引类型(非聚簇索引和聚簇索引)
聚簇索引的叶子页面和表的数据页面相同,因此,表行物理上按照聚簇索引列排序,因为表数据只能有一种物理顺序,所以一个表只能有一个聚簇索引。频繁更新的、宽的列最好不要用聚簇索引
非聚簇索引的叶子页面不仅有索引数据列还有指向该数据行的指针。
高及索引技术:覆盖索引,索引交叉,索引链接,过虑索引,索引视图,索引压缩。