มีวิธีการกำหนดไฟล์ที่แน่นอนที่มีหน่วยการจัดสรรในกลุ่มไฟล์ของหลายไฟล์หรือไม่?


13

ฉันหวังว่าจะได้รับมุมมองที่ละเอียดว่าไฟล์ฐานข้อมูลใดมีหน่วยการจัดสรรใดสำหรับ HoBT ต่างๆ (ทั้งที่อยู่ในแนวเดียวกันและไม่ได้อยู่ในแนวเดียวกัน) ในฐานข้อมูล

แบบสอบถามที่ฉันใช้อยู่เสมอ (ดูด้านล่าง) ให้บริการฉันได้ดีจนกระทั่งเราเริ่มสร้างไฟล์ข้อมูลหลายไฟล์ต่อกลุ่มไฟล์และฉันสามารถที่จะหาวิธีที่จะได้รับรายละเอียดเป็นระดับกลุ่มไฟล์

select 
    SchemaName = sh.name, 
    TableName = t.name, 
    IndexName = i.name, 
    PartitionNumber = p.partition_number,
    IndexID = i.index_id,
    IndexDataspaceID = i.data_space_id,
    AllocUnitDataspaceID = au.data_space_id,
    PartitionRows = p.rows
from sys.allocation_units au
join sys.partitions p
    on au.container_id = p.partition_id
join sys.indexes i 
    on i.object_id = p.object_id
    and i.index_id = p.index_id
join sys.tables t 
    on p.object_id = t.object_id
join sys.schemas sh
    on t.schema_id = sh.schema_id
where sh.name != 'sys'
    and au.type = 2
union all 
select 
    sh.name, 
    t.name, 
    i.name, 
    p.partition_number,
    i.index_id,
    i.data_space_id,
    au.data_space_id,
    p.rows
from sys.allocation_units au
join sys.partitions p
    on au.container_id = p.hobt_id
join sys.indexes i 
    on i.object_id = p.object_id
    and i.index_id = p.index_id
join sys.tables t 
    on p.object_id = t.object_id
join sys.schemas sh
    on t.schema_id = sh.schema_id
where sh.name != 'sys'
    and au.type in (1,3)
order by t.name, i.index_id,p.partition_number;

อย่างไรก็ตามแบบสอบถามนี้จะไม่ทำงานเมื่อมีไฟล์หลายไฟล์ในกลุ่มไฟล์เนื่องจากฉันสามารถเข้าถึงหน่วยการจัดสรรที่เกี่ยวข้องกับพื้นที่ข้อมูลและท้ายที่สุดคือกลุ่มไฟล์ ฉันต้องการทราบว่ามี DMV หรือแค็ตตาล็อกอื่นที่ฉันขาดหายไปซึ่งฉันสามารถใช้เพื่อระบุเพิ่มเติมว่าไฟล์ใดในกลุ่มไฟล์มีหน่วยการจัดสรร

คำถามที่อยู่เบื้องหลังคำถามนี้คือฉันพยายามประเมินผลที่แท้จริงของการบีบอัดโครงสร้างที่แบ่งพาร์ติชัน ฉันรู้ว่าฉันสามารถทำก่อนและหลังการใช้FILEPROPERTY(FileName,'SpaceUsed')สำหรับไฟล์และก่อนและหลังsys.allocation_units.used_pages/128.เพื่อรับข้อมูลนี้ แต่การออกกำลังกายทำให้ฉันสงสัยว่าฉันสามารถระบุไฟล์เฉพาะที่มีหน่วยการจัดสรรเฉพาะ

ฉันยุ่งกับ%%physloc%%มันด้วยความหวังว่ามันจะช่วยได้ แต่ก็ไม่ได้สิ่งที่ฉันต้องการ ลิงค์ด้านล่างนี้จัดทำโดยAaron Bertrand :


คำตอบ:


11

ลองใช้แบบสอบถามต่อไปนี้ มันสร้างตารางชั่วคราวในเครื่องก่อนแล้วจึงเติมข้อมูลด้วยการเชื่อมโยง AllocationUnitID-to-FileID ที่พบในsys.dm_db_database_page_allocationsฟังก์ชัน Dynamic Management Function (DMF) ที่ไม่มีเอกสารที่แนะนำใน SQL Server 2012 (สำหรับรุ่นก่อนปี 2012 คุณสามารถรับข้อมูลนี้ได้DBCC IND()) ตารางอุณหภูมิภายในเครื่องนั้นจะถูกรวมเข้ากับแบบสอบถามต้นฉบับที่แก้ไขแล้ว

ข้อมูลจาก DMF นั้นถูกวางลงในตารางชั่วคราวสำหรับประสิทธิภาพเนื่องจากขึ้นอยู่กับขนาดของฐานข้อมูลอาจใช้เวลานานกว่าสองสามวินาทีในการรับข้อมูลนั้น DISTINCTคำหลักที่ถูกนำมาใช้เพราะเห็นว่า DMF ผลตอบแทนต่อหนึ่งแถวหน้าข้อมูลและมีหน้าข้อมูลหลายต่อแต่ละหน่วยการจัดสรร

ฉันได้รวมข้อมูลนั้นไว้ในแบบสอบถามต้นฉบับเนื่องจากแบบสอบถามต้นฉบับส่งคืนหน่วยการจัดสรรที่มีหน้าข้อมูล 0 (โดยทั่วไปROW_OVERFLOW_DATAและLOB_DATAประเภท) ฉันยังเพิ่มtotal_pagesเขตข้อมูลเพื่อให้การเชื่อมโยงข้อมูลนั้นชี้ไปยังแถวที่มีNULLs สำหรับแฟ้มข้อมูลได้ง่ายขึ้น หากคุณไม่สนใจเกี่ยวกับการจัดสรรหน่วยที่มี 0 แถวแล้วมันจะดีกับการเปลี่ยนแปลงที่จะเป็นLEFT JOININNER JOIN

IF (OBJECT_ID(N'tempdb..#AllocationsToFiles') IS NULL)
BEGIN
    -- DROP TABLE #AllocationsToFiles;
    CREATE TABLE #AllocationsToFiles
    (
      ObjectID INT NOT NULL,
      IndexID INT NOT NULL,
      PartitionID INT NOT NULL,
      RowsetID BIGINT NOT NULL,
      AllocationUnitID BIGINT NOT NULL,
      AllocatedPageFileID SMALLINT NOT NULL
    );
END;

IF (NOT EXISTS(SELECT * FROM #AllocationsToFiles))
BEGIN
  --TRUNCATE TABLE #AllocationsToFiles;
  INSERT INTO #AllocationsToFiles (ObjectID, IndexID, PartitionID, RowsetID,
                                   AllocationUnitID, AllocatedPageFileID)
    SELECT DISTINCT alloc.[object_id], alloc.[index_id], alloc.[partition_id],
           alloc.[rowset_id], alloc.[allocation_unit_id], alloc.[allocated_page_file_id]
    FROM   sys.dm_db_database_page_allocations(DB_ID(), NULL, NULL, NULL,
                                               'LIMITED') alloc
    WHERE  alloc.is_allocated = 1
    AND    alloc.is_iam_page = 0;
END;

SELECT
    SchemaName = sh.name, 
    TableName = t.name, 
    IndexName = i.name, 
    PartitionNumber = p.partition_number,
    IndexID = i.index_id,
    IndexDataspaceID = i.data_space_id,
    AllocUnitDataspaceID = au.data_space_id,
    PartitionRows = p.[rows],
    TotalPages = au.total_pages,
    AllocationUnitType = au.type_desc,
    LogicalFileName = dbf.[name],
    PhysicalFileName = dbf.[physical_name]
    --,p.[object_id], p.[partition_id], au.allocation_unit_id
FROM sys.allocation_units au
INNER JOIN sys.partitions p
        ON au.container_id = IIF(au.[type] = 2, p.[partition_id], p.[hobt_id])
INNER JOIN sys.indexes i 
        ON i.[object_id] = p.[object_id]
       AND i.index_id = p.index_id
INNER JOIN sys.tables t 
        ON p.[object_id] = t.[object_id]
INNER JOIN sys.schemas sh
        ON t.[schema_id] = sh.[schema_id]
LEFT JOIN (#AllocationsToFiles alloc
       INNER JOIN sys.database_files dbf
               ON dbf.[file_id] = alloc.AllocatedPageFileID
          ) 
        ON alloc.ObjectID = p.[object_id]
       AND alloc.IndexID = p.index_id
       AND alloc.PartitionID = p.partition_number
       AND alloc.AllocationUnitID = au.allocation_unit_id
WHERE sh.name <> N'sys'
ORDER BY t.name, i.index_id, p.partition_number;

นี่เป็นเครื่องมือที่ยอดเยี่ยมขอบคุณ ฉันต้องการชี้ให้เห็นว่าคอลัมน์ TotalPages เป็นหน้ารวมสำหรับดัชนี เมื่อผลลัพธ์ส่งกลับหลายแถวต่อดัชนีดัชนีจะกระจายไปทั่วหลายไฟล์ แต่ไม่ได้แสดงจำนวนดัชนีในแต่ละไฟล์ แต่ละแถวจะแสดงจำนวนหน้าทั้งหมดต่อดัชนีไม่ใช่ต่อไฟล์ ( สองสามครั้งแรกที่ฉันวิ่งฉันคิดว่าดัชนีของฉันเย็นลงอย่างสมดุลในทุก ๆ ไฟล์ฉันผิด )
James Jenkins

1

Remus Rusanu เมื่อวันที่ 21 พฤษภาคม 2013 ให้คำตอบสำหรับคำถามนี้:

กลุ่มไฟล์หนึ่งกลุ่มหลายดาต้าวิธีรับรายการตารางในแต่ละไฟล์

คำตอบของเขาคือ:

วัตถุในกลุ่มไฟล์จะใช้ดาต้าไทล์ทั้งหมดในกลุ่มไฟล์ ตารางใด ๆ ใน FG1 นั้นอยู่บน Datafile1, Datafile2 และ Datafile3 อย่างเท่าเทียมกัน หากคุณต้องการควบคุมตำแหน่งคุณต้องสร้างกลุ่มไฟล์ที่แตกต่าง


ขอบคุณ ฉันไม่ต้องการควบคุมว่ามันจะไปทางไหน แต่ควรดูว่ามันหายไปไหน
swasheck

3
FYI - สิ่งนี้ถูกต้องโดยสมมติว่าไฟล์ทั้งหมดถูกสร้างขึ้นในเวลาเดียวกัน หากมีการเพิ่มไฟล์ในกลุ่มไฟล์หรือใช้ค่าสถานะการติดตามอื่น ๆ ไฟล์นั้นอาจไม่ได้อยู่ในไฟล์ทั้งหมด ไม่ได้บอกว่าเขาผิดเพราะเขาไม่ได้บอกว่ามันขึ้นอยู่ :)
ฌอน Gallardy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.