Pafwa pral gen plis enfòmasyon nan XML jeyan sa a w ap etidye (graf enpas yo genyen yon lis resous ki ede w jwenn non objè yo ak non endèks), men se pa toujou.
Tèks sa a pral ede w dekode yo.
Tout enfòmasyon ki isit la se sou entènèt la nan divès kote, li jis trè distribye! Mwen vle mete tout bagay ansanm - soti nan DBCC PAGE rive nan hobt_id ak nan fonksyon yo san papye %%physloc%% ak %%lockres%%.
Premyèman, ann pale sou datant sou kadna PAGE, epi answit nou pral ale nan kadna KLE.
Nou pral sèvi ak data_file_id nan pwochen etap la pou jwenn non tab la. Ou ka senpleman sote nan pwochen etap la, men si w enterese nan non fichye a, ou ka jwenn li nan kouri yon rechèch nan kontèks baz done a jwenn, ranplase data_file_id nan rechèch sa a:
USE WideWorldImporters;
GO
SELECT
name,
physical_name
FROM sys.database_files
WHERE file_id = 3;
GO
Nan baz done WideWorldImporters sa a se yon fichye ki rele WWI_UserData epi mwen retabli li nan C:MSSQLDATAWideWorldImporters_UserData.ndf. (Oops, ou kenbe m 'mete fichye sou disk la sistèm! Non! Sa te gòch).
1.3) Jwenn non objè a nan DBCC PAGE
Kounye a nou konnen paj #70133 nan fichye done 3 a fè pati baz done WorldWideImporters. Nou ka gade sa ki nan paj sa a lè l sèvi avèk DBCC PAGE san papye ak trase drapo 3604.
Remak: Mwen prefere sèvi ak DBCC PAGE sou yon kopi restore soti nan yon backup yon kote sou yon lòt sèvè, paske li se yon bagay san papye. Nan kèk ka, li ka lakòz yon pil fatra ke yo te kreye (approx. tradiktè - lyen an, malerezman, pa mennen okenn kote, men jije pa url la, nou ap pale de endèks filtre).
/* 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
Defile nan rezilta yo, ou ka jwenn object_id ak index_id.
Preske fini! Koulye a, ou ka jwenn tab la ak non endèks lè l sèvi avèk rechèch la:
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
Epi kounye a nou wè ke datant fèmen an te sou endèks PK_Sales_OrderLines nan tab Sales.OrderLines.
Remak: Nan SQL Server 2014 ak pita, ou ka jwenn non objè a tou lè l sèvi avèk DMO san dokiman sys.dm_db_database_page_allocations. Men, ou gen rechèch chak paj nan baz done a, ki pa sanble trè fre pou baz done gwo, kidonk mwen te itilize DBCC PAGE.
1.4) Èske li posib pou wè done yo sou paj ki te bloke a?
Oke, wi. Men... èske ou sèten ke ou reyèlman bezwen li?
Li ralanti menm sou ti tab. Men, se yon ti kras fre, kidonk depi ou te li sa a lwen ... ann pale sou %%physloc%%!
Kounye a ke nou konnen ke nou te vle fèmen paj la nan Sales.OrderLines, nou ka gade tout done ki nan tablo sa a, ki estoke nan dosye done #3 nan paj #70133, lè l sèvi avèk rechèch sa a:
Use WideWorldImporters;
GO
SELECT
sys.fn_PhysLocFormatter (%%physloc%%),
*
FROM Sales.OrderLines (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'
GO
Tankou mwen te di, li ralanti menm sou ti tab. Mwen te ajoute NOLOCK nan demann lan paske nou toujou pa gen okenn garanti ke done nou vle gade yo se egzakteman menm jan li te ye lè kadna a te detekte - pou nou ka san danje fè lekti sal.
Men, Hurray, rechèch la retounen m 'menm 25 ranje yo pou ke rechèch nou an te goumen
Ase sou PAGE kadna. E si nou ap tann yon KLE lock?
2) waitresource = "KEY: 6:72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (Hash majik ki ka dechifre lè l sèvi avèk %%lockres%% si ou reyèlman vle sa)
Si demann ou an ap eseye fèmen yon dosye nan endèks la epi li fèmen tèt li, ou fini ak yon kalite adrès konplètman diferan.
Kraze "6:72057594041991168 (ce52f92a058c)" an pati, nou jwenn:
database_id = 6
hobt_id = 72057594041991168
hash majik = (ce52f92a058c)
2.1) Decrypt database_id
Sa a travay egzakteman menm jan ak egzanp ki anwo a! Jwenn non baz done a lè l sèvi avèk rechèch la:
SELECT
name
FROM sys.databases
WHERE database_id=6;
GO
Nan kontèks baz done a jwenn, ou bezwen egzekite yon rechèch nan sys.partitions ak yon pè nan rantre ki pral ede detèmine non yo nan tab la ak endèks...
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
Li di m ke demann lan t ap tann sou aplikasyon an. Peyi fèmen lè l sèvi avèk endèks PK_Application_Countries.
2.3) Koulye a, yon ti kras majik %%lockres%% - si ou vle chèche konnen ki antre te fèmen
Si mwen reyèlman vle konnen ki ranje kadna a te sou, mwen ka chèche konnen lè mwen mande tab la tèt li. Nou ka sèvi ak fonksyon %%lockres%% san dokiman pou jwenn yon antre ki matche ak hash majik la.
Tanpri sonje ke rechèch sa a pral eskane tout tab la, epi sou tab gwo sa a ka pa plezi ditou:
SELECT
*
FROM Application.Countries (NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO
Mwen te ajoute NOLOCK (sou konsèy Klaus Aschenbrenner sou Twitter) paske blokaj ka vin yon pwoblèm. Nou jis vle gade sa ki la kounye a, epi yo pa sa ki te la lè tranzaksyon an te kòmanse - mwen pa panse ke konsistans done enpòtan pou nou.
Voila, dosye nou te goumen pou nou!
Rekonesans ak plis lekti
Mwen pa sonje ki moun ki premye dekri anpil nan bagay sa yo, men isit la se de pòs sou bagay ki pi piti dokimante ke ou ta renmen: