क्या सटीक फ़ाइल को निर्धारित करने का एक तरीका मौजूद है जिसमें कई फ़ाइलों की फ़ाइल समूह में एक आवंटन इकाई है?


13

मैं उम्मीद कर रहा था कि कौन सी डेटाबेस फ़ाइलों में डेटाबेस के रहने वाले विभिन्न HoBTs (दोनों संरेखित और गैर-गठबंधन) के लिए कौन सी आवंटन इकाइयाँ शामिल हैं।

जिस क्वेरी का मैंने हमेशा उपयोग किया है (नीचे देखें) ने मुझे अच्छी तरह से सेवा दी है, जब तक कि हम फाइलग्रुप प्रति एकाधिक डेटा फ़ाइलें बनाना शुरू नहीं करते हैं और मैं केवल यह पता लगाने में सक्षम हूं कि फाइलग्रुप स्तर के रूप में दानेदार कैसे प्राप्त करें।

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;

हालाँकि, यह क्वेरी तब काम नहीं करेगी जब एक फाइलग्रुप में कई फाइलें हों क्योंकि मैं केवल एक डेटा यूनिट के लिए एक आवंटन इकाई से संबंधित हो सकता हूं और आखिरकार, एक फाइलग्रुप। मैं जानना चाहता हूं कि क्या कोई अन्य डीएमवी या कैटलॉग है जो मुझे याद आ रही है कि मैं आगे की पहचान के लिए उपयोग कर सकता हूं कि फाइलग्रुप में कौन सी फाइल में एक आवंटन इकाई है।

इस सवाल के पीछे यह है कि मैं विभाजन संरचनाओं को संपीड़ित करने के वास्तविक प्रभावों का मूल्यांकन करने की कोशिश कर रहा हूं। मुझे पता है कि मैं इस जानकारी को प्राप्त करने के लिए FILEPROPERTY(FileName,'SpaceUsed')फ़ाइल के लिए उपयोग करने से पहले और बाद में और बाद में sys.allocation_units.used_pages/128.कर सकता हूं, लेकिन व्यायाम ने मुझे आश्चर्यचकित किया कि क्या मैं विशिष्ट फ़ाइल की पहचान कर सकता हूं जिसमें एक विशिष्ट आवंटन इकाई है।

मैं %%physloc%%इस उम्मीद में मदद कर सकता हूं कि मैं इसके साथ खिलवाड़ कर रहा हूं , लेकिन मुझे जो चाहिए वह मुझे नहीं मिला। नीचे दिए गए लिंक आरोन बर्ट्रेंड द्वारा दिए गए हैं :


जवाबों:


11

निम्नलिखित क्वेरी का प्रयास करें। यह पहले एक स्थानीय अस्थायी तालिका बनाता है और फिर इसमें पाया जाने sys.dm_db_database_page_allocationsवाला AllocationUnitID-to-FileID संघों के साथ पॉपुलेट करता है , जो SQL Server 2012 में पेश किया गया एक अनिर्दिष्ट डायनेमिक मैनेजमेंट फंक्शन (DMF) है (2012 से पहले के संस्करणों के लिए, आपको यह जानकारी मिल सकती है DBCC IND())। उस स्थानीय अस्थायी तालिका को मूल क्वेरी के संशोधित संस्करण में शामिल किया गया है।

उस डीएमएफ के डेटा को प्रदर्शन के लिए एक अस्थायी तालिका में रखा गया है, क्योंकि डेटाबेस के आकार के आधार पर, उस डेटा को प्राप्त करने में कुछ सेकंड से अधिक समय लग सकता है। DISTINCTकीवर्ड प्रयोग किया जाता है क्योंकि DMF प्रति डेटा पेज एक पंक्ति रिटर्न कि, और प्रति प्रत्येक आवंटन इकाई से अधिक डेटा पृष्ठों देखते हैं।

मैंने उस क्वेरी को मूल क्वेरी में छोड़ दिया, क्योंकि मूल क्वेरी आवंटन इकाइयाँ हैं जिनके पास 0 डेटा पृष्ठ हैं (आमतौर पर ROW_OVERFLOW_DATAऔर LOB_DATAप्रकार)। मैंने total_pagesफ़ील्ड को भी जोड़ा ताकि NULLडेटा फ़ाइलों के लिए उस डेटा बिंदु को उन पंक्तियों से संबंधित करना आसान हो जाए जो पंक्तियों में हैं । आप आवंटन इकाइयों है कि 0 पंक्तियों के बारे में परवाह नहीं है, तो यह परिवर्तन करने के लिए ठीक है कि हो सकता है LEFT JOINएक होने के लिए INNER 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, सूचकांक के कुल पृष्ठ हैं। जब परिणाम प्रति अनुक्रमणिका में कई पंक्तियों को वापस करते हैं, तो सूचकांक कई फ़ाइलों में फैला होता है, लेकिन यह नहीं दिखाता है कि प्रत्येक फ़ाइल पर सूचकांक कितना है। प्रत्येक पंक्ति प्रति सूचकांक पृष्ठों की कुल संख्या दिखाएगी, प्रति फ़ाइल नहीं। ( पहली बार जब मैंने इसे चलाया तो मुझे लगा कि, मेरी अनुक्रमणिका पूरी तरह से फाइलों में संतुलित है, मैं गलत था )
जेम्स जेनकिंस

1

21 मई 2013 को रेमस रुसानु ने इस प्रश्न का उत्तर दिया:

एक फ़ाइलग्रुप, कई डेटाफ़ाइल्स, प्रत्येक फ़ाइल में तालिकाओं की सूची कैसे प्राप्त करें

उनकी प्रतिक्रिया थी:

फ़ाइल समूह में कोई ऑब्जेक्ट फ़ाइल समूह में सभी डेटाफ़ाइल्स का उपयोग करेगा। FG1 में कोई भी तालिका Datafile1, Datafile2 और Datafile3 पर समान रूप से रहती है। यदि आपको प्लेसमेंट को नियंत्रित करने की आवश्यकता है, तो आपको अलग फाइलग्रुप बनाने की आवश्यकता है।


धन्यवाद। मैं वास्तव में नियंत्रित नहीं करना चाहता कि यह कहाँ जाता है, बल्कि यह देखें कि यह कहाँ चला गया है।
swasheck

3
FYI करें - यह सही है कि सभी फाइलें एक ही समय में बनाई गई थीं। यदि फ़ाइलें फ़ाइल समूह में जोड़ दी गईं या अन्य ट्रेस झंडे का उपयोग किया गया तो यह सभी फ़ाइलों में नहीं हो सकता है। यह नहीं कह रहा है कि वह गलत है, क्योंकि वह यह नहीं कह रहा है कि यह निर्भर करता है :)
सीन गैलार्डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.