Ini adalah fakta yang diketahui bahwa DMV tidak memiliki informasi yang akurat mengenai jumlah halaman dan jumlah baris. Namun, ketika statistik Anda diperbarui, saya tidak bisa melihat mengapa mereka tidak memperbarui.
Saya sedang mengerjakan alat pemantauan, ingin mengetahui ukuran disk dari setiap indeks dan data, dll. Akhirnya saya ingin menemukan faktor pengisian yang tepat, dan hal-hal lain dll.
Ruang yang digunakan oleh fungsi saya dan sp_spaceused lama sedikit berbeda pada penggunaan ruang, tetapi tidak pada catatan jumlah.
Dapatkah Anda melihat apakah ada yang hilang dalam pilih saya?
ini adalah sp_spaceused (maka saya mengonversi angka dalam 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
Tetapi ketika saya menjalankan pilih saya, kode di bawah ini \ gambar di bawah, saya mendapatkan angka yang sedikit berbeda.
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'
angka-angka
gambaran yang lebih besar, termasuk nama-nama indeks
Sekarang lakukan beberapa perhitungan untuk memeriksa hasilnya:
--==================================
-- 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
Tidak begitu jauh, sungguh, terlepas dari kenyataan saya tidak menghitung ruang yang tidak digunakan!
Apa yang bisa saya lakukan untuk membuat ini akurat?
SETELAH PERUBAHAN:
Setelah saya ganti 1024 oleh 1024.00 hasilnya jauh lebih akurat. Saya perhatikan catatan telah dimasukkan ke dalam tabel yang dimaksud, dan jelas statistiknya tidak begitu mutakhir, tetapi hasilnya masih cocok (di bawah 1 MB perbedaan - yang baik untuk saya)
Set hasil baru adalah:
--==================================
-- 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
sumber