[译]SQL Passion Week 5: 堆表

SQL Passion Week 5: 堆表

  今天我们介绍下所谓的堆表(Heap table), 堆表就是没有聚集索引的表. 在SQL Server中,一个表如果包含聚集索引, 我们就称为索引表, 否则就称为堆表.

  在堆表中, 数据是无序的, 它们只是杂乱的放在一起, 没有结构性. 当我们select一个堆表时, 如果没有合适的非聚集索引, SQL Server会使用表扫描(Table Scan)操作来检索数据, 而不是表查找(Table Seek).

  表扫描意味着将扫描整个表, 数据越多, 耗费的时间越久.

  我们来看一下堆表的优点和缺点.

  优点

  堆表的insert操作非常非常快, 因为它是无序的, 别无其他. 在插入数据时, 无需比较已有的数据, 分配一个新的地址, 写入新纪录, 就完事了.

  因为这个原因, 我们可以将一些需要频繁,并行insert动作的表作为堆表来处理. 比如日志表. 除此之外,我们不推荐在任何地方使用堆表.

  缺点

  第一个缺点, 堆表在读取过程中导致了存储系统的随机IO. 想象一下你对一个堆表执行select语句, 如果数据当前没有cache在buffer pool里, SQL Server必须到存储系统中去物理读数据. 因为堆表的存储是随机散步在数据文件中, 而不是连续的. 这就造成了random I/O. 大家都知道, 我们目前普遍使用的是物理磁盘, 随机IO非常非常的慢.

  如果是SSD固态硬盘的话, 随机IO和顺序IO就没太大的区别了,虽然前者依然慢了一点点.

  另外一个问题就是堆表会产生Forwarding Records. 当某个页上存储的数据更新超过长度时, SQL Server会留下一个指针,指向一个新的存储位置. 这使得在检索数据时会严重的影响性能. 我们在这里留个坑, 就不具体讨论Forwarding Records深层次的问题了,有兴趣可以自行搜索下相关文档.

  

  

  

时间: 2024-10-18 10:09:26

[译]SQL Passion Week 5: 堆表的相关文章

[译]SQL Passion Week 6: 聚集索引

SQL Passion Week 6: 聚集索引 每次我们给表创建主键(Primary key)时, 默认等于一个唯一聚集索引(Unique Clustered Index). 即表示主键所包含的column是唯一的,不重复的, 同时表的物理排序也是按照主键的顺序来排列的. 同样的, 我们也列举下聚集索引的优缺点 优点 聚集表的最大好处就是数据在磁盘中是有序存储的. 我们可以将其和字典比较, 我们可以轻松的找到某个字在哪一页. 聚集索引对于查询的意义巨大, 当我们用包含在聚集索引里的column

[译]SQL Passion Week 3: SQL Server的扇区管理

SQL Passion Week 3: SQL Server的扇区管理 混合扇区和统一扇区 SQL Server中每8个数据页作为一个扇区. 在混合扇区中, 其包含的8个页可以分别属于不同的数据库对象; 另一方面, 统一扇区里的8个页都属于同一个数据库对象. 为什么有这样一个区别呢, 这其实主要是因为一个历史遗留问题.  因为在上个世纪, 存储是非常昂贵的, 人们会尽可能有效的充分利用存储空间. 当一个表和索引最初创建时, 总是创建在一个混合扇区上, 先在8kb的空间里进行增长. 这样, 小的表

[译]SQL Passion Week 1: SQL Server如何执行一个查询

SQLpassion Performance Tuning Training Plan 个人学习翻译,如有谬误,请不吝指出,感谢.  Week 1: SQL Server如何执行一个查询   在我们进入SQL Server性能调优的繁杂细节之前, 我想先列举一下SQL Server如何执行一个查询(query)的结构, 这部分内容非常重要, 因为了解这些概念, 对我们以后的性能调优课程会理解的更加深刻. 下面的图为我们展示了SQL Server执行查询过程中所包含的几个主要组成部分: SQL S

[译]SQL Passion Week 10: 计划缓存

Week 9: Plan Caching Adhoc SQL Statements 每次我们向SQL Server提交一个特定的SQL语句时, 查询计划为每一个unique query编译. 什么叫做unique query? 非常简单. SQL Server为完整的SQL语句(包含Hard-coded的值)产生一个Hash值, 作为一个查找值在计划缓存中使用. 如果找到该hash值,再该计划被复用. 否则将会编译一个新的计划, 所以想象一下现在执行下面3个查询 SELECT * FROM Sa

[译]SQL Passion Week 2: SQL Server的基本存储单位--数据页

Week 2: SQL Server的基本存储单位--数据页 上周我们我们讲述了SQL Server如何执行一个查询, 顺带提到了数据页的概念, 这次我们从性能调优的角度上更详细深入的讲解一些数据页. 数据页是SQL Server最基础的存储单位, 所有的东西都和数据页有关. 当我们想提高查询的性能时, 必须想方设法降低查询的页读取数量. 以后讲到索引时, 还会涉及到更多索引的结构. 如果你不知道什么是页, 你就无法寻找SQL Server的故障原因. 数据页的结构 SQL Server中的页有

索引深入浅出:非聚集索引的B树结构在堆表

在“索引深入浅出:非聚集索引的B树结构在聚集表”里,我们讨论了在聚集表上的非聚集索引,这篇文章我们讨论下在堆表上的非聚集索引. 非聚集索引可以在聚集表或堆表上创建.当我们在聚集表上创建非聚集索引时,聚集索引键担当为行指针.在堆表里,文件号,页号和槽号(file id , page number and slot number)的组合在非聚集索引里担当为行指针. 我们来看下手头的一个例子.我们创建salesorderdetail表的副本,并在上面的productid和salesorderid 列创

堆表空间管理

在SQL Server中,堆表是指没有创建聚集索引的表,其存储空间由PFS,IAM等系统页来跟踪,PFS使用1Byte,表示一个page中空间的使用情况.BTree结构的存储空间是有序的,当向BTree结构中插入新的数据行时,SQL Server按照键值该数据行插入到特定的位置上,以保证BTree结构是有序的:当删除一个Page中的所有数据行之后,SQL Server会将该Empty Page释放,其他对象可以使用该Page.堆表的空间管理,和BTree结构有很大的不同. 1,读取堆表的数据 当

堆表上的唯一与非唯一非聚集索引的区别

在这篇文章里,我想详细介绍下SQL Server里唯一与非唯一非聚集索引的区别.看这个文章前,希望你已经理解了聚集和非聚集索引的概念,还有在SQL Server里是如何使用的. 很多人对唯一和非唯一索引非聚集索引的认识都不是很清晰.事实上,SQL Server在存储上这2类索引有着本质的区别,这些区别会影响到索引占用空间的大小和索引的使用效率. 今天我们从SQL Server里的堆表(Heap table) ,它是没有聚集索引定义的表,在它建立唯一和非唯一非聚集索引,来开始我们的分析.下列脚本会

SQL Server 向堆表中插入数据的过程

堆表中  IAM 记录着的数据页,表的各个数据页之间没有联系.也就是说一个页面它不会知道自己的前一页是谁,也不知道自己的后一页是谁. 插入数据时先找到IAM页,再由pfs(page free space)决定插入到哪里!