É um fato conhecido que as DMVs não mantêm informações precisas sobre o número de páginas e a contagem de linhas. No entanto, quando você atualiza as estatísticas, não consigo entender por que não.
Estou trabalhando em uma ferramenta de monitoramento, quero saber o tamanho do disco de cada índice e dados, etc. Eventualmente, gostaria de encontrar o fator de preenchimento correto e outras coisas, etc.
O espaço usado pela minha função e o antigo sp_spaceused difere um pouco no uso do espaço, mas não na contagem de registros.
Você pode ver se falta alguma coisa no meu select?
este é o sp_spaceused (então eu converto os números em MB):
sp_spaceused 'tblBOrderRelationship'
go
select 318008/1024.00 AS reserved,
140208/1024.00 AS data,
177048/1024.00 AS index_size,
752/1024.00 AS unused
Mas quando executo meu código de seleção abaixo, \ figura abaixo, recebo números ligeiramente diferentes.
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
schema_name(t.schema_id) as SchemaName,
t.NAME AS TableName,
t.type_desc,
t.is_ms_shipped,
t.is_published,
t.lob_data_space_id,
t.filestream_data_space_id,
t.is_replicated,
t.has_replication_filter,
t.is_merge_published,
t.is_sync_tran_subscribed,
--t.is_filetable,
i.name as indexName,
i.type_desc,
i.is_unique,
i.is_primary_key,
i.is_unique_constraint,
i.fill_factor,
i.is_padded,
sum(p.rows) OVER (PARTITION BY t.OBJECT_ID,i.index_id) as RowCounts,
sum(a.total_pages) OVER (PARTITION BY t.OBJECT_ID,i.index_id) as TotalPages,
sum(a.used_pages) OVER (PARTITION BY t.OBJECT_ID,i.index_id) as UsedPages,
sum(a.data_pages) OVER (PARTITION BY t.OBJECT_ID,i.index_id) as DataPages,
(sum(a.total_pages) OVER (PARTITION BY t.OBJECT_ID,i.index_id) * 8) / 1024 as TotalSpaceMB,
(sum(a.used_pages) OVER (PARTITION BY t.OBJECT_ID,i.index_id) * 8) / 1024 as UsedSpaceMB,
(sum(a.data_pages) OVER (PARTITION BY t.OBJECT_ID,i.index_id) * 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 NOT LIKE 'dt%' AND
i.OBJECT_ID > 255
AND T.NAME = 'tblBOrderRelationship'
as figuras
a imagem maior, incluindo os nomes do índice
Agora, faça alguns cálculos para verificar os resultados:
--==================================
-- the figures from sp_spaceused
--==================================
select 318008/1024.00 AS reserved,
140208/1024.00 AS data,
177048/1024.00 AS index_size,
752/1024.00 AS unused
--==================================
-- the figures from my select
--==================================
select 137+61+56+54 AS reserved,
137 AS data,
61+56+54 AS index_size
Na verdade, não está tão longe, além do fato de eu não ter calculado o espaço não utilizado!
O que posso fazer para tornar isso preciso?
APÓS ALTERAÇÕES:
Depois de substituir 1024 por 1024,00, os resultados são muito mais precisos. Percebi que os registros foram inseridos na tabela em questão e, obviamente, as estatísticas não estão tão atualizadas, mas ainda assim os resultados correspondem (menos de 1 MB de diferença - o que é bom para mim)
Os novos conjuntos de resultados são:
--==================================
-- the figures from sp_spaceused
--==================================
select
318072 /1024.00 AS reserved,
140208 /1024.00 AS data,
177096 /1024.00 AS index_size,
768 /1024.00 AS unused
go
--==================================
-- the figures from my select
--==================================
select 137.7578125+61.7968750+56.4218750+54.6406250 as reserved,
137.7578125 as data,
61.7968750+56.4218750+54.6406250 as index_size