如何检查表中使用的空间,包括虚假记录

时间:2018-09-07 01:27:57

标签: sql sql-server tsql

我在StackOverflow上的其他地方找到了该脚本,该脚本告诉我有关给定表正在使用多少空间的统计信息:

SaveFileDialog

这似乎很好,并且给了我很好的结果,但是我不确定这些统计信息是否也考虑到了幽灵记录。

有人可以帮我验证一下此脚本是否在计算表包括可能挂在上面的鬼记录的空间?

1 个答案:

答案 0 :(得分:0)

文档中没有提到,但是reports的人想知道为什么sys.allocation_units返回表的数据,而执行大量删除/截断意味着系统视图返回了{{1 }}。

无论如何,如果启用了幽灵清理(默认情况下启用),我认为您不应该为幽灵记录担心太多。另外,不建议disable

  

通常不建议禁用幻影清理过程。   这样做应在受控环境中进行彻底测试   在生产环境中永久实施之前。

您可以使用以下查询检查特定表的幻像记录计数:

ghost records

因此,通过上述查询,我​​们可以尝试测试您的查询是否还返回了幽灵记录。

SELECT [ghost_record_count]
      ,[version_ghost_record_count]
FROM [sys].[dm_db_index_physical_stats] (DB_ID(N'dabase_name'), OBJECT_ID(N'schema_name.table_name'), NULL, NULL , 'DETAILED');
GO

因此,在禁用了幽灵清理器之后,我们可以看到表没有行,但是有幽灵数据/行:

enter image description here

重新启用标志,清除了幻影读取:

CREATE TABLE [dbo].[StackOverflow]
(
    [ID]  BIGINT IDENTITY(100000, 1) PRIMARY KEY
   ,[text] NVARCHAR(MAX)
   ,[date] DATETIME2 CONSTRAINT DF_StackOverflow_date DEFAULT (SYSDATETIME())
);


INSERT INTO [dbo].[StackOverflow] ([text])
SELECT TOP 100000
           REPLICATE(CAST(NEWID() AS NVARCHAR(MAX)), 255)
FROM master..spt_values t1 
CROSS JOIN master..spt_values t2;

EXEC sp_spaceused '[dbo].[StackOverflow]';

-- your script for detecting size

GO

DBCC TRACEOFF(661); -- disable ghost cleaner; DO NOT RUN ON PRODUCTION DATABASE


DELETE FROM [dbo].[StackOverflow];

SELECT [ghost_record_count]
      ,[version_ghost_record_count]
FROM [sys].[dm_db_index_physical_stats] (DB_ID(N'StackOverflow'), OBJECT_ID(N'dbo.StackOverflow'), NULL, NULL , 'DETAILED');

EXEC sp_spaceused '[dbo].[StackOverflow]'

-- your script for detecting size

-- DROP TABLE IF EXISTS [dbo].[StackOverflow];
-- GO

enter image description here

如果要测试,请不要在生产数据库上禁用该标志,而可能需要增加插入的行。