SQL Server性能优化(8)堆表结构介绍
一、表结构综述
下图是SQL Server中表的组织形式(其中分区1、分区2是为了便于管理,把表进行分区,放到不同的硬盘数据文件里。默认情况下,表只有一个分区。)。表在硬盘上的存放形式,有堆和B树两种形式。

图最下方的三个叶子节点,数据、LOB、行溢出是数据在硬盘上存放数据的集合。可以这么理解,SQL Server在硬盘上一个数据页是8k,页有三种类型、分别为:数据、LOB、行溢出。关于页的结构,可参考页和区:https://technet.microsoft.com/zh-cn/library/ms190969(v=sql.105).aspx
数据(IN_ROW_DATA):包含除大型对象 (LOB) 数据以外的所有数据的数据行或索引行。页的类型是data或者index。
LOB(LOB_DATA):一些大型对象数据,如:text、ntext、image、xml、varchar(max)、nvarchar(max)、varbinary(max) 等。页的类型为 Text/Image。
行溢出(ROW_OVERFLOW_DATA):如果某些数据太大以至于超过1个数据页。
二、堆的结构
堆是不含聚集索引的表(所以只有非聚集索引的表也是堆)。在数据库文件中,对于堆使用的每个分区,都有 index_id = 0。
数据没有任何方式的排序,它就是一个无序堆,无结构关联的记录。当你使用SELECT语句访问堆表时,SQL Server在执行计划里会使用表扫描(Table Scan)运算符,因为你没有定义合适的聚集索引。(堆表)没有表查找(Table Seek)这个运算符。这点非常重要。
在堆表你只有一个表扫描(Table Scan)运算符。表扫描意味着你必须扫描整张表,不以你表拥有的数据量来衡量。你的数据量越多,操作花费(时间)越长。。
sys.system_internals_allocation_units 系统视图中的列 first_iam_page 指向管理特定分区中堆的分配空间的一系列 IAM 页的第一页。SQL Server 使用 IAM 页在堆中移动。堆内的数据页和行没有任何特定的顺序,也不链接在一起。数据页之间唯一的逻辑连接是记录在 IAM 页内的信息。(参考http://www.cnblogs.com/chenmh/p/4359171.html)

即,查找堆内数据的时候是从IAM页面进行查询的。关于IAM页面请参考上一篇文章。
1. IAM用于查找分配给堆的所有数据页信息,IAM页中记录了所有的页面的页id。
2. 对于大多数较小的堆表来说,仅需要一个IAM页就可以管理其页面。
3. 若堆表大于4GB或包含LOB数据类型的话,则会包含多个IAM页面。
4. 当查询要获取堆表的记录时,SQL Server使用IAM页来扫描堆表,是性能最差的一种查询方法。
三、堆表的优点
堆表插入数据非常快。分配一个8kb 的新页,在那页写上新的纪录,不需要保证任何的排序。
因此在数据库架构里,这样的表设计有些时候是非常好的主意:这些表只有海量(huge) ,并行(parallel)的INSERT活动。
参考:
1. SQL Server 深入解析索引存储(中)
2. 关于什么时候使用堆表:http://kejser.org/clustered-indexes-vs-heaps/
SQL Server性能优化(8)堆表结构介绍的更多相关文章
- SQL Server 性能优化之——系统化方法提高性能
SQL Server 性能优化之——系统化方法提高性能 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概 ...
- SQL SERVER性能优化综述
SQL SERVER性能优化综述 一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的.所以我希望按照软 ...
- SQL Server性能优化(6)查询语句建议
1. 如果对数据不是工业级的访问(允许脏读),在select里添加 with(nolock) ID FROM Measure_heat WITH (nolock) 2. 限制结果集的数据量,如使用TO ...
- 【SQL Server性能优化】删除大量数据的方法比较
原文:[SQL Server性能优化]删除大量数据的方法比较 如果你要删除表中的大量数据,这个大量一般是指删除大于10%的记录,那么如何删除,效率才会比较高呢? 而如何删除才会对系统的影响相对较小呢? ...
- 【SQL Server性能优化】运用SQL Server的全文检索来提高模糊匹配的效率
原文:[SQL Server性能优化]运用SQL Server的全文检索来提高模糊匹配的效率 今天去面试,这个公司的业务需要模糊查询数据,之前他们通过mongodb来存储数据,但他们说会有丢数据的问题 ...
- SQL Server 性能优化(一)——简介
原文:SQL Server 性能优化(一)--简介 一.性能优化的理由: 听起来有点多余,但是还是详细说一下: 1.节省成本:这里的成本不一定是钱,但是基本上可以变相认为是节省钱.性能上去了,本来要投 ...
- SQL Server性能优化与管理的艺术 附件下载地址
首先感谢读者们对鄙人的支持,购买了<SQL Server性能优化与管理的艺术>,由于之前出版社的一些疏忽,附件没有上传成功,再次本人深表歉意. 请需要下载附件的读者从下面链接下载,谢谢: ...
- SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1)
SQL Server 性能优化之RML Utilities:快速入门(Quick Start)(1) 安装Quick Start工具 RML(Replay Markup Language)是MS ...
- SQL Server 性能优化详解
故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...
随机推荐
- OpenCV提取显示一张图片(或者视频)的R,G,B颜色分量
使用OpenCV可以提分别提取显示一张图片(或者视频)的R,G,B颜色分量.效果如下. 原图: R: G: B: 示例代码如下,貌似很久以前网上找的的,逻辑很清晰,就是把R,G,B三个分量分开,然后显 ...
- iOS 动画总结—UIView动画
1.概述 UIKit直接将动画集成到UIView类中,实现简单动画的创建过程.UIView类定义了几个内在支持动画的属性声明,当这些属性发生改变时,视图为其变化过程提供内建的动画支持. 执行动画所需要 ...
- linux 下启动java jar包 shell
linux 下启动java jar包 shell #!/bin/sh JAVA_HOME=/usr/local/jdk1.6.0_34/bin/javaJAVA_OPTS="-Xmx256m ...
- memcached /usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
启动memcached的时候发现找不到libevent的库,这是memcache的默认查找路径不包含libevent的安装路径,所以要告诉memcached去哪里查找libevent. 操作命令如下: ...
- MPLSVPN 命令集
载请标明出处:http://blog.csdn.net/sk719887916,作者:skay 读懂下面配置命令需要有一定的TCP/IP,路由协议基础,现在直接上关键VPN命令. router ...
- JVM学习笔记 -- 从一段几乎所有人代码都会犯错的代码开始
废话不多说 看看这段代码.告诉我结果: import java.io.*; class Test { public static Test t = new Test(); public Test(){ ...
- Git版本控制:Git分支处理
http://blog.csdn.net/pipisorry/article/details/46958699分支的意义创建分支可以避免提交代码后对主分支的影响,同时也使你有了相对独立的开发环境. 假 ...
- VisualSVN Server安装过程
运行VisualSVN-Server-2.7.3.msi程序, 如下图 点击Next, 下一步 选中 I accept选项, 点击Next, 下一步 选择默认配置, 服务和控制台组件方式, 点击 ...
- Google性能工程师Ilya Grigorik谈HTTP/2
via:http://www.infoq.com/cn/news/2014/11/http2-develop HTTP/2,也就是超文本传输协议第2版,是下一代HTTP协议.该版本是自1999年HTM ...
- Android控件属性android:visibility的invisible与gone的区别
"invisible" : 不可见 "gone" : 隐 藏 主要区别在于控件设置了invisible后控件不可见,但是保留了控件在界面上的空间, ...