聚集索引

聚集索引即基于数据行的键值在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。

从某种程度上,聚集索引即数据,这句话是有道理的;但正如同其他索引一样,聚集索引也是按 B 树结构进行组织的。既然是B树组织

,那么就有叶子结点和非叶子节点之分。聚集索引B 树的顶端节点称为根节点;聚集索引中的底层节点称为叶节点。在根节点与叶节点之间的任何索引级别统称为中间级。在聚集索引中,叶节点包含基础表的数据页。根节点和中间级节点包含存有索引行的索引页。每个索引行包含一个键值和一个指针,该指针指向 B 树上的某一中间级页或叶级索引中的某个数据行。每级索引中的页均被链接在双向链接列表中。

因此可以这么说,聚集索引的叶子结点存储的是按聚集索引顺序排列的数据本身,而中间结点和根节点则在维护索引和其层级。对于某个聚集索引, sys.system_internals_allocation_units 中的 root_page 列指向该聚集索引某个特定分区的顶部。SQL Server 将从索引中向下移动以查找与某个聚集索引键对应的行。为了查找键的范围,SQL Server 将在索引中移动以查找该范围的起始键值,然后用向前或向后指针在数据页中进行扫描。为了查找数据页链的首页,SQL Server 将从索引的根节点沿最左边的指针进行扫描。


非聚集索引

非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点:

基础表的数据行不按非聚集键的顺序排序和存储。

非聚集索引的叶层是由索引页而不是由数据页组成。


非聚集索引既可以建在堆表结构上也可以建在聚集索引表上;非聚集索引中的每个索引行都包含非聚集键值和行定位符。此定位符指向聚集索引或堆中包含该键值的数据行。

如果表是堆则行定位器是指向行的指针。该指针由文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID (RID)。

如果表包含有聚集索引,则行定位器是行的聚集索引键。如果聚集索引不是唯一的索引,SQL Server 将添加在内部生成的值(称为唯一值)以使所有重复键唯一。此四字节的值对于用户不可见。仅当需要使聚集键唯一以用于非聚集索引中时,才添加该值。SQL Server 通过使用存储在非聚集索引的叶行内的聚集索引键搜索聚集索引来检索数据行。

B 树的页集合由 sys.system_internals_allocation_units 系统视图中的 root_page 指针定位。



dbcc showcontig(t_productarrage,gdid)--索引情况

dbcc dbreindex('sfis.t_productarrage','IX_1',80)--重建索引,填充因子为%80

dbcc indexdefrag('sfis.t_productarrage','IX_1')--整理索引



USE Sfis

GO


SELECT OBJECT_NAME(i.object_id) AS 表名, data_pages AS 数据页数

FROMsys.indexes AS i JOIN

sys.partitions AS p ON p.object_id=i.object_id AND p.index_id=i.index_id JOIN

sys.allocation_units AS a ON a.container_id=p.partition_id

WHEREi.object_id=OBJECT_ID('t_productarrage')


--indid 为0表示堆,不按顺序排列, 1为聚集索引,2/3/4...为非聚集索引

select * from sys.sysindexes where id=(

   select object_id from sys.all_objects where object_id = OBJECT_ID('t_productarrage'))


dbcc traceon(3604)

SP_HELPDB Sfis

dbcc page(Sfis,1,100,1)    --查看Sfis数据库第1个文件中的100页



统计

统计信息的作用:

1, index建立后,优化器是否使用该index,优化器需要借助一些统计信息来做判断

2,根据统计信息,预估采用嵌套循环连接,合并连接, 哈希连接等哪一个连接

3,根据统计信息判断表的估计最佳的成本(最佳的执行顺序)


当数据库设置为自动更新统计后,SQL Server 监控表中的数据更改,当更改满足一下条件之一时更新统计

1.向空表插入数据时

2.少于500行的表增加500行或者更多

3.当表中行多于500行时,数据的变化量大于20%时

(在SQL SERVER 2000中,指的是20%的行被修改,而在SQL SERVER 2005/2008中,指的是20%的列数据被修改)



quotename('aa') 生成的有效的标识符为 [aa]


ALTER DATABASE[Sfis] SET AUTO_CREATE_STATISTICS ON     --启用自动统计信息创建功能

ALTER DATABASE[Sfis] SET AUTO_UPDATE_STATISTICS ON/OFF     --(自动更新统计信息开关)


dbcc show_statistics('Sfis.dbo.t_productarrage',pk_t_productarrage)     --查看统计信息

update Sfis.dbo.t_productarrage    --更新统计