Decipher Key ۽ Page WaitResource کي ختم ڪرڻ ۽ تالا ۾

جيڪڏهن توهان بلاڪ ٿيل عمل جي رپورٽ استعمال ڪندا آهيو يا وقتي طور تي SQL سرور پاران مهيا ڪيل ڊيڊ لاڪ گراف گڏ ڪندا آهيو، توهان کي اهڙيون شيون ملندا:

waitresource="صفحو: 6:3:70133"

waitresource=“KEY: 6:72057594041991168 (ce52f92a058c)“

ڪڏهن ڪڏهن، انهي وشال XML ۾ وڌيڪ معلومات هوندي جيڪا توهان پڙهو ٿا (ڊيڊ لاڪ گراف ۾ وسيلن جي هڪ فهرست شامل آهي جيڪا توهان کي اعتراض ۽ انڊيڪس جا نالا ڳولڻ ۾ مدد ڪري ٿي)، پر هميشه نه.

هي متن توهان کي انهن کي سمجهڻ ۾ مدد ڏيندو.

سڀ معلومات جيڪا هتي آهي انٽرنيٽ تي مختلف هنڌن تي آهي، اها بلڪل ورهايل آهي! مان اهو سڀ گڏ ڪرڻ چاهيان ٿو، DBCC PAGE کان hobt_id تائين غير دستاويزي %%physloc%% ۽ %%lockres%% افعال.

پهرين، اچو ته پيج لاڪ تي انتظار جي باري ۾ ڳالهايون، ۽ پوءِ KEY لاڪ ڏانهن وڃو.

1) waitresource="PAGE: 6:3:70133" = Database_Id: FileId: PageNumber

جيڪڏهن توهان جي درخواست هڪ پيج لاڪ تي انتظار ڪري رهي آهي، SQL سرور توهان کي ان صفحي جو پتو ڏيندو.

ٽوڙڻ "PAGE: 6: 3: 70133" اسان حاصل ڪريون ٿا:

  • database_id = 6
  • data_file_id = 3
  • صفحو_نمبر = 70133

1.1) ڊيڪرپٽ ڊيٽابيس_id

سوال استعمال ڪندي ڊيٽابيس جو نالو ڳولھيو:

SELECT 
    name 
FROM sys.databases 
WHERE database_id=6;
GO

اهو عوامي آهي ڊي بي وائڊ ورلڊ درآمد ڪندڙ منهنجي SQL سرور تي.

1.2) ڊيٽا فائل جو نالو ڳولي رهيا آهيو - جيڪڏهن توهان دلچسپي رکو ٿا

اسان ٽيبل جو نالو ڳولڻ لاء ايندڙ قدم ۾ data_file_id استعمال ڪرڻ وارا آهيون. توھان صرف ايندڙ قدم ڏانھن وڃو، پر جيڪڏھن توھان فائل جي نالي ۾ دلچسپي رکو ٿا، توھان ان کي ڳولي سگھوٿا ھڪڙي سوال کي ھلائيندي مليل ڊيٽابيس جي حوالي سان، ھن سوال ۾ data_file_id کي متبادل بڻايو:

USE WideWorldImporters;
GO
SELECT 
    name, 
    physical_name
FROM sys.database_files
WHERE file_id = 3;
GO

WideWorldImporters ڊيٽابيس ۾ هي هڪ فائل آهي جنهن کي WWI_UserData سڏيو ويندو آهي ۽ مون ان کي C:MSSQLDATAWideWorldImporters_UserData.ndf تي بحال ڪيو آهي. (اڙي، توهان مون کي سسٽم ڊرائيو تي فائلون وجهي پڪڙيو! نه! اهو شرمناڪ آهي).

1.3) ڊي بي سي سي پيج تان اعتراض جو نالو حاصل ڪريو

اسان هاڻي ڄاڻون ٿا ته صفحو #70133 datafile 3 ۾ WorldWideImporters ڊيٽابيس سان تعلق رکي ٿو. اسان هن صفحي جي مواد کي غير دستاويزي DBCC پيج استعمال ڪندي ڏسي سگھون ٿا ۽ پرچم 3604 کي نشانو بڻايو.
نوٽ: مان DBCC PAGE استعمال ڪرڻ کي ترجيح ڏيان ٿو بحال ٿيل ڪاپي تي ڪنهن ٻئي سرور تي، ڇاڪاڻ ته اهو غير دستاويزي مواد آهي. ڪجهه حالتن ۾، هوء ڊمپ جي نتيجي ۾ ٿي سگھي ٿو (لڳ ڀڳ مترجم - لنڪ، بدقسمتي سان، ڪٿي به نه ٿو، پر يو آر ايل جي ذريعي، اسان فلٽر ٿيل انڊيڪس بابت ڳالهائي رهيا آهيون).

/* This trace flag makes DBCC PAGE output go to our Messages tab
instead of the SQL Server Error Log file */
DBCC TRACEON (3604);
GO
/* DBCC PAGE (DatabaseName, FileNumber, PageNumber, DumpStyle)*/
DBCC PAGE ('WideWorldImporters',3,70133,2);
GO

نتيجن ڏانهن ڇڪڻ سان، توهان ڳولي سگهو ٿا object_id ۽ index_id.
Decipher Key ۽ Page WaitResource کي ختم ڪرڻ ۽ تالا ۾
تقريبن مڪمل! ھاڻي توھان ڳولي سگھوٿا ٽيبل ۽ انڊيڪس جا نالا سوال سان:

USE WideWorldImporters;
GO
SELECT 
    sc.name as schema_name, 
    so.name as object_name, 
    si.name as index_name
FROM sys.objects as so 
JOIN sys.indexes as si on 
    so.object_id=si.object_id
JOIN sys.schemas AS sc on 
    so.schema_id=sc.schema_id
WHERE 
    so.object_id = 94623380
    and si.index_id = 1;
GO

۽ هتي اسان ڏسون ٿا ته تالا تي انتظار Sales.OrderLines ٽيبل جي PK_Sales_OrderLines انڊيڪس تي هو.

نوٽ: SQL سرور 2014 ۽ مٿي ۾، اعتراض جو نالو پڻ ڳولهي سگھجي ٿو غير دستاويزي DMO sys.dm_db_database_page_allocations استعمال ڪندي. پر توهان کي ڊيٽابيس ۾ هر صفحي تي سوال ڪرڻو پوندو، جيڪو وڏي ڊيٽابيس لاءِ تمام سٺو نٿو لڳي، تنهنڪري مون استعمال ڪيو DBCC پيج.

1.4) ڇا اهو ممڪن آهي ته صفحي تي ڊيٽا کي ڏسڻ لاء جيڪو بلاڪ ڪيو ويو آهي؟

نوو، ها. پر... ڇا توهان کي پڪ آهي ته توهان کي واقعي ان جي ضرورت آهي؟
اهو سست آهي جيتوڻيڪ ننڍڙي ٽيبل تي. پر اهو هڪ قسم جو ٿڌو آهي، تنهنڪري توهان هيستائين پڙهيو آهي... اچو ته %%physloc%% بابت ڳالهايون!

%%physloc%% جادوءَ جو هڪ غير دستاويزي ٽڪرو آهي جيڪو هر داخلا لاءِ هڪ فزيڪل ID موٽائي ٿو. توهان استعمال ڪري سگهو ٿا %%physloc%% سان گڏ sys.fn_PhysLocFormatter SQL سرور 2008 ۽ بعد ۾.

هاڻي ته اسان ڄاڻون ٿا ته اسان Sales.OrderLines ۾ صفحي کي بلاڪ ڪرڻ چاهيون ٿا، اسان هن جدول ۾ سڀني ڊيٽا کي ڏسي سگهون ٿا، جيڪو ڊيٽا فائل #3 ۾ صفحي #70133 تي ذخيرو ٿيل آهي، هيٺ ڏنل سوال سان:

Use WideWorldImporters;
GO
SELECT 
    sys.fn_PhysLocFormatter (%%physloc%%),
    *
FROM Sales.OrderLines (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'
GO

جيئن مون چيو، اهو سست آهي جيتوڻيڪ ننڍڙي ٽيبل تي. مون درخواست ۾ NOLOCK شامل ڪيو ڇاڪاڻ ته اسان وٽ اڃا تائين ڪا به ضمانت نه آهي ته جيڪو ڊيٽا اسان ڏسڻ چاهيون ٿا اهو بلڪل ساڳيو آهي جيئن اهو ان وقت هو جڏهن تالا دريافت ڪيو ويو هو - تنهنڪري اسان محفوظ طور تي گندا پڙهي سگهون ٿا.
پر، هوري، سوال مون کي اهي ئي 25 قطارون موٽائي ٿو، جن لاءِ اسان جي سوال وڙهندي هئي.
Decipher Key ۽ Page WaitResource کي ختم ڪرڻ ۽ تالا ۾
PAGE لاڪ جي باري ۾ ڪافي. ڇا جيڪڏهن اسان هڪ KEY تالا جو انتظار ڪري رهيا آهيون؟

2) waitresource="KEY: 6:72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (جادو هيش جنهن کي %%lockres%% سان ڊيڪرپٽ ڪري سگهجي ٿو جيڪڏهن توهان واقعي چاهيو ٿا)

جيڪڏهن توهان جو سوال انڊيڪس انٽري تي بند ڪرڻ جي ڪوشش ڪري ٿو ۽ پنهنجو پاڻ کي بند ڪيو وڃي ٿو، توهان کي مڪمل طور تي مختلف قسم جو پتو ملندو.
ٽوڙڻ "6:72057594041991168 (ce52f92a058c)" حصن ۾، اسان حاصل ڪريون ٿا:

  • database_id = 6
  • hobt_id = 72057594041991168
  • جادو هيش = (ce52f92a058c)

2.1) ڊيڪرپٽ ڊيٽابيس_id

اهو بلڪل ساڳيو ڪم ڪري ٿو جيئن مٿي ڏنل مثال سان! اسان سوال استعمال ڪندي ڊيٽابيس جو نالو ڳوليندا آهيون:

SELECT 
    name 
FROM sys.databases 
WHERE database_id=6;
GO

منهنجي حالت ۾، اهو ساڳيو آهي ڊي بي وائڊ ورلڊ درآمد ڪندڙ.

2.2) ڊڪرپٽ hobt_id

مليل ڊيٽابيس جي حوالي سان، توهان کي سوال ڪرڻو پوندو sys.partitions سان گڏ ڪجهه جوائن جيڪي ٽيبل ۽ انڊيڪس جا نالا طئي ڪرڻ ۾ مدد ڪندا۔۔۔

USE WideWorldImporters;
GO
SELECT 
    sc.name as schema_name, 
    so.name as object_name, 
    si.name as index_name
FROM sys.partitions AS p
JOIN sys.objects as so on 
    p.object_id=so.object_id
JOIN sys.indexes as si on 
    p.index_id=si.index_id and 
    p.object_id=si.object_id
JOIN sys.schemas AS sc on 
    so.schema_id=sc.schema_id
WHERE hobt_id = 72057594041991168;
GO

اهو مون کي ٻڌائي ٿو ته درخواست جي انتظار ۾ هئي Application.Countries lock استعمال ڪندي PK_Application_Countries index.

2.3) ھاڻي ڪجھ لاءِ %% lockres%% جادو - جيڪڏھن توھان ڳولڻ چاھيو ٿا ته ڪھڙي داخلا بند ڪئي وئي آھي

جيڪڏھن مان واقعي ڄاڻڻ چاھيان ٿو ته ڪھڙي قطار تي تالا جي ضرورت ھئي، مان پاڻ ئي ٽيبل تي سوال ڪندي معلوم ڪري سگھان ٿو. اسان غير دستاويزي %% lockres%% فنڪشن استعمال ڪري سگھون ٿا ھڪڙي داخلا ڳولڻ لاءِ جيڪا جادو جي ھش سان ملي ٿي.
نوٽ ڪريو ته هي سوال پوري ٽيبل کي اسڪين ڪندو، ۽ وڏي ٽيبل تي اهو شايد مزو نه هوندو:

SELECT
    *
FROM Application.Countries (NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO

مون شامل ڪيو NOLOCK (ٽوئيٽر تي Klaus Aschenbrenner جي صلاح تي) ڇاڪاڻ ته تالا هڪ مسئلو ٿي سگهي ٿو. اسان صرف اهو ڏسڻ چاهيون ٿا ته هاڻي ڇا آهي، ۽ نه ته اتي ڇا هو جڏهن ٽرانزيڪشن شروع ٿي - مان نه ٿو سمجهان ته ڊيٽا جي تسلسل اسان لاءِ اهم آهي.
Voila، رڪارڊ جنهن لاء اسان وڙهندا آهيون!
Decipher Key ۽ Page WaitResource کي ختم ڪرڻ ۽ تالا ۾

اعتراف ۽ وڌيڪ پڙهڻ

مون کي ياد ناهي ته انهن مان ڪيترين ئي شين کي پهريون ڀيرو ڪنهن بيان ڪيو، پر هتي ٻه پوسٽون آهن گهٽ ۾ گهٽ دستاويزي شين بابت جيڪي توهان کي پسند ڪن ٿا:

جو ذريعو: www.habr.com

تبصرو شامل ڪريو