Famaritana ny lakile sy ny pejy WaitResource amin'ny fiatoana sy hidy
Raha mampiasa ny tatitra momba ny dingana voasakana ianao na manangona ireo grafika tsy misy fepetra omen'ny SQL Server tsindraindray, dia hahita zavatra toy izao ianao:
Indraindray dia hisy fampahalalana bebe kokoa ao amin'io XML goavambe ianaranao io (ny grafika maty paika dia misy lisitry ny loharano manampy anao hahita ny zavatra sy ny anaran'ny fanondroana), fa tsy foana.
Ity lahatsoratra ity dia hanampy anao hamantatra azy ireo.
Ny vaovao rehetra eto dia ao amin'ny Internet any amin'ny toerana samihafa, zaraina be fotsiny! Te-hametraka ny zava-drehetra aho - manomboka amin'ny DBCC PAGE ka hatramin'ny hobt_id ary amin'ny asa %%physloc%% sy %%lockres%% tsy misy taratasy.
Voalohany, andeha isika hiresaka momba ny fiandrasana amin'ny hidin'ny PAGE, ary avy eo dia hifindra any amin'ny KEY hidin-trano.
1.3) Raiso ny anaran'ny zavatra avy amin'ny DBCC PAGE
Fantatray izao fa ny pejy #70133 ao amin'ny rakitra data 3 dia an'ny tahiry WorldWideImporters. Azontsika jerena ny votoatin'ity pejy ity amin'ny fampiasana ny DBCC PAGE tsy misy taratasy sy ny sainam-pirenena 3604.
Fanamarihana: Aleoko mampiasa DBCC PAGE amin'ny kopia naverina avy amin'ny backup any amin'ny toerana hafa amin'ny mpizara hafa, satria zavatra tsy misy taratasy izany. Amin'ny toe-javatra sasany, izy mety hiteraka fanariam-pako (eo ho eo mpandika teny - ny rohy, indrisy, tsy mitondra mankaiza, fa raha tsaraina amin'ny url, dia miresaka momba ny fanondroana voasivana isika).
/* 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
Rehefa mikoriana amin'ny valiny ianao dia afaka mahita object_id sy index_id.
Efa ho vita! Azonao atao izao ny mahita ny anaran'ny latabatra sy ny index amin'ny alΓ lan'ny fangatahana:
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
Ary ankehitriny hitantsika fa ny fiandrasana hidin-trano dia tao amin'ny tondro PK_Sales_OrderLines an'ny latabatra Sales.OrderLines.
Fanamarihana: Ao amin'ny SQL Server 2014 sy aoriana, ny anaran'ny zavatra dia azo jerena amin'ny fampiasana ny DMO sys.dm_db_database_page_allocations tsy misy taratasy. Saingy tsy maintsy manontany ny pejy rehetra ao amin'ny database ianao, izay tsy dia mahafinaritra loatra amin'ny angon-drakitra lehibe, ka nampiasa DBCC PAGE aho.
1.4) Azo atao ve ny mahita ny angon-drakitra ao amin'ny pejy voasakana?
Eny, eny. Saingy... azonao antoka ve fa tena ilainao izany?
Miadana na eny ambony latabatra kely aza. Fa somary mangatsiatsiaka ihany, ka hatramin'ny namakianao hatramin'izao... %%physloc%% no resahina!
Rehefa fantatray izao fa te hanidy ny pejy ao amin'ny Sales.OrderLines izahay dia afaka mijery ny angona rehetra ato amin'ity tabilao ity, izay voatahiry ao amin'ny rakitra data #3 amin'ny pejy #70133, amin'ny fampiasana ity fanontaniana ity:
Use WideWorldImporters;
GO
SELECT
sys.fn_PhysLocFormatter (%%physloc%%),
*
FROM Sales.OrderLines (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'
GO
Araka ny nolazaiko dia miadana na dia amin'ny latabatra kely aza. Nampiako NOLOCK ny fangatahana satria mbola tsy manana antoka izahay fa ny angon-drakitra tiana hojerena dia mitovy tanteraka amin'ny fotoana nahitana ny hidin-trano - mba hahafahanay manao vakiteny maloto.
Saingy, indrisy, ny andalana 25 mitovy amin'izay niadian'ny fanontanianay no naverin'ilay fanontaniana tamiko
Ampy izay ny hidin'ny PAGE. Ahoana raha miandry hidy KEY isika?
Raha manandrana manidy rakitsoratra ao amin'ny fanondroana ny fanontanianao ary voahidy ny tenany, dia manana karazana adiresy hafa tanteraka ianao.
Manapaka ny "6:72057594041991168 (ce52f92a058c)" ho ampahany, dia mahazo:
database_id = 6
hobt_id = 72057594041991168
majika hash = (ce52f92a058c)
2.1) Decrypt database_id
Mitovy tanteraka amin'ny ohatra etsy ambony io! Tadiavo ny anaran'ny angon-drakitra mampiasa ny fangatahana:
SELECT
name
FROM sys.databases
WHERE database_id=6;
GO
Ao anatin'ny tontolon'ny angon-drakitra hita, mila manatanteraka fanontaniana amin'ny sys.partitions ianao miaraka amin'ny fiaraha-miasa roa izay hanampy amin'ny famaritana ny anaran'ny latabatra sy ny index...
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
Lazainy amiko fa miandry eo amin'ny Application.Countries hidin-trano ny fangatahana mampiasa ny PK_Application_Countries index.
Raha tena te-hahafantatra aho hoe aiza no nisy ny hidin-trano, dia azoko fantarina amin'ny alalan'ny fanontaniako ny latabatra mihitsy. Azontsika ampiasaina ny fiasa %%lockres%% tsy misy taratasy hitadiavana fidirana mifanaraka amin'ny hash majika.
Mariho fa ity fanontaniana ity dia hijery ny latabatra manontolo, ary amin'ny latabatra lehibe dia mety tsy hahafinaritra mihitsy izany:
SELECT
*
FROM Application.Countries (NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO
Nampiako NOLOCK (amin'ny torohevitr'i Klaus Aschenbrenner ao amin'ny Twitter) satria mety ho lasa olana ny fanakanana. Te-hijery fotsiny izay misy amin'izao fotoana izao izahay, fa tsy izay teo tamin'ny nanombohan'ny fifampiraharahana - tsy heveriko fa zava-dehibe amintsika ny tsy fitovian'ny angon-drakitra.
Voila, ny rakitsoratra niadianay!
Fisaorana sy famakiana fanampiny
Tsy tadidiko hoe iza no namaritra voalohany ny ankamaroan'ireo zavatra ireo, fa ireto misy lahatsoratra roa momba ny zavatra kely indrindra voarakitra mety ho tianao: