C'est un fait connu que les DMV ne contiennent pas d'informations précises concernant le nombre de pages et le nombre de lignes. Cependant, lorsque vous avez mis à jour les statistiques, je ne vois pas pourquoi elles ne le seraient pas.
Je travaille sur un outil de surveillance, je veux connaître la taille du disque de chaque index et données, etc. Finalement, je voudrais trouver le bon facteur de remplissage, etc.
L'espace utilisé par ma fonction et l'ancien sp_spaceused diffère un peu sur l'utilisation de l'espace, mais pas sur le nombre d'enregistrements.
Pouvez-vous voir s'il manque quelque chose dans ma sélection?
c'est le sp_spaceused (alors je convertis les nombres en Mo):
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
Mais lorsque j'exécute ma sélection, code ci-dessous \ image ci-dessous, j'obtiens des chiffres légèrement différents.
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'
les figures
l'image plus grande, y compris les noms d'index
Maintenant, faisons quelques calculs pour vérifier les résultats:
--==================================
-- 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
Ce n'est pas si loin, vraiment, à part le fait que je n'ai pas calculé l'espace inutilisé!
Que puis-je faire pour rendre cela précis?
APRÈS CHANGEMENTS:
Après avoir remplacé 1024 par 1024,00, les résultats sont beaucoup plus précis. J'ai remarqué que des enregistrements ont été insérés dans le tableau en question, et évidemment les statistiques ne sont pas si à jour, mais les résultats correspondent toujours (différence de moins de 1 Mo - ce qui me convient)
Les nouveaux jeux de résultats sont les suivants:
--==================================
-- 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
la source