Decipher Allwedd a Tudalen WaitResource mewn cloeon a chloeon
Os ydych chi'n defnyddio'r adroddiad proses wedi'i rwystro neu'n casglu'r graffiau cloi a ddarperir gan SQL Server o bryd i'w gilydd, byddwch yn dod ar draws pethau fel hyn:
Weithiau bydd mwy o wybodaeth yn yr XML anferth hwnnw rydych chi'n ei astudio (mae graffiau cloi yn cynnwys rhestr o adnoddau sy'n eich helpu i ddarganfod enwau'r gwrthrychau a'r mynegai), ond nid bob amser.
Bydd y testun hwn yn eich helpu i'w dehongli.
Mae'r holl wybodaeth sydd yma ar y Rhyngrwyd mewn gwahanol leoedd, mae wedi'i ddosbarthu'n fawr! Rwyf am roi popeth at ei gilydd - o TUDALEN DBCC i hobt_id ac i'r swyddogaethau %% physloc% a %%lockres% heb eu dogfennu.
Yn gyntaf, gadewch i ni siarad am amseroedd aros ar gloeon TUDALEN, ac yna byddwn yn symud ymlaen i gloeon ALLWEDDOL.
1.2) Chwilio am enw'r ffeil data - os oes gennych ddiddordeb
Rydyn ni'n mynd i ddefnyddio data_file_id yn y cam nesaf i ddod o hyd i enw'r tabl. Yn syml, gallwch neidio i'r cam nesaf, ond os oes gennych ddiddordeb yn enw'r ffeil, gallwch ddod o hyd iddo trwy redeg ymholiad yng nghyd-destun y gronfa ddata a ddarganfuwyd, gan amnewid data_file_id yn yr ymholiad hwn:
USE WideWorldImporters;
GO
SELECT
name,
physical_name
FROM sys.database_files
WHERE file_id = 3;
GO
Yng nghronfa ddata WideWorldImporters mae hon yn ffeil o'r enw WWI_UserData ac rwyf wedi ei hadfer i C:MSSQLDATAWideWorldImporters_UserData.ndf. (Wps, fe wnaethoch chi fy nal yn rhoi ffeiliau ar ddisg y system! Na! Roedd hynny'n lletchwith).
1.3) Cael enw'r gwrthrych o TUDALEN DBCC
Nawr rydym yn gwybod bod tudalen #70133 yn ffeil data 3 yn perthyn i gronfa ddata WorldWideImporters. Gallwn edrych ar gynnwys y dudalen hon gan ddefnyddio TUDALEN DBCC heb ei dogfennu ac olrhain baner 3604.
Nodyn: Mae'n well gen i ddefnyddio TUDALEN DBCC ar gopi wedi'i adfer o gopi wrth gefn yn rhywle ar weinydd arall, oherwydd ei fod yn beth heb ei ddogfennu. Mewn rhai achosion, hi gall arwain at greu dymp (tua. cyfieithydd - nid yw'r ddolen, yn anffodus, yn arwain i unman, ond a barnu yn ôl yr url, rydym yn sôn am fynegeion wedi'u hidlo).
/* 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
Wrth sgrolio trwy'r canlyniadau, gallwch ddod o hyd i object_id a index_id.
Bron â gwneud! Nawr gallwch chi ddod o hyd i'r tabl a'r enwau mynegai gan ddefnyddio'r ymholiad:
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
Ac yn awr gwelwn fod yr aros clo ar fynegai PK_Sales_OrderLines y tabl Sales.OrderLines.
Nodyn: Yn SQL Server 2014 ac yn ddiweddarach, gellir dod o hyd i enw'r gwrthrych hefyd gan ddefnyddio'r DMO heb ei ddogfennu sys.dm_db_database_page_allocations. Ond mae'n rhaid i chi gwestiynu pob tudalen yn y gronfa ddata, sydd ddim yn edrych yn cŵl iawn ar gyfer cronfeydd data mawr, felly defnyddiais TUDALEN DBCC.
1.4) A yw'n bosibl gweld y data ar y dudalen a gafodd ei rhwystro?
Wel, ie. Ond... ydych chi'n siŵr eich bod chi wir ei angen?
Mae'n araf hyd yn oed ar fyrddau bach. Ond mae'n cŵl, felly gan eich bod chi wedi darllen hyd yma... gadewch i ni siarad am %% physloc%%!
Nawr ein bod yn gwybod ein bod am gloi'r dudalen yn Sales.OrderLines, gallwn edrych ar yr holl ddata yn y tabl hwn, sy'n cael ei storio yn ffeil data #3 ar dudalen #70133, gan ddefnyddio'r ymholiad hwn:
Use WideWorldImporters;
GO
SELECT
sys.fn_PhysLocFormatter (%%physloc%%),
*
FROM Sales.OrderLines (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'
GO
Fel y dywedais, mae'n araf hyd yn oed ar fyrddau bach. Ychwanegais NOLOCK at y cais oherwydd nid oes gennym unrhyw sicrwydd o hyd bod y data yr ydym am edrych arno yn union yr un fath ag yr oedd pan ganfuwyd y clo - felly gallwn wneud darlleniadau budr yn ddiogel.
Ond, ar frys, mae'r ymholiad yn dychwelyd yr un 25 rhes i mi ag yr ymladdodd ein hymholiad drostynt
Digon am gloeon PAGE. Beth os ydym yn aros am glo ALLWEDDOL?
2) waitresource=“ALLWEDDOL: 6:72057594041991168 (ce52f92a058c)” = Database_Id, HOBT_Id (stwnsh hud y gellir ei ddadgryptio gan ddefnyddio %%lockres% os ydych wir eisiau hynny)
Os yw'ch ymholiad yn ceisio cloi cofnod yn y mynegai a'i fod yn cael ei gloi ei hun, yn y pen draw bydd gennych fath hollol wahanol o gyfeiriad.
Gan dorri “6: 72057594041991168 (ce52f92a058c)” yn rhannau, rydyn ni'n cael:
cronfa ddata_id = 6
hobt_id = 72057594041991168
hash hud = (ce52f92a058c)
2.1) Dadgryptio database_id
Mae hyn yn gweithio yn union yr un fath â'r enghraifft uchod! Dewch o hyd i enw'r gronfa ddata gan ddefnyddio'r ymholiad:
SELECT
name
FROM sys.databases
WHERE database_id=6;
GO
Yng nghyd-destun y gronfa ddata a ddarganfuwyd, mae angen i chi weithredu ymholiad i sys.partitions gyda phâr o uno a fydd yn helpu i bennu enwau'r tabl a'r mynegai...
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
Mae'n dweud wrthyf fod y cais yn aros ar y clo Application.Countries gan ddefnyddio'r mynegai PK_Application_Countries.
2.3) Nawr ychydig o hud %%lockres%% - os ydych am ddarganfod pa gofnod a gafodd ei gloi
Os ydw i wir eisiau gwybod ar ba res roedd y clo, gallaf ddarganfod trwy gwestiynu'r bwrdd ei hun. Gallwn ddefnyddio'r ffwythiant %%lockres%% heb ei ddogfennu i ddod o hyd i gofnod sy'n cyfateb i'r stwnsh hud.
Sylwch y bydd yr ymholiad hwn yn sganio'r tabl cyfan, ac ar fyrddau mawr efallai na fydd hyn yn hwyl o gwbl:
SELECT
*
FROM Application.Countries (NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO
ychwanegais NOLOCK (ar gyngor Klaus Aschenbrenner ar Twitter) oherwydd gall rhwystrau ddod yn broblem. Rydyn ni eisiau edrych ar yr hyn sydd yno nawr, ac nid beth oedd yno pan ddechreuodd y trafodiad - nid wyf yn meddwl bod cysondeb data yn bwysig i ni.
Voila, y record wnaethon ni ymladd amdani!
Diolchiadau a darllen pellach
Nid wyf yn cofio pwy ddisgrifiodd lawer o'r pethau hyn gyntaf, ond dyma ddau bost am y pethau sydd wedi'u dogfennu leiaf yr hoffech chi efallai: