Как проверить пространство, используемое в таблице, ВКЛЮЧАЯ записи-призраки - PullRequest
0 голосов
/ 07 сентября 2018

Я нашел этот скрипт где-то еще в StackOverflow, который сообщает мне статистику относительно того, сколько места используется данной таблицей:

SELECT 
 t.NAME AS TableName,
 i.name AS indexName,
 SUM(p.rows) AS RowCounts,
 SUM(a.total_pages) AS TotalPages, 
 SUM(a.used_pages) AS UsedPages, 
 SUM(a.data_pages) AS DataPages,
 (SUM(a.total_pages) * 8) / 1024 AS TotalSpaceMB, 
 (SUM(a.used_pages) * 8) / 1024 AS UsedSpaceMB, 
 (SUM(a.data_pages) * 8) / 1024 AS DataSpaceMB
FROM 
 sys.tables t
INNER JOIN  
 sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN 
 sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id
INNER JOIN 
 sys.allocation_units a ON p.partition_id = a.container_id
WHERE 
 t.NAME = 'StmALog' AND
 i.OBJECT_ID > 255 AND  
 i.index_id <= 1
GROUP BY 
 t.NAME, i.object_id, i.index_id, i.name 
ORDER BY 
 OBJECT_NAME(i.object_id)

Это, кажется, работает хорошо и дает хорошие результаты, однакоЯ не уверен, что эта статистика также учитывает записи о призраках.

Может ли кто-нибудь проверить для меня, что этот скрипт подсчитывает пространство, используемое таблицей , включая , независимо от того, какие записи о призраках могутбыть рядом?

1 Ответ

0 голосов
/ 07 сентября 2018

Это не упоминается в документации, но есть отчеты людей, интересующихся, почему sys.allocation_units возвращает данные для таблиц, когда выполняется огромное удаление / усечение, означающее, что системное представление возвращает ghost records а также.

В любом случае, я не верю, что вам следует сильно волноваться за записи о призраках, если включена очистка от призраков (она включена по умолчанию). Также не рекомендуется отключать it:

Отключение процесса очистки призрака обычно не рекомендуется. Это должно быть тщательно проверено в контролируемой среде до постоянной реализации в производственной среде.

Вы можете проверить количество записей о привидениях для конкретной таблицы, используя следующий запрос:

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

Итак, имея вышеупомянутый запрос, мы можем попытаться проверить, возвращает ли ваш запрос также и записи о привидениях.

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

При включении флага убираются показания-призраки:

DBCC TRACEON(661);

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

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

enter image description here

Если вы хотите выполнить тестирование, не отключайте флаг в производственной базе данных, и вам может потребоваться увеличить количество вставленных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...