একাধিক ফাইলের একটি ফাইলগ্রুপে বরাদ্দ ইউনিট থাকা সঠিক ফাইলটি নির্ধারণের জন্য কি কোনও উপায় আছে?


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, এসকিউএল সার্ভার ২০১২-এ প্রবর্তিত একটি অননুমোদিত ডায়নামিক ম্যানেজমেন্ট ফাংশন (ডিএমএফ) (২০১২ সালের সংস্করণের জন্য, আপনি এই তথ্যটি পেতে পারেন 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;

এটি একটি দুর্দান্ত সরঞ্জাম, আপনাকে ধন্যবাদ। আমি এটি উল্লেখ করতে চাই না যে কলামটি টোটাল পেজগুলি সূচকটির জন্য মোট পৃষ্ঠাগুলি। ফলাফলগুলি যখন প্রতি সূচকে একাধিক সারি ফেরত দেয়, সূচিটি একাধিক ফাইল জুড়ে ছড়িয়ে যায় তবে প্রতিটি ফাইলে সূচকের পরিমাণ কত তা দেখায় না। প্রতিটি সারি প্রতি ফাইলের পরিবর্তে সূচক অনুসারে মোট পৃষ্ঠাগুলির সংখ্যা প্রদর্শন করবে। ( প্রথমবার যখন আমি এটি চালিয়েছিলাম আমি ভেবেছিলাম, শীতল আমার সূচকগুলি ফাইলগুলির মধ্যে পুরোপুরি ভারসাম্যপূর্ণ, আমি ভুল ছিলাম )
জেমস জেনকিনস

1

রেমাস রুসানু, 21 মে, 2013-এ এই প্রশ্নের উত্তর সরবরাহ করেছে:

একটি ফাইলগ্রুপ, একাধিক ডাটা ফাইল, প্রতিটি ফাইলের টেবিলের তালিকা কীভাবে পাবেন

তার প্রতিক্রিয়া ছিল:

একটি ফাইলগ্রুপের একটি অবজেক্ট ফাইলগ্রুপের সমস্ত ডেটা ফাইল ব্যবহার করবে। এফজি 1 এর যে কোনও সারণী ডেটাফিল 1, ডেটাফিল 2 এবং ডেটাফিল 3 এ সমানভাবে অবস্থান করে। আপনার যদি প্লেসমেন্টটি নিয়ন্ত্রণ করতে হয় তবে আপনাকে পৃথক ফাইলগ্রুপ তৈরি করতে হবে।


ধন্যবাদ। আমি এটি কোথায় যায় তা নিয়ন্ত্রণ করতে চাই না, বরং এটি কোথায় গেছে তা দেখুন।
সোয়াশেক

3
এফওয়াইআই - এটি ধরে নিচ্ছি যে একই সাথে সমস্ত ফাইল তৈরি করা হয়েছিল। ফাইলগ্রুপে ফাইলগুলি যুক্ত করা হলে বা অন্যান্য ট্রেস পতাকা ব্যবহার করা হত এটি সমস্ত ফাইলের মধ্যে নাও থাকতে পারে। তিনি ভুল বলে না, কারণ তিনি তা করেন না, এটি নির্ভর করে বলে যে :)
সান গ্যালার্ডি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.