มันเป็นความจริงที่รู้จักกันว่า DMVs ไม่ได้เก็บข้อมูลที่ถูกต้องเกี่ยวกับจำนวนหน้าและจำนวนแถว อย่างไรก็ตามเมื่อคุณอัปเดตสถิติฉันไม่สามารถเห็นได้ว่าทำไมพวกเขาถึงไม่ทำ
ฉันกำลังทำงานกับเครื่องมือตรวจสอบ, ต้องการทราบขนาดดิสก์ของแต่ละดัชนีและข้อมูล ฯลฯ ในที่สุดฉันต้องการค้นหาปัจจัยเติมที่เหมาะสมและสิ่งอื่น ๆ เป็นต้น
พื้นที่ที่ใช้โดยฟังก์ชั่นของฉันและ sp_spaceused เก่าแตกต่างกันเล็กน้อยในการใช้พื้นที่ แต่ไม่ได้อยู่ในการบันทึก
คุณเห็นหรือไม่ว่ามีอะไรขาดหายไปในการเลือกของฉัน
นี่คือ sp_spaceused (จากนั้นฉันแปลงตัวเลขเป็น 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
แต่เมื่อฉันเลือกตัวเลือกโค้ดด้านล่าง \ ภาพด้านล่างฉันได้รับตัวเลขที่แตกต่างกันเล็กน้อย
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'
ตัวเลข
ภาพที่ใหญ่ขึ้นรวมถึงชื่อดัชนี
ตอนนี้ทำการคำนวณเพื่อตรวจสอบผลลัพธ์:
--==================================
-- 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
มันอยู่ไม่ไกลนักนอกจากความจริงแล้วฉันไม่ได้คำนวณพื้นที่ที่ไม่ได้ใช้!
ฉันจะทำอย่างไรเพื่อทำให้ถูกต้อง
หลังจากการเปลี่ยนแปลง:
หลังจากฉันแทนที่ 1024 ด้วย 1024.00 ผลลัพธ์จะแม่นยำมากขึ้น ฉันสังเกตเห็นว่ามีการแทรกระเบียนลงในตารางที่มีปัญหาและเห็นได้ชัดว่าสถิติไม่ทันสมัย แต่ก็ยังคงเป็นผลลัพธ์ที่ตรงกัน (ต่ำกว่า 1 MB ที่ต่างกัน - ซึ่งเหมาะสำหรับฉัน)
ชุดผลลัพธ์ใหม่คือ:
--==================================
-- 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