堆表空间管理

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

1,读取堆表的数据

当需要查询堆表的数据时,SQL Server只能使用表扫描(Table Scan)访问堆表数据。表扫描意味着SQL Server会将访问堆表的所有数据行,以检查该数据行是否满足查询条件。

2,向堆表中插入数据

SQL Server可能将新的数据行插入到表结构的任何page中。在向堆表中插入数据行时,SQL Server扫描PFS系统页,查看堆表的存储空间,只要发现任何一个page有足够的空闲空间能够容纳新的数据行,SQL Server就将数据插入到该位置。如果该Page的存储数据行分布低比较零散,SQL Server会重新组织该数据页上现有数据行的存储,以腾挪出连续的空闲空间,存储新的数据行。

如果已分配的数据页没有足够的空闲空间容纳新的数据行,那么SQL Server会分配新的extent,以存储数据。

3,从堆表中删除数据

当从heap中删除数据行时,SQL Server 2012不会自动组织Page的存储空间,直到插入新的数据行时,SQL Server才会收缩Page中零散的空间,腾挪出连续的空闲空间,以存储新的数据行。如果将Page的所有数据行都删除,SQL Server不会将empty pages的存储空间释放,这部分空间仍然被堆表占用,不能被其他对象使用。

In additin to space on pages, not being reclaimed, empty pages in heaps frequently can not be reclaimed. Even if you delete all the rows from a heap, sql server does not mark the mepty pages as unallocated, so the space is not available for other objects to uses.

在执行删除操作使时,如果使用with(tablock)申请表锁,那么SQL Server在删除数据行时,将释放Empty Page的存储空间。

如果堆表已经存在大量的空闲空间未被释放,有两种方式来解决:

  • 执行alter table rebuild命令,重新创建堆表空间,SQL Server将为堆表分配新的存储空间,而释放原有的存储空间,新的存储空间是密集存储的;
  • 在堆表上,创建聚集index,将堆表转换为BTree,使用BTree结构管理表空间

4,更新堆表的数据

在更新堆表数据时,如果数据行长度增加,导致数据页不足以容纳更新之后的数据行,那么SQL Server将该数据行移动到其他Data Page上,在原有的Data Page上设置一个Forward Pointer,指向数据行移动之后的物理位置,这样做的好处是,堆表数据的更新不会影响nonclustered index。

如果数据行再次移动,那么Forward Pointer会执行新的物理位置,Forward Pointer会指向数据行的最新的物理位置。如果数据行更新之后,原有的存储空间能够容纳,那么SQL Server移除Forward Pointer,将数据行移动到原有的物理位置上。

Forward Pointer利于堆表数据的更新,但是,不利于堆表数据的查询。SQL Server通过Forward Pointer获取数据行的物理位置,再路由到相应的物理位置去读取数据行的数据,额外增加一次Disk的查询操作。

移除Forward Pointer的操作:

  • 收缩数据文件,执行dbcc shrinkfile命令,SQL Server将移除堆表的所有Forward Pointer
  • 在堆表上创建clustered index
  • 将Forward Pointer指向的数据行删除
  • 在执行更新命令时,数据行宽度变窄,SQL Server移除Forward Pointer,将数据行移动到原有的物理位置上
  • 重建堆表,执行alter table rebuild命令,重新分配堆表的存储空间

5,查看堆表中Forward Pointer的数量

在SQL Server中,Index ID是0,表示堆表结构;Index ID是1,表示Clustered Index。

时间: 2024-10-24 20:44:16

堆表空间管理的相关文章

第15章 oracle undo表空间管理

2015-10-23 目录 参考资料 [1] 林树泽.Oracle 11g R2 DBA操作指南[M].北京:清华大学出版社,2013 [2] Oracle undo 表空间管理 [3] undo表空间概述 [4] Oracle UNDO表空间的管理 [5] Oracle的UNDO表空间管理总结 [6] UNDO表空间的管理 [7] UNDO表空间的管理 [8] 监控和管理Oracle UNDO表空间的使用 [9] 谈谈undo表空间

Oracle 表空间管理

Oracle磁盘管理中的最高逻辑层是表空间,Oracle11g中必须创建的4个表空间是SYSTEM,SYSAUX, TEMP, UNDOTBS1. 2 SYSTEM:存储数据字典等,pl/sql代码等. 2 SYSAUX:存储与数据库选项相关的数据 2 TEMP:用于大的排序操作 2 UNDUTBS1:为读一致性和恢复的目的,存储事务信息. 表空间的下一层是段,一个段只能驻留在一个表空间中:一个或多个区可以组成一个段,每个区只能驻留在一个数据文件中:一组连续的数据块可以组成一个区.如果要查询表空

SYSTEM 表空间管理及备份恢复

标签: systemoraclesqldatabasefile数据库 2010-11-28 18:14 12689人阅读 评论(0) 收藏 举报 分类: -----Oracle备份恢复(16) 版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处. --============================= -- SYSTEM 表空间管理及备份恢复 --============================= SYSTEM表空间是Oracle数据库最重要的一个表空间,存放了一些DDL

ArcSDE for Oracle表空间管理——暂时(TEMP)表空间

Oracle暂时表空间主要用来做查询和存放一些缓冲区数据.暂时表空间消耗的主要原因是须要对查询的中间结果进行排序. 重新启动数据库能够释放暂时表空间,假设不能重新启动实例,而一直保持问题sql语句的运行,temp表空间会一直增长.直到耗尽硬盘空间. 下面操作会占用大量的temporary:    1.用户运行imp/exp 导入导出操作时,会使用大量的temporary段    2.用户在Create 或者 rebuild index时    3.运行create table ...... as

DB2表空间管理的两种方式

下文将为您介绍DB2(DB2认证 DB2培训 ) 的表空间按管理方式,并附上相关问题的实例,供您参考,如果您对DB2表空间按管理方式感兴趣的话,不妨一看,会对您有所帮助. DB2 的表空间按管理方式分为两种:系统管理空间(System Management Space,SMS)和数据库管理空间(Database Management Space,DMS). 按类型分为:规则表空间.长整数表空间.系统临时表空间.用户临时表空间.其中长整数表空间只能是DMS的. 规则表空间中包含用户数据的表.默认用

3、表空间管理

表空间的管理类型: 数据字段管理的表空间(DMT) 本地化管理的表空间(LMT) 查询表空间是否是本地化管理方式,可以使用以下语句: 创建表空间,oracle将完成两个工作,一个在数据字典和控制文件,记录新建表空间的信息:另一个是在操作系统中创建指定大小的操作系统文件. 创建表空间(永久表空间permanent) create tablespace temp001 datafile 'D:\APP\ADMINISTRATOR\ORADATA\ORCL\temp001.DBF' size 100M

MySQL系列:innodb源码分析之表空间管理

innodb在实现表空间(table space)基于文件IO之上构建的一层逻辑存储空间管理,table space采用逻辑分层的结构:space.segment inode.extent和page.在实现层的逻辑使用了磁盘链表这种结构来管理逻辑关系.我们先来介绍磁盘链表. 1.磁盘链表 磁盘链表的实现fut0lst.*文件当中, innodb为了管理表空间和索引模块,定义了一个基于磁盘的链表,主要是用来保存磁盘数据结构之间的关系.这个链表不是基于内存指针的,而是基于page no和boffse

Oracle 12c CDB 和 PDB 表空间管理和配置 说明

 注:本文谢绝转载. 1  管理CDB中的表空间 CDB表空间的管理和non-CDB 表空间的管理一样,CDB 也有一个实例,在安装的时候指定. --查看表空间: SQL> select instance_name fromv$instance; INSTANCE_NAME ---------------- Cndba SQL> col file_name for a50 SQL> selecttablespace_name,file_id,file_name from dba_data

【oracle11g,13】表空间管理2:undo表空间管理(调优) ,闪回原理

一.undo空间原理: dml操作会产生undo数据. update时,sever process 会在databuffer 中找到该记录的buffer块,没有就从datafile中找并读入data buffer.在修改之前,原始数据先放到undo段,并在数据块头记录undo段(acitve 状态)中该数据块的位置,读写这个块时会占用事务槽,会将该事务号记录在数据块的头部.然后在进行update,并将该块放到dirty list检查点队列,等待dbwr进行写操作. 二.创建新的undo表空间替换