DMV'lerin sayfa sayısı ve satır sayısı hakkında doğru bilgi sahibi olmadığı bilinen bir gerçektir. Ancak, istatistikleri güncellediğinizde, neden yapmadıklarını göremiyorum.
Ben bir izleme aracı üzerinde çalışıyorum, her dizin ve veri, vb disk boyutunu bilmek istiyorum. Sonunda doğru dolgu faktörü ve diğer şeyler vb bulmak istiyorum.
İşlevim ve eski sp_spaceused tarafından kullanılan alan, alan kullanımına göre biraz farklılık gösterir, ancak kayıt sayısına göre farklılık göstermez.
Seçimimde eksik bir şey olup olmadığını görebiliyor musunuz?
Bu sp_spaceused (daha sonra MB olarak sayıları dönüştürmek):
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
Ama seçimimi çalıştırdığımda, aşağıdaki kodun altındaki resim, biraz farklı rakamlar alıyorum.
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'
Figürler
dizin adları dahil daha büyük resim
Şimdi sonuçları kontrol etmek için bazı hesaplamalar yapıyoruz:
--==================================
-- 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
O kadar uzakta değil, aslında, kullanılmayan alanı hesaplamadığım gerçeği dışında!
Bunu doğru yapmak için ne yapabilirim?
DEĞİŞİKLİKLERDEN SONRA:
1024'ü 1024.00 ile değiştirdikten sonra sonuçlar çok daha doğru. Kayıtların söz konusu tabloya eklendiğini fark ettim ve açıkçası istatistikler çok güncel değil, ancak yine de sonuçlar eşleşiyor (1 MB'ın altında fark var - bu benim için uygun)
Yeni sonuç kümeleri:
--==================================
-- 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