堆表上的转发记录

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

为什么会有转发记录?

当堆表里的记录需要移动到不同的物理位置时,SQL Server使用转发记录。假设你有一个变长列的表,首先你在堆表里插入一些记录,这个时候你没有在变长列里存储任何数据:

复制代码
 1 -- Create a table to demonstrate forwarding records
 2 CREATE TABLE HeapTable
 3 (
 4     Col1 INT IDENTITY(1, 1),
 5     Col2 CHAR(2000),
 6     Col3 VARCHAR(1000)
 7 )
 8 GO
 9 
10 -- Insert 4 records - those will fit into one page
11 INSERT INTO HeapTable VALUES
12 (
13     REPLICATE('1', 2000),
14     ''
15 ),
16 (
17     REPLICATE('2', 2000),
18     ''
19 ),
20 (
21     REPLICATE('3', 2000),
22     ''
23 ),
24 (
25     REPLICATE('4', 2000),
26     ''
27 )
28 GO
复制代码

当你在变长列执行UPDATE语句时,想象下会发生什么?在那个情况下SQL Server可能需要扩展这个记录,因为记录大小更长了,其他记录必须从同个数据页移走。

1 -- Let's update the table and expand each row of the table
2 UPDATE HeapTable
3 SET Col3 = REPLICATE('5', 1000)
4 GO

在那个情况下,SQL Server在原始位置留下称为转发记录,它指向记录最终存储的新位置。

 

SQL Server需要使用这个方法来避免更新同个表上所有非聚集索引。你可能知道,当你在堆表上创建非聚集索引时,在叶子层,非聚集索引指向记录数据存储的物理位置。没有抓发记录的话,所有这些指针都要改变,这会大幅度降低你的性能。

如何修正转发记录?

为了找出表里是否包含转发记录,你可以使用DMF sys.dm_db_index_physical_stats。当你在堆表上调用这个函数并传入DETAILED模式,SQL Server通过forwarded_record_count列告诉你表上的转发记录数。

复制代码
 1 -- Check the forwarding record count through sys.dm_db_index_physical_stats
 2 SELECT
 3     index_type_desc,
 4     page_count, 
 5     avg_page_space_used_in_percent,
 6     avg_record_size_in_bytes,
 7     forwarded_record_count
 8 FROM sys.dm_db_index_physical_stats
 9 (
10     DB_ID('ALLOCATIONDB'), 
11     OBJECT_ID('HeapTable'),
12     NULL, 
13     NULL, 
14     'DETAILED'
15 )
16 GO
复制代码

可以看到,表上有2条转发记录,在4条记录之外。为了去掉这些转发记录,你可以重建表。

1 -- Rebuild the heap table to get rid of the Forwarding Records
2 ALTER TABLE HeapTable REBUILD
3 GO

再次运行刚才的查询,你会发现转发记录已经消失。

复制代码
 1 -- Check the forwarding record count through sys.dm_db_index_physical_stats
 2 SELECT
 3     index_type_desc,
 4     page_count, 
 5     avg_page_space_used_in_percent,
 6     avg_record_size_in_bytes,
 7     forwarded_record_count
 8 FROM sys.dm_db_index_physical_stats
 9 (
10     DB_ID('ALLOCATIONDB'), 
11     OBJECT_ID('HeapTable'),
12     NULL, 
13     NULL, 
14     'DETAILED'
15 )
16 GO
复制代码

DBA总会考虑到索引碎片,索引重建和索引重新组织操作。但没有人想过堆表里的转发记录。如果你维护数据库,经常检查下堆表上的转发记录数,保证始终有最好的性能,这是个非常好的想法。

小结

在这个文章里你看到了堆表上转发记录是咋样,它是如何降低的记录读取,因为需要额外的逻辑读。当我为数据库进行健康检查时,我在检查堆表时,总会看下转发记录数。



本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/4596815.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
Linux 网络安全 网络架构
记录没有到主机的路由问题解决
报错日志没有到主机的路由
3421 0
记录没有到主机的路由问题解决
|
8月前
|
C++
C++ 完美转发
C++ 完美转发
41 0
|
网络协议 安全 Unix
虚拟路由和转发 (VRF) 表上下文中的多点标签分发协议带内信令
本文档是 Internet 工程任务组 (IETF) 的产品。它代表了 IETF 社区的共识。它已接受公众审查,并已获互联网工程指导小组 (IESG) 批准出版。有关 Internet 标准的更多信息,请参见 RFC 5741 的第 2 节。
365 0
虚拟路由和转发 (VRF) 表上下文中的多点标签分发协议带内信令
|
消息中间件 RocketMQ 开发者
转发数据到 ConsumerQueue 文件|学习笔记
快速学习转发数据到 ConsumerQueue 文件
62 0
转发数据到 ConsumerQueue 文件|学习笔记
|
网络协议 网络架构
IP路由基础、路由器静态路由配置方法、自治系统、缺省路由的配置方法、路由选路规则、缺省路由、备份路由、等价路由、三种查询路由表命令
路由器特点,网络IP地址规划网络间的特性,基本路由思想,编辑静态路由部分,查询设备整个路由表,查看特定的路由协议时使用,查询目的地址2.2.2.2的路由条目,IP路由表代码写法,IP路由表里的信息,路由表来源,路由表的信息,路由表选路规则,缺点:缺省路由,备份路由,等价路由,做实验的步骤......
IP路由基础、路由器静态路由配置方法、自治系统、缺省路由的配置方法、路由选路规则、缺省路由、备份路由、等价路由、三种查询路由表命令
|
缓存 网络协议 物联网
DFP 数据转发协议 规则说明(二)
DFP 是什么? 稳控科技编写的一套数据转发规则, 取自“自由转发协议 FFP(Free Forward Protocol)” ,或者 DFP(DoubleF Protocol), DF 也可以理解为 Datas Forward(数据转发)的缩写。DF 协议是与硬件接口无关的数据链路层协议,规定了数据流如何在不同设备之间、不同接口之间的传输方向。 DF 协议一般用于延长数字接口的传输距离(数据中继),它与硬件接口类型无关,可以基于 UART、 LoRA、TCP 等异步数据传输介质。
DFP 数据转发协议 规则说明(二)
|
网络协议 物联网
DFP 数据转发协议规则说明
一套数据转发规则,取自“自由转发协议 FFP(Free Forward Protocol)”,或者 DFP(Double F Protocol),DF 也可以理解为 Datas Forward(数据转发)的缩写。
DFP 数据转发协议规则说明
|
网络协议 Unix Go
sockfwd 一个数据转发的小工具
一个在socket之间转发数据的小工具。