重新理解SQL Server的聚集索引表与堆表
目录
- 目录
- 简述SQL Server表的类型
- 如何区分聚集索引表与堆表
- 聚集索引表与堆表的正确使用
- 参考资料
简述SQL Server表的类型
由于当前关系型数据库(RDBMS)种类繁多,存在对标准SQL(结构化查询语言)实现上存在差异,对表、索引的实现也各有不同,造成了大家对很多概念在理解上存在误差。如下将描述MS SQL Server的聚集索引表与堆表,以便大家重新理解。
SQL Server只存在2种表:
聚集索引表(Clustered table)
堆表(Heap)
简单的说,含有聚集索引(clustered index)的表即为聚集索引表,而堆表则是不含聚集索引的表。
注意:仅含有非聚集索引(Nonclustered index),而没有聚集索引(clustered index)的表是堆表
如何区分聚集索引表与堆表
通过目录视图(catalog views)sys.partitions或sys.indexes可查询表的类型:
--通过判断index_id的值,区分表的类型
--当index_id为0时,则为堆表
--当index_id为1时,则为聚集索引表
SELECTOBJECT_NAME(s.object_id) talbe_name,CASE s.index_idWHEN 0 THEN 'heap'WHEN 1 THEN 'clustered table'END table_type
FROM sys.partitions s
WHERE s.index_id < 2
GROUP BY s.object_id,s.index_id
使用目录视图sys.indexes查询表的类型:
--注意:当表为堆表时,name为NULL
SELECTOBJECT_NAME(object_id) table_name,name,type_desc
FROM sys.indexes
WHERE index_id <2
注意:上述sql适用于所有的表。换言之,分区表也可使用上述sql进行判断。
你可能好奇为何上述2个目录视图(sys.partitions或sys.indexes)可查询所有表的类型(聚集索引表或堆表),那么我们需简单描述表与索引的组织结构,见下图(图片取自《Microsoft SQL Server 2008 Internals》)
SQL Server是通过分区去管理与组织数据记录的,且每个表至少存在一个分区,每个分区可对应一个文件组(系统默认文件组为PRIMARY)。换言之,可认为表的默认分区为PRIMARY。
聚集索引表与堆表的最大区别是:聚集索引表的数据在组织上是有序的,即聚集索引的有序性。而堆表是不含聚集索引的表。
注意:上述的组织结构是表或索引的存储结构。在SQL Server现有的版本中,还无法对表的单个分区建立索引(聚集或非聚集索引都不行)
简而言之,目录视图sys.partitions与sys.indexes均存有索引的相关信息,因此这两个视图查询聚集索引的信息,然后就可区分表的类型。
聚集索引表与堆表的正确使用
我们有很多理由去创建一个聚集索引表,而非堆表。那么最大的理由可能就是:当一个非聚集索引包含的列不能完全符合一条查询(select)时,执行计划可通过聚集索引查找,而非通过表扫描的方式。
那么我们为什么会选择堆表,原因大致就如下2点:
1. 堆表没有聚集索引,因此堆表可节省索引的磁盘空间
2. 堆表没有聚集索引,且数据组织是无序的,节省了排序操作,写入操作更快。
特别注意:在聚集索引索引表上创建分区时,务必检查sql脚本。若设置的分区函数指定的列不是聚集索引列,将会导致聚集索引的变化(删除与重建),最终导致表的类型转换。
参考资料
1.Tables and Index Data Structures Architecture
https://technet.microsoft.com/en-us/library/ms180978%28v=sql.105%29.aspx
2.《Microsoft SQL Server 2008 Internals》
3.Heaps (Tables without Clustered Indexes)
https://msdn.microsoft.com/en-us/library/hh213609.aspx
重新理解SQL Server的聚集索引表与堆表相关推荐
- 理解SQL SERVER中非聚集索引的覆盖,连接,交叉和过滤
写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完.这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章的内 ...
- SQL Server的聚集索引和非聚集索引
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)-- (一) ...
- sql聚集索引和非聚集索引_SQL Server中非聚集索引概述
sql聚集索引和非聚集索引 This article gives an introduction of the non-clustered index in SQL Server using exam ...
- 理解SQL Server是如何执行查询的 (2/3)
查询执行的内存授予(Query Execution Memory Grant) 有些操作符需要较多的内存才能完成操作.例如,SORT.HASH.HAS聚合等.执行计划通过操作符需要处理数据量的预估值( ...
- [翻译] 聚集索引表 VS 堆表
前言: 本文对这篇博客Clustered Tables vs Heap Tables 的翻译, 如有翻译不对或不好的地方,敬请指出,大家一起学习进步. 问题描述 创建一个新表时,一个非常重要的设计原则 ...
- CREATE VIEW SQL:在SQL Server中使用索引视图
This is the fourth article in a series of learning the CREATE VIEW SQL statement. So far, we have do ...
- 理解SQL Server中索引的概念,原理以及其他
简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索 ...
- T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他(看了两次了,转了)
简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索 ...
- 理解SQL Server中索引的概念,原理
理解SQL Server中索引的概念,原理 摘自:http://51even.iteye.com/blog/1490412 简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索 ...
最新文章
- pb设置Oracle事务的隔离级别,Oracle的事务隔离级别
- 高斯混合模型的解释及Python实现
- Arm architecture 第一章
- 新鲜出炉!2019年高考语文作文试题来了
- 【HDU-2376】Average distance
- Java Map用法
- Vue源码解析系列——响应式原理篇:理解Dep类和Watcher类
- PostgreSQL文本搜索(七)——自定义配置
- 设置电脑保护视力的颜色
- Nacos源码系列之服务发现(二)
- python空气质量提醒代码_【python】全国空气质量分析系统
- Verdi和DVE 中高亮设置波形颜色
- STM32 USB HID IAP升级
- Unity 图形 - 摄像机
- Chatgpt如何使用在国内
- 全球与中国Autodesk渠道合作伙伴市场现状及未来发展趋势
- Chrome Webdriver的下载安装
- Google分布式三篇论文--MapReduce
- 提高编程思维的python代码
- 理解姿势: 姿势连锁反应—笔记
热门文章
- 七个经典推理(zz)
- 新浪微博短链接的生成算法(Java版本)
- Android P 图形显示系统(一)硬件合成HWC2
- 多分类f1分数_所以多分类情况下sklearn的f1值到底是怎么计算的
- PHP处理上百万条的数据库如何提高处理查询速度
- TP5框架的生命周期
- 从google jam失落下来了,捡了个“桔子”,重拾一下“行装”
- c语言初始化字符串 函数 manment,nesC语言参考手册.doc
- 卸载flannel安装kube-router网络插件
- 使用递归算法,打印出某个目录下所有子目录和文件