SQL Server中的Forwarded Record计数器影响IO性能的解决方法

技术SQL Server中的Forwarded Record计数器影响IO性能的解决方法SQL Server中的Forwarded Record计数器影响IO性能的解决方法,针对这个问题,这篇文章详细介绍了相对应的分析和

SQL Server中的转发记录计数器会影响输入输出性能。针对这个问题,本文详细介绍了相应的分析和解决方法,希望能帮助更多想要解决这个问题的小伙伴找到一个更简单易行的方法。

一、简介

最近,一位客户注意到一个高计数器(转发记录/秒),伴随着磁盘等待队列的间歇性波动。本文分享了什么是转发记录,并从原理上讨论了为什么转发记录会导致额外的IO。

二、存放原理

在SQL Server中,当数据存储在堆中时,数据是无序的,所有非聚集索引的指针都存储指向物理地址的rid。当数据行中可变长度列的增长使旧页面无法容纳下一个数据行时,数据将被移动到新页面,在原始位置留下指向新页面的指针。这样做的原因是,当更新记录时,所有非聚集索引的指针都不需要更改。

这种数据更新只在原始位置留下一个指针,指向存储新数据页的行,称为转发记录。

三、Forwarded Record如何影响IO性能?

那么,既然转发记录是一种提高性能的机制,为什么会造成性能问题呢?Forwarded Record的初衷是在堆表上更新时,堆表上存储位置的改变不会同时更新非聚集索引,会造成开销。但是,对于搜索来说,无论是堆表上有表扫描还是用于书签搜索,都会使额外的IO开销翻倍。这里有一个例子。

begin inner while @ index 100000 begin insertingdb。堆测试(ID,col1)值(@ index,null)设置@ index=@ index1endcommit代码清单1。创建一个新的堆表并插入100,000条数据。

通过清单1创建一个测试表,循环插入100,000个数据。现在,让我们看看堆表占用的存储页面。

此时,更新表,使原始行增长,生成Forwarded Record,然后查看堆表的存储。

这时我们注意到,虽然数据只占590页,却有一条8W转发记录。如果我们扫描表,会看到虽然只有590页,但是我们需要8W的逻辑IO,这就大大增加了IO上的开销压力。此外,由于转发的记录页面与原始页面在物理上不连续,这也对IOPS提出了挑战。

而上述查询反映在性能计数器中。

四、如何解决

看到转发记录计数器意味着数据库中有堆表。在OLTP系统中,所有的表都应该有聚集索引。因此,这个问题可以通过向表中添加聚集索引来解决。

一般来说,只将只写不读的表设置为堆表是比较合适的,但是如果看到有一个Forwarded Reocord,就说明堆表上有一个读操作,所以找到堆表并找到合适的维护窗口时间来创建堆表是比较理想的选择。

如果由于其他原因无法创建聚集索引,则可以重建堆表。

SQL Server中的转发记录计数器影响IO性能的问题的解决方案将在这里分享。我希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/128593.html

(0)

相关推荐

  • HBase如何实现多租户

    技术HBase如何实现多租户这篇文章主要介绍了HBase如何实现多租户,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。多租户(multi-tenancy t

    攻略 2021年12月9日
  • keil如何下载至单片机(keil5 hex文件怎么下载到单片机)

    技术KeilC51基础中如何生成可以下载到单片机的Hex文件KeilC51基础中如何生成可以下载到单片机的Hex文件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个

    攻略 2021年12月24日
  • C/C++指针知识点有哪些

    技术C/C++指针知识点有哪些本篇内容介绍了“C/C++指针知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基

    攻略 2021年11月30日
  • docker-compose基本开发环境部署文件是怎样的

    技术docker-compose基本开发环境部署文件是怎样的docker-compose基本开发环境部署文件是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个

    攻略 2021年11月18日
  • DG主库忘记force logging情况下insert append了nologgin表操作是怎样的

    技术DG主库忘记force logging情况下insert append了nologgin表操作是怎样的这篇文章给大家介绍DG主库忘记force logging情况下insert append了nologgin表操作是

    攻略 2021年11月30日
  • go module是如何使用本地包的

    技术go module是如何使用本地包的小编给大家分享一下go module是如何使用本地包的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!g

    攻略 2021年11月27日