Es un hecho conocido que los DMV no contienen información precisa sobre el número de páginas y el recuento de filas. Sin embargo, cuando tiene las estadísticas actualizadas, no puedo ver por qué no lo harían.
Estoy trabajando en una herramienta de monitoreo, quiero saber el tamaño del disco de cada índice y datos, etc. Eventualmente me gustaría encontrar el factor de llenado correcto, y otras cosas, etc.
El espacio utilizado por mi función y el antiguo sp_spaceused difiere un poco en el uso del espacio, pero no en el recuento de registros.
¿Puedes ver si falta algo en mi selección?
este es el sp_spaceused (luego convierto los números en 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
Pero cuando ejecuto mi selección, el código debajo de la imagen a continuación, obtengo cifras ligeramente 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'
las figuras
la imagen más grande, incluidos los nombres de índice
Ahora haciendo algunos cálculos para verificar los 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
¡No está tan lejos, realmente, aparte del hecho de que no calculé el espacio no utilizado!
¿Qué puedo hacer para que esto sea exacto?
DESPUÉS DE CAMBIOS:
Después de reemplazar 1024 por 1024.00, los resultados son mucho más precisos. Noté que se han insertado registros en la tabla en cuestión, y obviamente las estadísticas no están tan actualizadas, pero aún así los resultados coinciden (menos de 1 MB de diferencia, lo cual está bien para mí)
Los nuevos conjuntos de resultados son:
--==================================
-- 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
fuente