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:

waitresource="TUDALEN: 6:3:70133"

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

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) waitresource="TUDALEN: 6:3:70133" = Cronfa Ddata_Id: FileId: TudalenRhif

Os yw'ch ymholiad yn aros ar glo TUDALEN, bydd SQL Server yn rhoi cyfeiriad y dudalen honno i chi.

Gan dorri i lawr “TUDALEN: 6:3:70133” cawn:

  • cronfa ddata_id = 6
  • data_file_id = 3
  • tudalen_numer = 70133

1.1) Dadgryptio database_id

Dewch i ni ddod o hyd i enw'r gronfa ddata gan ddefnyddio'r ymholiad:

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

Mae hyn yn gyhoeddus DB Mewnforwyr Byd Eang ar fy Ngweinydd SQL.

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.
Decipher Allwedd a Tudalen WaitResource mewn cloeon a chloeon
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%%!

Mae %%physloc%% yn ddarn o hud heb ei ddogfennu sy'n dychwelyd dynodwr ffisegol ar gyfer pob cofnod. gallwch ddefnyddio %%physloc%% ynghyd â sys.fn_PhysLocFormatter yn SQL Server 2008 ac uwch.

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
Decipher Allwedd a Tudalen WaitResource mewn cloeon a chloeon
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

Yn fy achos i mae'n dal yr un fath DB Mewnforwyr Byd Eang.

2.2) Dadgryptio hobt_id

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!
Decipher Allwedd a Tudalen WaitResource mewn cloeon a chloeon

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:

Ffynhonnell: hab.com

Ychwanegu sylw