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 性能优化详解
故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户, ...
随机推荐
- 学习pthreads,多线程的创建和终止
在多CPU多线程的编程中,通过作者的学习发现,pthreads的运用越来越广泛,它是线程的POSIX标准,定义了创建和操作线程的一整套API.环境的配置见上一篇博文,配置好环境后只需要添加#inclu ...
- volatile和synchronized的区别和联系
volatile 它所修饰的变量不保留拷贝,直接访问主内存中的. 在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器).为了性能,一个线程会在自己的mem ...
- Google地球查看香港地形
12月1号要去香港.为此需要先了解一下香港的情况.以前只知道用Google地球看别人照的照片(或者是全景照),这次无意间发现了它一个很强大的功能:立体的呈现一个地区的地形.对于像香港这样的多山地区来说 ...
- Python学习笔记 - map reduce
#!/usr/bin/env python3 # -*- coding: utf-8 -*- def f(x): return x * x r = map(f, [1, 2, 3, 4, 5, 6, ...
- Java常见运算符整理
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/44724267 本文主要介绍Java中常见的运算符,重点介绍 ...
- 一个操作cvs格式的c++类
经常需要使用excel,或者把有的数据用excel打开,程序可以生成cvs格式的文件,这样就可以excel打开并处理了,于是找了一个处理cvs的c++类跟大家分享 代码出处找不到了: 代码如下: St ...
- Android虚拟设备访问WebSocket问题
Android虚拟设备访问WebSocket问题 最近写erlang的WebSocket网站,需要运行在RHEL6上,用Android设备访问. 可惜AVD无法访问主机 Win7上的虚拟机(RHEL6 ...
- PS图像特效算法——百叶窗
这个只要设置好条纹的宽度和条纹的间隔,建立一个遮罩层,等间隔的对原图进行等间距的遮罩. clc; clear all; Image=imread('4.jpg'); Image=double(Imag ...
- windows c/c++ 代码运行时间,毫秒级
#pragma once /* //计算代码段运行时间的类 // */ #include <iostream> #ifndef ComputeTime_h #define ComputeT ...
- C语言算法---求鞍点
题目:有一个3X4矩阵,要求输出其鞍点(行列均最大的值),以及它的行号和列号. int a[3][4] = {{123,94,-10,218}, {3 ...