在 32 GB 内存和 4 个内核、60-80 个并发连接、大量临时工作负载上运行 SQL Server 2012 SP3,我们看到 SQL Server 进程 (CPU) 出现峰值,并且在不可预测的时间每天保持一两次峰值。我们正在努力确定峰值的根本原因。与此同时,我们发现改变最大内存设置(向上或向下)似乎是唯一能让 CPU 负载恢复正常的方法。
检查日志并搜索 StackExchange ( https://dba.stackexchange.com/a/183276 ),我们看到计划缓存正在通过更改最大内存设置进行刷新。但是,如果我们通过 DBCC FREESYSTEMCACHE('SQL Plans') 刷新计划缓存,则 CPU 负载不会恢复正常。
由于无论天气如何增加或减少它,更改最大内存设置都可以解决问题,因此该问题似乎与最大服务器内存设置没有直接关系。因此,我们试图了解更改内存设置还有什么作用,然后使用该信息来帮助确定 CPU 峰值的根本原因。
运行 SQL Server 2012 标准,同时使用复制数据和日志传送。每隔几分钟创建一次事务日志备份。
这个问题与文件系统报告的空间量无关。
我们有一个包含四个 VARCHAR(max) 列的日志表。该表目前包含大约 180 GB 的数据。该表以每月大约 10 GB 的速度增长。
为了为未来的增长腾出空间,我最近删除了(在 36 小时内以块为单位)接近 30% 的数据。
根据表的大小和删除的行数,我预计表的大小将减少大约 55-60 GB。我通过抽取样本并计算平均行大小,然后将其乘以要删除的行数来验证这一点。但是,删除完成后,表大小并没有改变。
虽然我不希望缩小 .mdf 文件的大小,但我确实检查了数据库是否有任何可以缩小的可用空间,但可用空间为 0%。
所以 - 我很困惑。我已经验证我从表中删除的数据不再存在。我什至将它与备份进行了比较,以获得前后对比。数据库中的行数发生了变化,但表的数据空间并没有减少。
我的问题是:
1)为什么从表中删除数据没有减少表的大小?
2)我能做些什么来实际减少表格的大小?
编辑:
Run Code Online (Sandbox Code Playgroud)CREATE TABLE [dbo].[LARGE_LOG_TABLE]( [ID] [varchar](36) NOT NULL, [DOC_ID] [varchar](36) NOT NULL, [REQUEST_DATA] [varchar](max) NULL, [REQUEST_DATA_XSLT] [varchar](max) NULL, [RESPONSE_DATA] [varchar](max) NULL, [RESPONSE_DATA_XSLT] [varchar](max) NULL, …