详解SQL Server数据库索引
【IT168技术文档】
一、理解索引的构造
索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。利用索引查找数据,无需对整表停止扫描,可能快速找到所需数据。微软的SQL SERVER提供了两种索引:汇集索引(clustered index,也称聚类索引、簇集索引)和非汇集索引(nonclustered index,也称非聚类索引、非簇集索引)。
SQL Server 中数据存储的根本单位是页(Page)。数据库中的数据文件(.mdf 或 .ndf)分配的磁盘空间可能从逻辑上划分成页(从 0 到 n 延续编号)。磁盘 I/O 操作在页级执行。也就是说,南京网站制作,SQL Server 每次读取或写入数据的起码数据单位是数据页。
下面咱们先简略的了解一下索引的体系构造:
1. 汇集索引构造
在 SQL Server 中,索引是按 B 树构造停止组织的。
汇集索引单个分区中的构造:
--建设UserAddDate汇集索引
CREATE CLUSTERED INDEX [IX_UserAddDate] ON [ASPNet_zSurvey].[ZS_User]
(
[UserAddDate] ASC
)
汇集索引(Clustered Index)特点
汇集索引的叶节点就是实践的数据页
汇集索引中的排序顺序仅仅示意数据页链在逻辑上是有序的。而不是依照顺序物理的存储在磁盘上
行的物理地位和行在索引中的地位是相反的
每个表只能有一个汇集索引
汇集索引的平均大小大约为表大小的5%左右
2.非汇集索引构造
非汇集索引与汇集索引具备相反的 B 树构造,它们之间的分明差别在于以下两点:
1. 根底表的数据行不按非汇集键的顺序排序和存储。
2. 非汇集索引的叶层是由索引页而不是由数据页组成。
下图表示了单个分区中的非汇集索引构造:
蕴含列的索引
经过将蕴含列(称为非键列)减少到索引的叶级,可能扩充非汇集索引的性能。键列存储在非汇集索引的一切级别,而非键列仅存储在叶级别。
下面举个简略的例子来阐明一下汇集索引和非汇集索引的区别:
咱们有一本汉语字典,可能把它的正文自身看做是一个汇集索引,它是依照汉字拼音的扫尾字母排序的,不再需求查找其余目录。当遇到不意识的字时,需求联合“部首目录”和“检字表”, 先找到目录中的后果,然后再翻到您所需求的页码。经过这种方法查到的目录中字的排序并不是真正的正文的排序方法。把这种看做是一个非汇集索引。
另外,请留意每个表只能有一个汇集索引。
--建设UserAddDate非汇集索引
CREATE NONCLUSTERED INDEX [IX_UserAddDate] ON [ASPNet_zSurvey].[ZS_User]
(
[UserAddDate] ASC
)
非汇集索引 (Unclustered Index) 特点
非汇集索引的页,不是数据,而是指向数据页的页。
若未指定索引类型,则默以为非汇集索引
叶节点页的秩序和表的物理存储秩序不同
每个表最多可能有249个非汇集索引
在非汇集索引创建之前创建汇集索引(否则会引发索引重建)