Es ist eine bekannte Tatsache, dass die DMVs keine genauen Informationen über die Anzahl der Seiten und die Anzahl der Zeilen enthalten. Wenn Sie jedoch die Statistiken aktualisiert haben, kann ich nicht sehen, warum sie dies nicht tun würden.
Ich arbeite an einem Überwachungstool, möchte die Festplattengröße der einzelnen Indizes und Daten usw. wissen. Schließlich möchte ich den richtigen Füllfaktor usw. finden.
Der von meiner Funktion und dem alten sp_spaceused verwendete Speicherplatz unterscheidet sich ein wenig von der Speicherplatznutzung, jedoch nicht von der Anzahl der Datensätze.
Können Sie sehen, ob in meiner Auswahl etwas fehlt?
Dies ist der sp_spaceused (dann konvertiere ich die Zahlen in 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
Aber wenn ich meinen select, code below \ picture below ausführe, erhalte ich etwas andere Zahlen.
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'
die Figuren
das größere Bild, einschließlich der Indexnamen
Führen Sie nun einige Berechnungen durch, um die Ergebnisse zu überprüfen:
--==================================
-- 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
Es ist nicht so weit weg, abgesehen von der Tatsache, dass ich den nicht genutzten Raum nicht berechnet habe!
Was kann ich tun, um dies genau zu machen?
NACH ÄNDERUNGEN:
Nachdem ich 1024 durch 1024.00 ersetzt habe, sind die Ergebnisse viel genauer. Ich habe festgestellt, dass Datensätze in die betreffende Tabelle eingefügt wurden, und die Statistiken sind offensichtlich nicht so aktuell, aber die Ergebnisse stimmen dennoch überein (unter 1 MB Unterschied - das ist in Ordnung für mich).
Die neuen Ergebnismengen sind:
--==================================
-- 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