Một thực tế đã biết là DMV không lưu giữ thông tin chính xác về số lượng trang và số lượng hàng. Tuy nhiên, khi bạn có các số liệu thống kê được cập nhật, tôi không thể hiểu tại sao chúng lại không.
Tôi đang làm việc trên một công cụ giám sát, muốn biết kích thước đĩa của từng chỉ mục và dữ liệu, v.v ... Cuối cùng, tôi muốn tìm đúng hệ số lấp đầy, và những thứ khác, v.v.
Không gian được sử dụng bởi chức năng của tôi và sp_spaceuse cũ khác nhau một chút về việc sử dụng không gian, nhưng không phải là về số lượng bản ghi.
Bạn có thể thấy nếu có bất cứ điều gì thiếu trong lựa chọn của tôi?
đây là sp_spaceuse (sau đó tôi chuyển đổi các số theo 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
Nhưng khi tôi chạy phần chọn của mình, mã bên dưới \ hình bên dưới, tôi nhận được các số liệu hơi khác nhau.
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'
số liệu
bức tranh lớn hơn, bao gồm các tên chỉ mục
Bây giờ thực hiện một số tính toán để kiểm tra kết quả:
--==================================
-- 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
Nó không quá xa, thực tế, ngoài thực tế tôi đã không tính toán không gian không sử dụng!
Tôi có thể làm gì để làm điều này chính xác?
SAU THAY ĐỔI:
Sau khi tôi thay thế 1024 bằng 1024.00, kết quả chính xác hơn nhiều. Tôi nhận thấy các bản ghi đã được chèn vào bảng trong câu hỏi và rõ ràng các số liệu thống kê không cập nhật, nhưng vẫn là kết quả khớp (chênh lệch dưới 1 MB - hoàn toàn phù hợp với tôi)
Các bộ kết quả mới là:
--==================================
-- 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