博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
统计--追踪数据更新情况
阅读量:6040 次
发布时间:2019-06-20

本文共 3070 字,大约阅读时间需要 10 分钟。

 背景: 在统计自动更新设置为ON时(默认设置),当更新次数达到一定阀值后便会触发自动更新。

 

本文通过一些测试来探究SQL SERVER 如何追踪数据更新情况和如何计算更新次数。

--==========================================

--可以使用以下系统表来查看列变化情况
--sys.system_internals_partition_columns
--sys.sysindexes
--sys.sysrscols(需要使用DAC)
--==========================================
--生成测试表和索引
DROP TABLE dbo.TB001
GO
CREATE TABLE dbo.TB001
(
   ID INTIDENTITY(1,1) NOT NULL,
   C1 INT,
   C2 INT
)
GO
ALTER TABLE dbo.TB001
ADD CONSTRAINT PK_TB001
PRIMARY KEY(ID)
GO
CREATE INDEX IX_C2 ON dbo.TB001(C1)
--===========================================
--插入10 条数据
INSERT INTO TB001(C1,C2)
SELECT 1,1
GO 10
--============================================
--数据修改不会即时更新到系统表中,需要使用CHECKPOINT
--来将更新flush到系统表中
CHECKPOINT
GO
--============================================
--使用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('dbo.TB001');
GO

--================================================

--查看非聚簇索引上的变化
SELECT I.name,I.rowcnt,I.rowmodctr
FROM sys.sysindexes I
WHERE I.id=OBJECT_ID('dbo.TB001');

--================================================

--重建索引
ALTER INDEX [PK_TB001] ON [dbo].[TB001] REBUILD
GO
ALTER INDEX [IX_C2] ON [dbo].[TB001] REBUILD
GO
--===============================================
--重建索引后发现被索引的列的值没有发生变化
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('dbo.TB001');
GO

 --================================================

--查看非聚簇索引上的变化
--重建索引后,索引变化rowmodctr的值被清零
SELECT I.name,I.rowcnt,I.rowmodctr
FROM sys.sysindexes I
WHERE I.id=OBJECT_ID('dbo.TB001');
GO

--================================

--对一行数据更新110 遍
UPDATE TB001
SET C1=2
WHERE ID=1
GO 110
CHECKPOINT
--================================================
--查看非聚簇索引上的变化
--发现单行数据被修改110 次,rowmodctr被置为 110
--即使值未发生变化,也被记录为一次修改
 
SELECT I.name,I.rowcnt,I.rowmodctr
FROM sys.sysindexes I
WHERE I.id=OBJECT_ID('dbo.TB001');
GO

--==============================

--更新统计
sp_updatestats
--================================================
--查看非聚簇索引上的变化
--统计被更新后,rowmodctr被重置为0
SELECT I.name,I.rowcnt,I.rowmodctr
FROM sys.sysindexes I
WHERE I.id=OBJECT_ID('dbo.TB001');
GO

 

使用脚本查看

--查看最后统计更新的时间及最后一次更新后数据更新的次数SELECT  T.[name] AS TableName ,        S.[name] AS StatsName ,        P.last_updated AS LastUpdatedTime ,        P.[rows] AS TableRows ,        P.rows_sampled AS SampledRows ,        P.modification_counter AS ModifiedRowsFROM    sys.tables T        INNER JOIN sys.stats S ON T.[object_id] = S.[object_id]        OUTER APPLY sys.dm_db_stats_properties(S.[object_id], s.[stats_id]) AS P--WHERE T.[name]=''

 

总结:

1. 使用sys.system_internals_partition_columns来查看聚簇索引上的更新次数
2. 使用sys.sysindexes来查看非聚簇索引上的更新次数
3. 重建索引会导致更新次数数据被重置为零(建议在索引重建后更新统计)
4. 更新次数计算的是更新操作的次数(即使值未发生变化,也被记录为一次修改)
5. 在统计被更新后,更新次数被重置为零

 

参考链接:

 

照例来张图:

转载地址:http://tbrhx.baihongyu.com/

你可能感兴趣的文章
浅谈js闭包(closure)
查看>>
【regex】POSIX标准正则表达式库
查看>>
C#集成FastReport.Net并将模板保存到数据库
查看>>
python装饰器(decorator)两种模式探讨集合
查看>>
高级 DO 语法
查看>>
Jexus下配置多个站点
查看>>
C#中==与Equals方法的区别
查看>>
Xcode编辑器的技巧与诀窍
查看>>
String、StringBuffer与StringBuilder之间区别
查看>>
工作第十三周:身体掏空,精神饱满
查看>>
Linux 内核--任务0的运行(切换到用户模式)move_to_user_mode
查看>>
ios扩展机制objc_setAssociatedObject,objc_getAssociatedObject
查看>>
批量添加-fno-objc-arc
查看>>
二叉树的层序遍历
查看>>
os模块
查看>>
安装 matplotlib
查看>>
css伪类(:before和:after)
查看>>
react native TypeError network request failed
查看>>
PLSQL锁表之后改如何操作
查看>>
Sql注入、文件上传与手机品牌信息抓取解决方案
查看>>