学习笔记(九)——数据库存储结构:页、聚集索引、非聚集索引
1、页
SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行。也就是说,SQL Server 读取或写入所有数据页。页有不同的类型,像数据页,GAM,SGAM等。先理解下数据页结构。
SQL Server把数据记录存在数据页(Data Page)里。数据记录是堆表里、聚集索引里叶子节点的行。
数据页由3个部分组成。页头(标头),数据区(数据行和可用空间)及行偏移数组。
我们来执行下列的命令:
DBCC IND('InternalStorageFormat','Customers',-1)
结果如下
可以看到有2条记录,一条记录为页面类型(PageType)为10的页和一条记录为页面类型(PageType)为1的页。页面类型(PageType)10是IAM页,页面类型(PageType)1是数据页,它的页ID是79.
2、聚集索引与费聚集索引的对比
非聚集索引与聚集索引具有相同的树结构,它们之间的显著差别在于以下两点:
基础表的数据行不按非聚集键的顺序排序和存储。
非聚集索引的叶层是由索引页而不是由数据页组成。
3、聚集索引:表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个。
在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同。表只能包含一个聚集索引。例如:汉语字(词)典默认按拼音排序编排字典中的每页页码。拼音字母a,b,c,d……x,y,z就是索引的逻辑顺序,而页码1,2,3……就是物理顺序。默认按拼音排序的字典,其索引顺序和逻辑顺序是一致的。即拼音顺序较后的字(词)对应的页码也较大。如拼音“ha”对应的字(词)页码就比拼音“ba” 对应的字(词)页码靠后。
4、非聚集索引:非聚集索引指定表的逻辑顺序,数据存储的一个位置,索引存储在另一个位置,索引中包含指向数据的指针,可以有多个。如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的数据访问速度。例如,按笔画排序的索引就是非聚集索引,“1”画的字(词)对应的页码可能比“3”画的字(词)对应的页码大(靠后)。
提示:SQL Server中,一个表只能创建1个聚集索引,多个非聚集索引。设置某列为主键,该列就默认为聚集索引。
5、创建聚集索引查询
查询表如下:
然后在DateKey列建立聚集索引:
CREATE CLUSTERED
INDEX Index_Key ON DimDate(DateKey)
执行结果如下
DROP INDEX Dimdate.Index_Key --删除索引
CREATE CLUSTERED
INDEX Index_Key ON DimDate(DateKey) --再在重建列聚集索引
再执行查询语句:
select top 3 * from Person
留意到同样的语句,返回已经改变。可以聚集索引是表的顺序,会影响到top语句。
6、创建非聚集索引
USE [pratice] GO CREATE TABLE Department8( DepartmentID int IDENTITY(1,1) NOT NULL , Name NVARCHAR(200) NOT NULL, GroupName NVARCHAR(200) NOT NULL, Company NVARCHAR(300), ModifiedDate datetime NOT NULL DEFAULT (getdate()) ) CREATE NONCLUSTERED INDEX NCL_Name_GroupName ON [dbo].[Department8](Name,[GroupName]) DECLARE @i INT SET @i=1 WHILE @i < 100 BEGIN INSERT INTO Department8 ( name, [Company], groupname ) VALUES ( '销售部'+CAST(@i AS VARCHAR(200)), '中国你好有限公司XX分公司', '销售组'+CAST(@i AS VARCHAR(200)) ) SET @i = @i + 1 END SELECT * FROM [dbo].[Department8] --TRUNCATE TABLE [dbo].[DBCCResult] INSERT INTO DBCCResult EXEC ('DBCC IND(pratice,Department8,-1) ') SELECT * FROM [dbo].[DBCCResult] ORDER BY [PageType] DESC