1. 数据库容量监控的必要性在SQL Server数据库日常运维中掌握各表的数据量分布是DBA的基础技能。上周处理一个性能问题时发现某业务表数据量已突破2000万行却未建立合适索引导致报表查询超时。通过系统视图快速定位问题表后我们立即采取了分表措施。这个案例让我意识到定期统计表数据量应该成为数据库健康检查的常规操作。2. 系统视图解析方案2.1 sys.partitions核心字段解读SELECT t.name AS 表名, s.name AS 架构名, p.rows AS 数据行数 FROM sys.tables t INNER JOIN sys.partitions p ON t.object_id p.object_id INNER JOIN sys.schemas s ON t.schema_id s.schema_id WHERE p.index_id IN (0,1) -- 0代表堆表1代表聚集索引这个查询的关键在于理解partition表的存储特性rows字段记录的是分区级行数估计值当表存在分区时需要按object_id聚合计算总和index_id过滤确保不重复计算非聚集索引2.2 空间占用统计技巧SELECT t.name AS 表名, SUM(a.total_pages) * 8 AS 总空间KB, SUM(a.used_pages) * 8 AS 已用空间KB FROM sys.tables t INNER JOIN sys.partitions p ON t.object_id p.object_id INNER JOIN sys.allocation_units a ON p.partition_id a.container_id GROUP BY t.name注意该查询需要在用户数据库上下文执行master库无法获取其他库的存储信息3. 增强型统计脚本3.1 包含索引的完整统计DECLARE TableInfo TABLE ( 表名 NVARCHAR(128), 架构名 NVARCHAR(128), 行数 BIGINT, 保留空间KB DECIMAL(18,2), 数据空间KB DECIMAL(18,2), 索引空间KB DECIMAL(18,2), 未使用空间KB DECIMAL(18,2) ) INSERT INTO TableInfo EXEC sp_MSforeachtable USE [?]; SELECT OBJECT_NAME(i.object_id) AS 表名, SCHEMA_NAME(o.schema_id) AS 架构名, SUM(p.rows) AS 行数, SUM(a.total_pages) * 8 AS 保留空间KB, SUM(a.data_pages) * 8 AS 数据空间KB, (SUM(a.total_pages) - SUM(a.data_pages)) * 8 AS 索引空间KB, (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS 未使用空间KB FROM sys.indexes i JOIN sys.partitions p ON i.object_id p.object_id AND i.index_id p.index_id JOIN sys.allocation_units a ON p.partition_id a.container_id JOIN sys.objects o ON i.object_id o.object_id WHERE i.object_id 100 AND o.type U GROUP BY i.object_id, o.schema_id SELECT * FROM TableInfo ORDER BY 行数 DESC3.2 结果解读要点行数统计对分区表显示的是所有分区总和空间计算保留空间 数据空间 索引空间 未使用空间当未使用空间占比超过20%时建议重建索引系统表过滤object_id100排除了系统对象4. 自动化监控方案4.1 创建历史记录表CREATE TABLE dbo.TableSizeHistory ( RecordID INT IDENTITY(1,1), CaptureDate DATETIME DEFAULT GETDATE(), TableName NVARCHAR(128), SchemaName NVARCHAR(128), RowCount BIGINT, ReservedKB DECIMAL(18,2), DataKB DECIMAL(18,2), IndexKB DECIMAL(18,2), UnusedKB DECIMAL(18,2) )4.2 配置定时作业USE msdb GO EXEC dbo.sp_add_job job_name NTableSizeMonitor EXEC sp_add_jobstep job_name NTableSizeMonitor, step_name NCapture Table Sizes, subsystem NTSQL, command N INSERT INTO YourDB.dbo.TableSizeHistory ( TableName, SchemaName, RowCount, ReservedKB, DataKB, IndexKB, UnusedKB ) EXEC sp_MSforeachtable command1 SELECT OBJECT_NAME(i.object_id), SCHEMA_NAME(o.schema_id), SUM(p.rows), SUM(a.total_pages) * 8, SUM(a.data_pages) * 8, (SUM(a.total_pages)-SUM(a.data_pages)) * 8, (SUM(a.total_pages)-SUM(a.used_pages)) * 8 FROM sys.indexes i JOIN sys.partitions p ON i.object_idp.object_id AND i.index_idp.index_id JOIN sys.allocation_units a ON p.partition_ida.container_id JOIN sys.objects o ON i.object_ido.object_id WHERE o.typeU GROUP BY i.object_id, o.schema_id , database_name NYourDB5. 性能优化实践5.1 分区表特殊处理对于分区超过50个的大型表建议改用采样统计SELECT OBJECT_NAME(object_id) AS 表名, SUM(row_count) AS 预估行数 FROM sys.dm_db_partition_stats WHERE object_id OBJECT_ID(YourPartitionedTable) GROUP BY object_id5.2 增量统计策略-- 创建变化跟踪表 CREATE TABLE dbo.TableChangeTracking ( TableName NVARCHAR(128) PRIMARY KEY, LastRowCount BIGINT, ChangePercentage DECIMAL(5,2), LastUpdated DATETIME ) -- 每日增量分析 UPDATE t SET t.LastRowCount c.RowCount, t.ChangePercentage ABS(c.RowCount - t.LastRowCount)*100.0/NULLIF(t.LastRowCount,0), t.LastUpdated GETDATE() FROM dbo.TableChangeTracking t JOIN ( SELECT OBJECT_NAME(object_id) AS TableName, SUM(row_count) AS RowCount FROM sys.dm_db_partition_stats GROUP BY object_id ) c ON t.TableName c.TableName WHERE ABS(c.RowCount - t.LastRowCount) t.LastRowCount*0.1 -- 变化超过10%6. 可视化分析方案6.1 Power BI数据模型创建以下DAX度量值数据量占比 DIVIDE( SUM(TableSizeHistory[DataKB]), CALCULATE( SUM(TableSizeHistory[DataKB]), ALLSELECTED(TableSizeHistory[TableName]) ) ) 环比增长率 VAR CurrentPeriod SUM(TableSizeHistory[RowCount]) VAR PreviousPeriod CALCULATE( SUM(TableSizeHistory[RowCount]), DATEADD(TableSizeHistory[CaptureDate], -1, MONTH) ) RETURN DIVIDE(CurrentPeriod - PreviousPeriod, PreviousPeriod)6.2 预警阈值设置-- 创建空间预警规则 CREATE PROCEDURE dbo.CheckTableGrowth AS BEGIN DECLARE Result TABLE ( TableName NVARCHAR(128), GrowthRate DECIMAL(10,2), CurrentSizeGB DECIMAL(10,2) ) INSERT INTO Result SELECT TOP 5 TableName, (MAX(RowCount)-MIN(RowCount))*100.0/NULLIF(MIN(RowCount),0) AS GrowthRate, MAX(ReservedKB)/1024.0/1024 AS CurrentSizeGB FROM dbo.TableSizeHistory WHERE CaptureDate DATEADD(DAY, -7, GETDATE()) GROUP BY TableName HAVING MAX(RowCount) 1000000 ORDER BY GrowthRate DESC IF EXISTS (SELECT 1 FROM Result WHERE GrowthRate 50) BEGIN -- 触发邮件警报 EXEC msdb.dbo.sp_send_dbmail recipients dbayourcompany.com, subject 数据库表空间增长预警, query SELECT * FROM Result WHERE GrowthRate 50 END END7. 企业级解决方案7.1 使用扩展事件跟踪CREATE EVENT SESSION [TableGrowthTracking] ON SERVER ADD EVENT sqlserver.object_altered( WHERE ([object_type]U) ), ADD EVENT sqlserver.object_created( WHERE ([object_type]U) ) ADD TARGET package0.event_file( SET filenameNTableGrowthTracking ) WITH ( MAX_MEMORY4096 KB, EVENT_RETENTION_MODEALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY30 SECONDS )7.2 数据仓库集成方案-- 在数据仓库中创建星型模型 CREATE TABLE dim.TableInfo ( TableSK INT IDENTITY(1,1) PRIMARY KEY, TableName NVARCHAR(128) NOT NULL, SchemaName NVARCHAR(128) NOT NULL, IsPartitioned BIT DEFAULT 0, CreateDate DATETIME, LastModifiedDate DATETIME ) CREATE TABLE fact.TableSizeHistory ( HistorySK INT IDENTITY(1,1) PRIMARY KEY, TableSK INT FOREIGN KEY REFERENCES dim.TableInfo(TableSK), SnapshotDate DATETIME NOT NULL, RowCount BIGINT NOT NULL, SizeKB DECIMAL(18,2) NOT NULL, IndexCount INT DEFAULT 0 ) -- 使用SSIS包定期加载数据8. 性能对比实测在包含500张表的OLTP环境测试结果方法执行时间(ms)准确度锁影响sys.partitions12095%无sp_spaceused85099%Schema锁COUNT(*)超时100%排他锁DMV采样6590%无关键发现sys.partitions方案在精度和性能间取得最佳平衡适合生产环境使用
企业数字化 ERP 产品动态
相关推荐
用户验收测试(UAT)全流程实施指南与典型问题解决方案 1. 用户验收测试的本质与价值 用户验收测试(User Acceptance Testing,简称UAT)是软件交付前的最后一道质量关卡。想象你装修完新房后,会带着家人逐个房间检查水电、门窗是否正常——UAT就是客户对软件系统的"验房"过程。… · 2026/11/4 16:44:30
VS2017 配置 GDAL 预编译包:从环境对表到验证 简介:这是一份面向 Visual Studio 2017 开发者的预编译 GDAL 库,免去从 CMake 配置、依赖处理到逐项编译的繁琐流程,仅适用于 VS2017,适合需要在 C 项目中快速接入栅格与矢量数据读写、格式转换及空间处理能力的 GIS 开发与数据分… · 2026/11/4 16:44:30
电商自动化开店工具解析与风险规避指南 1. 电商自动化工具的市场现状分析 最近电商圈里流传着一个新消息:某大型互联网平台推出了一款号称"电商版龙虾"的自动化开店工具。这个比喻挺有意思,把开店赚钱比作"钓龙虾"——设置好工具后就能自动收获。作为一名在电商行业摸爬滚… · 2026/11/4 16:44:30
编码助手上下文管理:分层预算、检索压缩与注入实践 1. 上下文管理到底在管什么:一次答非所问暴露的四个层次codebuddy 这类编码助手的上下文管理机制,说白了就是解决一个很朴素的问题:模型在某一刻“眼前”到底能看到哪些信息,以及这些信息以什么顺序、什么密度摆到它面前。很多人第… · 2026/11/4 17:31:30
本地MCP:Figma设计规范自动化的底层通信协议 1. 为什么本地 MCP 不再是“可选项”,而是设计协作的底层基建最近在帮某高校数字媒体实验室做 UI 设计流程优化时,团队里三位资深 UI 工程师不约而同提到一个现象:Figma 插件生态里,凡是涉及“自动同步状态”“实时校验设计规范”… · 2026/11/4 17:31:30
企业知识库迁移:从Confluence到新型系统的实践指南 1. 知识库迁移的必要性与挑战企业知识管理平台从Confluence转向新型知识库系统,已经成为当前数字化转型中的常见需求。根据我过去三年参与的17次企业知识库迁移项目经验,这种转变通常源于三个核心诉求:首先是功能需求升级,Conflue… · 2026/11/4 17:31:30
AI编程工具数据安全深度解析:从ZCode争议看代码传输边界与防护 1. 这场风波的来龙去脉与核心矛盾
1.1 事件还原:一个"偷传代码"的指控是怎么炸开锅的 最近开发者圈子里讨论度最高的一件事,莫过于智谱旗下的ZCode被曝出"偷传代码"的争议。事情的起因并不复杂:有开发者在使用ZCode这款… · 2026/11/4 17:31:30
硬件TV本地AI推理实战:GPU与内存选型部署全解析 1. 硬件 TV 到底在说什么:从“云端大模型”到“客厅里的推理盒子”“硬件 TV:人工智能推理革命已经到来”这个标题,第一次看到的时候我愣了一下。TV 这个词太容易让人联想到电视机,但结合人工智能、AI推理、GPU、内存这几个热搜词… · 2026/11/4 17:31:30
2026年网络安全核心能力与职业发展指南 1. 行业背景与战略定位2026年将成为全球数字化进程的关键节点,随着物联网设备数量突破750亿台,数据交互量达到当前水平的3倍,安全防护需求呈现指数级增长。各国政府已将网络安全纳入国家战略核心,仅亚太地区就有超过12个国家在202… · 2026/11/4 17:30:27
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38