iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >SQL Server是如何跟踪每一列的修改计数的?
  • 322
分享到

SQL Server是如何跟踪每一列的修改计数的?

2024-04-02 19:04:59 322人浏览 泡泡鱼
摘要

SQL Server是如何跟踪每一列的修改计数的? 《inside the sql Server query optimizer》第83页,有这样一段话:“SQL Server defnes wh

SQL Server是如何跟踪每一列的修改计数的?

 

《inside the sql Server query optimizer》第83页,有这样一段话:

SQL Server defnes when statistics are out of date by using column modifcation

counters or colmodctrs, which count the number of table modifcations, and which are

kept for each table column. Basically, for tables bigger than 500 rows, a statistics object

is considered out of date if the colmodctr value of the leading column has changed by

more than 500 plus 20% of the number of rows in the table. The same fORMula is used

by fltered statistics but, since they are built only from a subset of the records of the

table, the colmodctr value is frst adjusted depending on the selectivity of the flter.

Colmodctrs are usually not exposed by any SQL Server metadata although they can be

accessed by using a dedicated administrator connection and looking at the rcmodified

column of the sys.sysrscols base system table in SQL Server 2008 (same information

can be found on the sysrowset columns for SQL Server 2005).

 

下文翻译自:

Http://www.sqlskills.com/blogs/paul/how-are-per-column-modification-counts-tracked/

 

从SQLServer 2008开始,SQL Server通过一个隐藏的系统表sys.sysrscols的rcmodified列来跟踪表中每列的修改情况。隐藏的系统表(SQL Server2005时引进,当时我们重写了整个元数据管理系统)只有通过DAC(专用管理员连接)连接方式才能存取,我以前的博文有过介绍:必须使用SQLCMD –A连接或者要在你的连接字符串加上前缀“admin:”。

 

列修改情况也能通过sys.system_internals_partition_columns目录视图查看,这种方式不需要DAC方式。

 

不过记住,这些完全是基于我的背景知识以及观察而进行推断得出的结论,未来版本中可能会完全改变——因为它是非文档化的,所以你不要基于上面的推断来创建任何程序。

 

下面用一个简单表举个例子:

CREATE TABLE t1(c1 INT, c2 INT, c3 INT);
Go

 

我们用DAC查询每一列的修改计数,见下:

SELECT
p.[object_id],
p.[index_id],
rs.[rscolid],
rs.[rcmodified]
FROM sys.sysrscols rs
JOIN sys.partitions p
ON rs.[rsid] = p.[partition_id]
WHERE p.[object_id] = OBJECT_ID ('t1');
GO

 

查询结果如下:

object_id index_id rscolid rcmodified
———– ——– ———– ———–
277576027 0 1 0
277576027 0 2 0
277576027 0 3 0

 

用sys.system_internals_partition_columns视图查询:

SELECT
p.[object_id],
p.[index_id],
pc.[partition_column_id],
pc.[modified_count]
FROM sys.system_internals_partition_columns pc
JOIN sys.partitions p
ON pc.[partition_id] = p.[partition_id]
WHERE p.[object_id] = OBJECT_ID ('t1');
GO

 

下面我将一直用DAC直接查询sysrscols。

 

如果对表中列做一下修改,然后再运行DAC查询:

INSERT INTO t1VALUES (1, 1, 1);
GO
object_id index_id rscolid rcmodified
———– ———– ———– ——————–
277576027 0 1 0
277576027 0 2 0
277576027 0 3 0

 

嗯?没有变化嘛!别急,这是因为一些系统表只有在检查点(checkpoint)发生时才会将更新从内存中刷入。我们来试一下,然后再运行DAC查询。

CHECKPOINT;
GO
object_id index_id rscolid rcmodified
———– ———– ———– ——————–
277576027 0 1 1
277576027 0 2 1
277576027 0 3 1

 

下面仅仅更新c2两次,执行检查点,然后再运行DAC查询。

UPDATE t1 SET c2= 2;
UPDATE t1 SET c2 = 3;
CHECKPOINT;
GO
object_id index_id rscolid rcmodified
———– ———– ———– ——————–
277576027 0 1 1
277576027 0 2 3
277576027 0 3 1

 

是不是很酷?

Sysindexes视图中的rowmodctr列是什么样子呢?它是如何跟踪计数的呢?

 

它是记录索引统计的首列自上次统计重建(或初次创建)以来sysrscols.remodified计数的差值。

 

下面在表上创建一些简单的索引,然后查一下rowmodctr列:

CREATE NONCLUSTERED INDEX t1_c1_c2 ON t1 (c1, c2);
CREATE NONCLUSTERED INDEX t1_c3 ON t1 (c3);
GO
SELECT
[name],
[rowmodctr]
FROM sysindexes
WHERE [id] = OBJECT_ID ('t1');
GO
name rowmodctr
—————- ———–
NULL 3
t1_c1_c2 0
t1_c3 0

 

第一行是堆的情况,因为我没有建聚集索引。(译者:自表创建以来,该表任何统计首列所发生的修改的总和)

 

下面做一些变化,看看sysindexes.rowmodctr 和 sysrscols.rcmodified 是如何变化的。

UPDATE t1 SET c1= 4;
UPDATE t1 SET c1 = 5;
UPDATE t1 SET c1 = 6;
UPDATE t1 SET c2 = 2;
UPDATE t1 SET c2 = 3;
UPDATE t1 SET c3 = 2;
CHECKPOINT;
GO
object_id index_id rscolid rcmodified
———– ———– ———– ——————–
277576027 0 1 4
277576027 0 2 5
277576027 0 3 2
277576027 2 1 0
277576027 2 2 0
277576027 2 3 0
277576027 3 1 0
277576027 3 2 0
name rowmodctr
—————- ———–
NULL 5
t1_c1_c2 3
t1_c3 1

 

因为创建了非聚集索引,所以我对c1进行了3次更新,对c2进行了2次更新,对c3进行了一次更新。相应列的sysrscols.rcmodified计数器都增加了正确的值。但是你会发现它并没有跟踪非聚集索引的列本身。还有,每个非聚集索引的最后一列是一个隐藏的RID列,它指向对应堆中的数据记录。

 

但是,sysindexes.rowmodctr却不是按我们想的变化的。我对t1_c1_c2索引中的列分别做了5次修改。然而rowmodctr却只是3。这是因为rowmodctr的算法是跟踪索引统计的首列的sysrscols.rcmodified的变化值。(所以t1_c1_c2索引只是跟踪c1列。)

 

为了证明它,我更新统计,对c1做2次修改、对c2做4次修改,然后执行检查点。我们应该发现c1的sysrscols.rcmodified为6,c2的为9;t1_c1_c2的sysindexes.rowmodctr的变为2.

UPDATE STATISTICSt1;
GO
UPDATE t1 SET c1= 7;
UPDATE t1 SET c1 = 8;
UPDATE t1 SET c2 = 4;
UPDATE t1 SET c2 = 5;
UPDATE t1 SET c2 = 6;
UPDATE t1 SET c2 = 7;
CHECKPOINT;
GO
object_id index_id rscolid rcmodified
———– ———– ———– ——————–
277576027 0 1 6
277576027 0 2 9
277576027 0 3 2
277576027 2 1 0
277576027 2 2 0
277576027 2 3 0
277576027 3 1 0
277576027 3 2 0
name rowmodctr
—————- ———–
NULL 9
t1_c1_c2 2
t1_c3 0

 

就是这样的。即使我们4次更新c2。t1_c1_c2的Sysindexes.rowmodctr也仅仅是2,很明显是c1的sysrscols.rcmodified差值。

 

您可能感兴趣的文档:

--结束END--

本文标题: SQL Server是如何跟踪每一列的修改计数的?

本文链接: https://www.lsjlt.com/news/41928.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • sql怎么修改某一列的数据
    要修改某一列的数据,可以使用UPDATE语句。以下是一个示例: UPDATE 表名 SET 列名 = 新值 WHERE 条件...
    99+
    2024-04-09
    sql
  • sql如何修改表列的数据类型
    要修改表列的数据类型,可以使用ALTER TABLE语句。例如,要将表中的某一列的数据类型从INT改为VARCHAR,可以使用以下语...
    99+
    2024-04-09
    sql
  • mysql如何修改一列的值
    本篇内容主要讲解“mysql如何修改一列的值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql如何修改一列的值”吧! 在mys...
    99+
    2024-04-02
  • 怎么用sql语句修改一列数据的值
    要使用SQL语句修改一列数据的值,可以使用UPDATE语句。以下是一个示例: 假设有一个名为students的表,其中有一列名为ag...
    99+
    2024-04-09
    sql
  • SQL Server数据库的如何修复SQL语句
    SQL Server数据库的如何修复SQL语句,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。出现这些情况的原因,往往是因为数据库有些损坏,...
    99+
    2024-04-02
  • 如何有效地跟踪Bug记录带有详细参数值的SQL
    本篇文章为大家展示了如何有效地跟踪Bug记录带有详细参数值的SQL,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在实际开发工作中,可能需要很多调试的工作,通过调试,...
    99+
    2024-04-02
  • 如何分析SQL Server 数据库的设计
    如何分析SQL Server 数据库的设计,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、数据库设计的必要性在实际的软件项目中,如果系统中需要存储的数据量...
    99+
    2023-06-26
  • Python如何修改列表的数字
    要修改列表中的数字,只需通过索引访问到要修改的元素,并将其重新赋值即可。例如,假设有一个列表numbers,想要将索引为2的元素修改...
    99+
    2023-10-18
    Python
  • Pandas:如何修改DataFrame中某一列的值?
    写这篇博客主要是因为在修改DataFrame列值的时候经常遇到bug,但到目前还没把这种错误复现出来。   DataFrame是Pandas中的主要数据结构之一,本篇博客主要介绍如何DataFr...
    99+
    2023-09-01
    pandas python 数据分析
  • oracle如何修改列的数据类型
    要修改Oracle表的列数据类型,需要使用ALTER TABLE语句。以下是一些示例: 修改列的数据类型: ALTER TABL...
    99+
    2024-04-15
    oracle
  • SQL Server如何通过SQL语句直接操作另一台服务器上的SQL SERVER的数据
    SQL Server如何通过SQL语句直接操作另一个SQL SERVER的数据 1、 现在执行SQL语句的数据库服务器开启Ad Hoc Distributed Queries  exec sp_configur...
    99+
    2024-04-02
  • mysql如何获取某个时间段每一天、每一个小时的统计数据
    小编给大家分享一下mysql如何获取某个时间段每一天、每一个小时的统计数据,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!获取每一天的统计数据做项目的时候需要统对项目日志做分析,其中有一个需...
    99+
    2024-04-02
  • sql语句修改SQL Server数据库逻辑名、数据库名、物理名的方法是什么
    这篇文章将为大家详细讲解有关sql语句修改SQL Server数据库逻辑名、数据库名、物理名的方法是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。更改M...
    99+
    2024-04-02
  • mysql如何修改表中列的数据类型
    要修改表中列的数据类型,可以使用 ALTER TABLE 语句来实现。以下是修改列数据类型的示例: ALTER TABLE 表名 M...
    99+
    2024-04-22
    mysql
  • MSSQL如何修改已有数据的表的自增列
    这篇文章主要介绍了MSSQL如何修改已有数据的表的自增列,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 use...
    99+
    2024-04-02
  • Ajax如何遍历jSon后对每一条数据进行相应的修改和删除
    这篇文章主要介绍Ajax如何遍历jSon后对每一条数据进行相应的修改和删除,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体代码如下所示:$.ajax({ url: &qu...
    99+
    2024-04-02
  • Vue如何动态修改el-table的某列数据
    目录动态修改el-table的某列数据设置el-table某一列点击出现输入框可以编辑动态修改el-table的某列数据 1.对话框打开时调用函数open@opened="...
    99+
    2024-04-02
  • SQL Group By分组后如何选取每组最新的一条数据
    目录问题方法一:加limit关键字方法二:用max函数总结Group By分组后选取每组最新的一条数据 问题 group by语句只会展示一条数据,而且很多时候并不会展示我们想要的数...
    99+
    2022-11-13
    group by 分组后取每组数据 group by 取第一条 group by最新的数据
  • SQL Group By分组后如何选取每组最新的一条数据
    目录问题方法一:加limit关键字方法二:用max函数总结Group By分组后选取每组最新的一条数据 问题 group by语句只会展示一条数据,而且很多时候并不会展示我们想要的数据,如何解决呢 首先我们先建一张表 t...
    99+
    2024-04-02
  • php table表格一行的数据如何修改
    在 PHP 中,我们可以通过以下的步骤来修改表格中某一行的数据:首先,我们需要连接到数据库,并且查询需要修改的数据。这个查询可以是任何一种查询,例如 SELECT、UPDATE 等。在查询返回结果集之后,我们可以使用 foreach...
    99+
    2023-05-24
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作