聚集索引

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

从某种程度上,聚集索引即数据,这句话是有道理的;但正如同其他索引一样,聚集索引也是按 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    --更新统计

转载于:https://blog.51cto.com/kinwar/1381071

SQLServer的索引和统计相关推荐

  1. SQLSERVER是怎麽通过索引和统计信息来找到目标数据的(第二篇)

    SQLSERVER是怎麽通过索引和统计信息来找到目标数据的(第二篇) 在看这篇文章的内容之前,请阁下先看第一篇的内容,因为没有第一篇的基础的话会看到一头雾水哦o(∩_∩)o 第一篇的地址:SQLSER ...

  2. SQLSERVER聚集索引与非聚集索引的再次研究(下)

    上篇主要说了聚集索引和简单介绍了一下非聚集索引,相信大家一定对聚集索引和非聚集索引开始有一点了解了. 这篇文章只是作为参考,里面的观点不一定正确 上篇的地址:SQLSERVER聚集索引与非聚集索引的再 ...

  3. 如何查看表和索引的统计信息

    如何查看表和索引的统计信息 原文:如何查看表和索引的统计信息 这几天要求做一个服务器的统计信息,主要针对表和索引.下面我就简单分享几个查询数据表和索引统计信息的方法: 1.使用T-SQL 语句实现: ...

  4. 统计--过滤(筛选)索引的统计信息过期问题测试

    基础知识普及: 对于筛选索引,MSDN如是说: 筛选索引是一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询. 筛选索引使用筛选谓词对表中的部分行进行索引. 与全表索引相比, ...

  5. 索引sql server_SQL Server索引与统计顾问的困境或麻烦

    索引sql server As a DBA, I am often asked why is something performing slow, what and why statistics ne ...

  6. oracle ola_Ola HallengrenSQL Server维护解决方案–索引和统计信息维护

    oracle ola This is the third article in Ola Hallengren's SQL Server Maintenance Solution series. The ...

  7. php 查询 select 索引,MSSQL_详解sqlserver查询表索引,SELECT   索引名称=a.namen - phpStudy...

    详解sqlserver查询表索引 SELECT   索引名称=a.name ,表名=c.name ,索引字段名=d.name ,索引字段位置=d.colid FROM sysindexes a JOI ...

  8. sqlserver中索引优化

    背景: MRO表中TimeStamp nvarchar(32),但实际上它存储的内容是日期(2015-09-09 11:20:30). 现在我要执行这样一个sql语句: Select t10.* fr ...

  9. sqlserver的索引创建

    随着系统数据的增多,一些查询逐渐变慢,这时候我们可以根据sqlserver的执行计划,查看sql的开销,然后根据开销创建索引. 索引有聚集索引与非聚集索引. 聚集索引:聚集索引在存储上是按照顺序存储的 ...

  10. SQLSERVER聚集索引的整理(重建)的必要性测试

    SQLSERVER 在日常DBA工作中有一项叫索引整理 一般整理的多为非聚集索引 问题:聚集索引是否需要整理?在什么情况下需要整理?整理的效果如何?有没有负面作用? 测试环境:WIN2003+SQL2 ...

最新文章

  1. 高通Android平台硬件调试之Camera篇
  2. Python open读写文件实现脚本
  3. 网络设备配置与管理--使用VTP实现扩展VLAN配置
  4. android 服务
  5. mustache,用{{}}获取值
  6. DWRUtil未定义的问题
  7. 【高校宿舍管理系统】第三章 Layui整合Axios
  8. Linux学习总结(13)——在阿里云的ubuntu上部署个人服务
  9. java 怎么从date取得年份
  10. 体验c#面向对象的编程
  11. html圆形空心选择按钮,CSS3 简单的实心/空心按钮
  12. 提升技能必备网站(不定时更新)
  13. 专题九:Simulink系统仿真
  14. ajax2 cors跨域,Koa2框架应用CORS完成跨域ajax要求
  15. Windows使用ROS机器人操作系统12记录
  16. FFT+NNT 深入学习记录 秦皇岛camp 乒乓球
  17. dotnet OpenXML 读取 PPT 主序列进入退出强调动画
  18. mysql本机ip一般是多少_localhost简介、localhost与 127.0.0.1 及 本机IP 的区别
  19. linux基础操作之三
  20. 2021最新《python爬虫从0-1》5.正则表达式讲解

热门文章

  1. 【数据结构】顺序线性表的几种常用方法
  2. IE8无法取得客户端完整路径的解决办法
  3. 112 Python程序中的进程操作-开启多进程(multiprocess.Process)
  4. AS报:Manifest merger failed with multiple errors, see logs
  5. SpringMVC中@RequestMapping参数设置
  6. easyui ---- jEasyUI-定制提示信息面板组件
  7. 配置VS2008来Debug .Net框架源码
  8. Spring Boot 集成Shiro和CAS
  9. Docker系列教程27-在生产环境中使用Docker Compose
  10. GlusterFS更换故障Brick