SQL Server转发记录指针的坏味道
什么是转发记录指针?
转发记录指针是堆表中特有的数据存储机制。
当你修改了某个数据页中的一行时,如果该行所在的数据页已经无法存放其修改后的行,
SQL Server会把这行数据移动到一个新的数据页上面去,并在原来的位置留下一个”记录转发指针”,指向到数据行新的位置。
图一
滥用记录转发指针的后果
转发记录指针是个非常麻烦的东西,对数据读取的性能百害无一利,
试想在一个满是转发指针记录的表中查找数据时,你需要根据这些转发指针记录在不同的数据页上跳来跳去,对性能的影响可想而知。
甚至连SQL Server自己也意识到这个机制并不完美,在未来的版本中可能不再存在。(《Inside SQL Server 2008》 Page296 )
下文我们将举个例子来说明转发指针记录如何影响性能。
--查询某个数据库中转发“指针记录大于”0的表
USE databasename
SELECT OBJECT_NAME(object_id) AS object_name
,page_count
,avg_page_space_used_in_percent
,record_count
,forwarded_record_count
FROM sys.dm_db_index_physical_stats (db_id(), NULL ,null, null,'DETAILED')
WHERE forwarded_record_count > 0 order by forwarded_record_count desc
图二
如图二显示,该表(table_name)一共有700页,但转发指针记录竟然达1750个,
这么多的转发指针记录,你知道这意味着什么吗?
在回答之前我们先可以思考一个问题:如果一个查询要对该表做一次全表扫描,逻辑读应该是多少?
我们来查询下:
set statistics io on
select * from table_name
图三
各位读者有什么感想,一张才700页的表竟然逻辑读了2450次,是实际数据页数量的3倍之多!
如何清除表中转发指针记录
既然转发指针记录的产生无法避免,是不是意味着我们就没有办法避免由此带来的性能问题呢?
我们知道,转发指针记录是因为当前页没有足够的空间容纳该行,致使行被迁出到新页中,
如果这个行的大小被收缩到满足页的容量或者页中有剩余的空间能够存储改行时,转发指针记录将会被清除,
如此说来,消除转发指针记录的方式还很多,比如:重建表、数据库压缩、创建聚集索引等所有重构表存储结构的操作。
本文以创建聚集索引作为推荐方式向大家介绍:
我们现在创建下聚集索引,从而让表的存储空间重新组织,
--创建聚集索引后查询
create index Clu_tname_labl on table_name(col1,col2)
然后我们再来看看这个查询:
set statistics io on
select * from table_name
逻辑读取由原来2450减少到543次,相比之前提升了将近4倍。
结论
上文介绍了转发指针记录的形成、对性能的影响及如何消除转发转发指针记录。
在实际环境中,我们或许不会专门去查找某个表的转发指针记录,但当遇到某个表查询性能较差时,作为一个性能影响的因素,我们不应该忽视。
最后,希望本文能够帮助到你!
SQL Server转发记录指针的坏味道的更多相关文章
- oracle 、mysql、 sql server使用记录
oracle .mysql. sql server使用记录 mysql常用命令: mysqld --启动mysql数据库 show databases; -- 查看数据库 use database; ...
- 使用SQL Server Audit记录数据库变更
最近工作中有一个需求,就是某一个比较重要的业务表经常被莫名其妙的变更.在SQL Server中这类工作如果不事前捕获记录的话,无法做到.对于捕获变更来说,可以考虑的选择包括Trace,CDC. ...
- SQL Server之记录筛选(top、ties、offset)汇总
一.TOP 筛选 如果有 ORDER BY 子句,TOP 筛选将根据排序的结果返回指定的行数.如果没有 ORDER BY 子句,TOP 筛选将按照行的物理顺序返回指定的行数. 1. 返回指定数目的行 ...
- SQL Server 表,记录 死锁解决办法
我自己的数据库表记录死锁后的 根据以下资料的 解决方案: 1. 先根据以下语句 查询 哪些表被 死锁,及 死锁的 spid SELECT request_session_id spid,OBJECT ...
- 【SQL Server 问题记录】A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.
本文涉及的相关问题,如果你的问题或需求有与下面所述相似之处,请阅读本文 A network-related or instance-specific error occurred while esta ...
- 新手C#SQL Server使用记录2018.08.10
主键(PrimaryKey):主键就是每个数据行(记录)的唯一标识,不会有重复值的列(字段)才能当做主键.一个表可以没有主键,但是这样会很难处理表,因此一般情况表都要设置主键. 主键有两张选用策略,分 ...
- 【Vegas原创】查询SQL Server更改记录的语句
指定数据库,然后: select Name,Create_date,Modify_Date from sys.objects where type in ('U','P', 'V','F', 'TR' ...
- SQL Server学习记录之获取每月每季度每年第一天和最后一天
DECLARE@dtdatetime SET@dt=GETDATE() DECLARE@numberint --1.指定日期该年的第一天或最后一天 --A. 年的第一天 SELECTCONVERT() ...
- Sql Server删除数据表中重复记录 三种方法
本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1 ...
随机推荐
- select、epoll、twisted网络编程
select.poll和epoll的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组 ...
- phpPgAdmin安装与配置
1.phpPgAdmin不需要安装,直接从Sourceforge下载压缩包,解压到“/var/www/”文件夹下即可. 解压后,要为该文件夹赋予root用户和root组的权限 chown -R roo ...
- php.ini 不生效问题extension
date.timezone = PRC extension_dir = "ext"
- Visual Studio VS2010统计代码行数(转载)
本文转自:http://blog.csdn.net/zhouworld16/article/details/9292851 在网上看到别人用的方法: 按CTRL+SHIFT+F (Find in fi ...
- linux磁盘限额和进阶文件系统的管理 quota RAID LVM
概念: Quota 的一般用途: 针对 WWW server ,例如:每个人的网页空间的容量限制! 针对 mail server,例如:每个人的邮件空间限制. 针对 file server,例如:每个 ...
- 获取DataGridView中的的选中行
1. 获取DataGridView中的的选中行:http://blog.csdn.net/yiqijinbu/article/details/7734593 2.winform datagridvie ...
- Visual Studio 必备神器
会使用工具是人类文明的一大进步,今天敏捷大行其道,好的工具可以大大的提高生产力,这里说的工具都是VS平台上的扩展工具,一些机械的部分可以交给工具去处理,自己多关注其他部分.下面分享下我觉得不错的工具, ...
- MVC学习(四)几种分页的实现(3)
在这篇MVC学习(四)几种分页的实现(2)博文中,根据URL中传入的两个参数(页码数,首页.上一页.下一页.末页的标记符)来获得对应的分页数据, 只是传入的参数太多,调用起来不太方便(标记符不能够写错 ...
- bootstrap的日期插件datetimepicker有问题
bootstrap的日期插件datetimepicker在chrome中会出现掉下来的现象,而且一直没找到原因,下载最新版的插件直接在各个浏览器中都会掉下来, 问题一直解决不了,转而换其他插件 htt ...
- Sql Server 孤立用户解决办法
Sql Server 孤立用户 是我们经常遇到的事情,今天详细的梳理了下,希望能帮到你 当把用户数据库从一台 Sql Server 使用备份和恢复的方式迁移到另一台服务器.数据库恢复以后,原先用户定义 ...



