کیلي او د پاڼې انتظار سرچینې په بند او بندونو کې ډیسیفر کړئ

که تاسو د بند شوي پروسې راپور وکاروئ یا په وخت سره د SQL سرور لخوا چمتو شوي ډیډ لاک ګرافونه راټول کړئ ، نو تاسو به د دې په څیر شیانو سره مخ شئ:

waitresource="PAGE: 6:3:70133"

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

ځینې ​​​​وختونه، په دې لوی XML کې به نور معلومات وي چې تاسو یې مطالعه کوئ (د ډیډ لاک ګرافونه د سرچینو لیست لري چې تاسو سره د شیانو نومونو او شاخصونو موندلو کې مرسته کوي)، مګر تل نه.

دا متن به تاسو سره د دوی په پوهولو کې مرسته وکړي.

ټول هغه معلومات چې دلته په انټرنیټ کې په مختلفو ځایونو کې دي، دا په ساده ډول ویشل شوي! زه غواړم دا ټول یوځای کړم، د DBCC PAGE څخه hobt_id ته غیر مستند شوي %%physloc%% او %%lockres%% افعال.

لومړی، راځئ چې د PAGE لاکونو د انتظار په اړه وغږیږو، او بیا د کلیدي قفلونو ته لاړ شو.

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

که ستاسو غوښتنه د PAGE لاک ته انتظار وي، SQL سرور به تاسو ته د دې پاڼې پته درکړي.

د "PAGE: 6:3:70133" ماتول موږ ترلاسه کوو:

  • ډیټابیس_id = 6
  • data_file_id = 3
  • د پاڼې شمیره = 70133

1.1) ډیټابیس_id ډیکریټ کړئ

د پوښتنې په کارولو سره د ډیټابیس نوم ومومئ:

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

دا عامه ده DB پراخه نړۍ واردونکي زما په 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) د DBCC پاڼې څخه د اعتراض نوم ترلاسه کړئ

موږ اوس پوهیږو چې د ډیټا فایل 70133 کې #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

پایلو ته د سکرول کولو سره، تاسو کولی شئ د اعتراض_id او index_id ومومئ.
کیلي او د پاڼې انتظار سرچینې په بند او بندونو کې ډیسیفر کړئ
تقریبا بشپړ شوی! اوس تاسو کولی شئ د یوې پوښتنې سره د میز او شاخص نومونه ومومئ:

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%% د جادو یوه بې سنده ټوټه ده چې د هرې ننوتلو لپاره فزیکي ID بیرته راګرځوي. تاسو کولی شئ وکاروئ %%physloc%% په SQL Server 2008 او وروسته کې د sys.fn_PhysLocFormatter سره.

اوس چې موږ پوهیږو چې موږ غوښتل په 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 قطارونه راګرځوي چې زموږ پوښتنې یې جګړه کړې وه
کیلي او د پاڼې انتظار سرچینې په بند او بندونو کې ډیسیفر کړئ
د PAGE لاکونو په اړه بس. څه که موږ د کیلي قفل ته انتظار یو؟

2) waitresource="KEY: 6:72057594041991168 (ce52f92a058c)" = ډیټابیس_Id, HOBT_Id (جادو هش چې د %%lockres%% سره ډیکریټ کیدی شي که تاسو واقعیا غواړئ)

که ستاسو پوښتنه د شاخص ننوتلو باندې د لاک کولو هڅه کوي او پخپله لاک کیږي ، تاسو په بشپړ ډول مختلف ډول پته ترلاسه کوئ.
په برخو کې د "6:72057594041991168 (ce52f92a058c)" ماتول، موږ ترلاسه کوو:

  • ډیټابیس_id = 6
  • hobt_id = 72057594041991168
  • جادو هش = (ce52f92a058c)

2.1) ډیټابیس_id ډیکریټ کړئ

دا د پورته مثال په څیر ورته کار کوي! موږ د پوښتنې په کارولو سره د ډیټابیس نوم پیدا کوو:

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

زما په قضیه کې، دا ورته دی DB پراخه نړۍ واردونکي.

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

دا ماته وايي چې غوښتنه د PK_Application_Countries index په کارولو سره په Application.Countries لاک کې انتظار وه.

2.3) اوس د ځینې ٪٪ لاکریز٪٪ جادو لپاره - که تاسو غواړئ ومومئ چې کوم داخله بنده شوې وه

که زه واقعیا غواړم پوه شم چې په کوم قطار کې تالاشۍ ته اړتیا وه ، زه کولی شم پخپله د میز د پوښتنې له لارې ومومئ. موږ کولی شو د غیر مستند شوي %% lockres%% فنکشن وکاروو ترڅو د ننوتلو موندلو لپاره چې د جادو هش سره سمون لري.
په یاد ولرئ چې دا پوښتنه به ټول میز سکین کړي، او په لوی میزونو کې دا ممکن په زړه پورې نه وي:

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

ما NOLOCK اضافه کړه (په ټویټر کې د کلاوس اسچینبرینر په مشوره) ځکه چې قلفونه یوه ستونزه وي. موږ یوازې غواړو وګورو چې اوس څه شتون لري ، او نه هغه څه چې هلته شتون درلود کله چې معامله پیل شوه - زه فکر نه کوم چې د معلوماتو دوام زموږ لپاره مهم دی.
Voila، هغه ریکارډ چې موږ یې لپاره مبارزه وکړه!
کیلي او د پاڼې انتظار سرچینې په بند او بندونو کې ډیسیفر کړئ

اعترافونه او نور لوستل

زه په یاد نه یم چې چا لومړی دا ډیری شیان بیان کړل، مګر دلته د لږو مستندو شیانو په اړه دوه پوسټونه دي چې تاسو یې خوښوي:

سرچینه: www.habr.com

Add a comment