নির্দিষ্ট টেবিলের জন্য ROW_OVERFLOW_DATA পৃষ্ঠাগুলি তালিকাবদ্ধ করুন


11

আমি একটি টেবিলের জন্য পৃষ্ঠাগুলির একটি তালিকা পাওয়ার চেষ্টা করছি যা ROW_OVERFLOW_DATA এর সাথে সারি রয়েছে। আমি অনিবন্ধিত ডিএমভি থেকে বরাদ্দকৃত পৃষ্ঠাগুলির তালিকা পেতে পারি sys.db_db_database_page_allocations, তবে, DM ডিএমভির আউটপুটে তালিকাভুক্ত কোনও ROW_OVERFLOW_DATA পৃষ্ঠা নেই বলে মনে হয়। এমন কি অন্য কোনও ডিএমভি আছে যা আমি কেবল সনাক্ত করতে পারি না?

সর্বনিম্ন, সম্পূর্ণ এবং (আশাবাদী!) যাচাইযোগ্য উদাহরণ:

USE tempdb;

IF OBJECT_ID(N'dbo.t', N'U') IS NOT NULL
DROP TABLE dbo.t;
GO

CREATE TABLE dbo.t
(
    rownum int NOT NULL IDENTITY(1,1)
        PRIMARY KEY CLUSTERED
    , on_row_data varchar(30) NOT NULL
        DEFAULT ('on_row_data')
    , off_row_data varchar(MAX) NOT NULL
        DEFAULT REPLICATE('A', 20000) --PLENTY BIG ENOUGH!
) WITH (DATA_COMPRESSION = NONE); --not compressing those pages!

INSERT INTO dbo.t DEFAULT VALUES;

DECLARE @ObjectID int = (SELECT o.object_id FROM sys.objects o WHERE o.name = 't');
DECLARE @PageID int;
DECLARE @PageTypeDesc varchar(100);

SELECT FileID = dpa.allocated_page_file_id
    , PageID = dpa.allocated_page_page_id
    , PageTypeDesc = dpa.page_type_desc
FROM sys.dm_db_database_page_allocations(DB_ID(), @ObjectID, NULL, NULL, 'DETAILED') dpa

আউটপুট দেখে মনে হচ্ছে:

╔════════╦════════╦══════════════╗
║ ফাইলআইডি ║ পেজআইডি ║ পেজটাইপডেস্ক ║
╠════════╬════════╬══════════════╣
║ 1 ║ 1598 ║ আইএএমপেজ ║ ║
║ 3 ║ 105368 ║ ডেটা_পৃষ্ঠা ║ ║
║ 3 ║ 105369 ║ নুল ║
║ 3 ║ 105370 ║ নুল ║
║ 3 ║ 105371 ║ নুল ║
║ 3 ║ 105372 ║ নুল ║
║ 3 ║ 105373 ║ নুল ║
║ 3 ║ 105374 ║ নুল ║
║ 3 ║ 105375 ║ নুল ║
╚════════╩════════╩══════════════╝

অনুপস্থিত ROW_OVERFLOW_DATA পৃষ্ঠা ব্যতীত অন্যটি কী তা বোঝায়। আমাদের কাছে একটি একক সূচক বরাদ্দ মানচিত্র পৃষ্ঠা এবং 8KB ডেটা পৃষ্ঠাগুলির একটি সম্পূর্ণ এক্সটেন্টস রয়েছে, যা কেবলমাত্র বরাদ্দকৃত পৃষ্ঠাগুলির মধ্যে একটি মাত্র with

একইভাবে, আমি যদি sys.fn_PhysLocCrackerপ্রতিটি সারি বিদ্যমান সেখানে পৃষ্ঠাটি দেখানোর জন্য যদি অনোধিত ফাংশনটি ব্যবহার করি :

SELECT *
FROM dbo.t
CROSS APPLY sys.fn_PhysLocCracker(%%PHYSLOC%%)

আমি কেবল DATA_PAGEতালিকাবদ্ধ দেখতে পাচ্ছি :

╔════════╦═════════════╦═════════════════════╦════ ═════╦═════════╦═════════╗
║ রোউনাম ║ অন_রো_ডাটা ║ অফ_রো_ডাটা ║ ফাইল_আইডি ║ পেজ_আইডি ║ স্লট_আইডি ║
╠════════╬═════════════╬═════════════════════╬════ ═════╬═════════╬═════════╣
Row 1 ║ অন_রো_ডাটা ║ এএএএএএএএএএএএএএএএএএএএএ ║ 3 ║ 105368 ║ 0 ║
╚════════╩═════════════╩═════════════════════╩════ ═════╩═════════╩═════════╝

তেমনি, আমি যদি ব্যবহার DBCC IND(database, table, index)করি তবে আমি কেবল দুটি তালিকাভুক্ত পৃষ্ঠাটি দেখতে পাচ্ছি:

DBCC IND (tempdb, t, 1);

আউটপুট:

╔═════════╦═════════╦════════╦════════╦═══════════ ═╦═════════╦═════════════════╦════════════════════ ═╦════════════════╦══════════╦════════════╦═══════ ══════╦═════════════╦═════════════╦═════════════╦═ ═╗
F পেজফিড ║ পেজপিআইডি ║ আইএএমএফআইডি ║ আইএএমপিআইডি ║ অবজেক্টআইডি ║ সূচক ║ পার্টিশন নাম্বার ║ পার্টিশনআইডি ║ আইম_চেইন_ টাইপ ║ পেজ টাইপ ║ সূচিপত্র ║ নেক্সটপেজএফআইডি ║ নেক্সটপেজপিআইডি ║ প্রাকপেজফিড F প্রিপেজপিড
╠═════════╬═════════╬════════╬════════╬═══════════ ═╬═════════╬═════════════════╬════════════════════ ═╬════════════════╬══════════╬════════════╬═══════ ══════╬═════════════╬═════════════╬═════════════╬═ ═╣
║       1 ║    1598 ║ NULL   ║ NULL   ║ 2069582411 ║       1 ║               1 ║ 6989586877272752128 ║ In-row data    ║       10 ║ NULL       ║           0 ║           0 ║           0 ║           0 ║  ║
║       3 ║  105368 ║ 1      ║ 1598   ║ 2069582411 ║       1 ║               1 ║ 6989586877272752128 ║ In-row data    ║        1 ║ 0          ║           0 ║           0 ║           0 ║           0 ║  ║
╚═════════╩═════════╩════════╩════════╩════════════╩═════════╩═════════════════╩═════════════════════╩════════════════╩══════════╩════════════╩═════════════╩═════════════╩═════════════╩═════════════╩══╝

যদি আমি ব্যবহার করে আসল পৃষ্ঠাগুলি DBCC PAGEদেখে থাকি তবে মনে হয় যে কোনও পৃষ্ঠাতে ROW_OVERFLOW_DATA রয়েছে সে সম্পর্কে এখনও আমি কিছুই দেখতে পাচ্ছি না - আমি নিশ্চিত যে এটি অবশ্যই সেখানে থাকবে, আমি সম্ভবত ঠিক কী জানি তা জানি না:

DBCC PAGE (tempdb, 3, 105368 , 3) WITH TABLERESULTS;

ফলাফলগুলি এখানে ফিট করার জন্য খুব বড়, যদি আমি মেমরি ডাম্প সারিগুলি অন্তর্ভুক্ত করি তবে এটি শিরোনামের আউটপুট:

╔══════════════╦════════════════════════════════╦═ ══════════════════════════════╦═══════════════════ ════════════╗
║ প্যারেন্ট অবজেক্ট ║ অবজেক্ট ║ ফিল্ড ║ মান AL
╠══════════════╬════════════════════════════════╬═ ══════════════════════════════╬═══════════════════ ════════════╣
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ পৃষ্ঠা পৃষ্ঠা ║ 0x000002431A8A2000 ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ ভ্যাশ ║ 0x0000000000000000 ║
║ বুফার: ║ BUF @ 0x000002437E86D5C0 ║ বপেজেনো 3 (3: 105368) ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ বিডিবিড ║ 2 ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ প্রবন্ধ ║ 0 ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ বিসিপুটিক্স ║ 0 ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ বিস্যাম্পলকাউন্ট ║ 0 ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ বুস 1 ║ 63172 ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ bstat ║ 0x10b ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ ব্লগ ║ 0x212121cc ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ বনেস্ট ║ 0x0000000000000000 ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ বিডার্টি কনটেক্সট ║ 0x000002435DA77160 ║
U বুফার: ║ BUF @ 0x000002437E86D5C0 ║ bstat2 ║ 0x0 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ এম_পেজ আইডি ║ (3: 105368) ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ এম_হেডার সংস্করণ ║ 1 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ এম_প্রকার ║ 1 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_typeFlagBits ║ 0x0 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ এম_লেভেল ║ 0 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_flagBits ║ 0xc000 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_objId (AllocUnitId.idObj) ║ 3920762 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_indexId (AllocUnitId.idInd) ║ 512 ║
║ পৃষ্ঠার শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ মেটাডেটা: বরাদ্দ করুন it 144115445026914304 ║
║ পৃষ্ঠার শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ মেটাডেটা: পার্টিশনআইডি ║ 6989586877272752128 ║
║ পৃষ্ঠার শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ মেটাডেটা: সূচকগুলি ║ 1 ║
║ পৃষ্ঠার শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ মেটাডেটা: অবজেক্টআইডি ║ 2069582411 ║
║ পৃষ্ঠার শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ এম_প্রিভ পৃষ্ঠা ║ (0: 0) ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_nextPage ║ (0: 0) ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ পিনমিলেন ║ 8 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_slotCnt ║ 1 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_freeCnt ║ 66 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ এম_ফ্রিডেটা ║ 8124 ║
║ পৃষ্ঠার শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_remittedCnt ║ 0 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ এম_এলএসএন 36 (36: 47578: 1) ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ এম_এক্স্যাক্ট সংরক্ষিত ║ 0 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_xdesId ║ (0: 0) ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_ghostRecCnt ║ 0 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ m_tornBits ║ 0 ║
║ পৃষ্ঠা শিরোনাম: @ পৃষ্ঠা @ 0x000002431A8A2000 ║ ডিবি ফ্রেগ আইডি ║ 1 ║
║ পৃষ্ঠার শিরোনাম: oc বরাদ্দের স্থিতি ║ গ্যাম (৩: ২) LOC অনুমোদিত ║
║ পৃষ্ঠার শিরোনাম: oc বরাদ্দের স্থিতি ║ এসজিএএম (3: 3) AL লকড নেই ║
║ পৃষ্ঠার শিরোনাম: oc বরাদ্দের স্থিতি ║ পিএফএস (3: 105144) x 0x40 বরাদ্দ 0_PCT_FULL ║
║ পৃষ্ঠা শিরোনাম: oc বরাদ্দের স্থিতি ║ ডিআইএফএফ (3: 6) CH পরিবর্তন হয়নি ║
║ পৃষ্ঠার শিরোনাম: oc বরাদ্দের স্থিতি ║ এমএল (3: 7) M এমএলএলজিড নয় ║
║ পৃষ্ঠা শিরোনাম: ║ স্লট 0 অফসেট 0x60 দৈর্ঘ্য 8028 ║ রেকর্ডের ধরণ ║ PRIMARY_RECORD ║
║ পৃষ্ঠার শিরোনাম: ║ স্লট 0 অফসেট 0x60 দৈর্ঘ্য 8028 ║ রেকর্ড বৈশিষ্ট্য ║ নাল_বিটম্যাপ ভারিবেল_কুলুমনেস ║
║ পৃষ্ঠার শিরোনাম: ║ স্লট 0 অফসেট 0x60 দৈর্ঘ্য 8028 ║ রেকর্ড আকার ║ 8028 28
╚══════════════╩════════════════════════════════╩═ ══════════════════════════════╩═══════════════════ ════════════╝

উত্তর:


10

আপনার ডেমোটি প্রত্যাহারের সীমাবদ্ধতায় আঘাত হানছে :

যদি স্ট্রিং_এক্সপ্রেসানটি ভার্চার (সর্বাধিক) বা এনভারচার (সর্বাধিক) প্রকারের না হয়, তবে প্রতিলিপি 8,000 বাইটে রিটার্নের মান কেটে দেয়। ৮,০০০ বাইটের বেশি মানগুলি ফিরিয়ে দিতে, স্ট্রিং_প্রকাশটি স্পষ্টভাবে যথাযথ বড়-মান ডেটা টাইপ করতে হবে।

আমি যদি এটি করি:

INSERT INTO dbo.t (off_row_data) VALUES (REPLICATE(CAST('A' as varchar(max)), 20000));

এবং তারপরে উপর থেকে আপনার ডিএমভি ক্যোয়ারীটি dm_db_datedia_page_allocations এর বিপরীতে চালান, আমি এর পেজ টাইপডেস্কের সাথে পৃষ্ঠাগুলি পাই TEXT_MIX_PAGE

তারপরে সেই অফ-সারি পৃষ্ঠার বিশদটি দেখার জন্য আমি ট্রেস ফ্ল্যাগটি 3604 সক্ষম করে ডিবিসিসি পৃষ্ঠা চালনা করতে পারি:

DBCC TRACEON (3604);
GO
DBCC PAGE (TestDB, 1, 20696 , 3) -- your page will be different :)

আউটপুট বড়, তবে শুরুতে আপনি দেখতে পাবেন:

Blob row at: Page (1:20696) Slot 0 Length: 3934 Type: 3 (DATA)

এবং তারপরে, আপনি জানেন, এ এর ​​একগুচ্ছ।


4
যদি কাটা কাটার সতর্কতা বা কিছু ছিল তবে এটি খুব সুন্দর হবে না।
ম্যাক্স ভার্নন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.