Decipher Key na Page WaitResource dina deadlocks na konci
Upami anjeun nganggo laporan prosés anu diblokir atanapi ngumpulkeun grafik deadlock anu disayogikeun ku SQL Server sacara périodik, anjeun bakal mendakan hal-hal sapertos kieu:
Sakapeung, bakal aya langkung seueur inpormasi dina XML raksasa anu anjeun pelajari (grafik deadlock ngandung daptar sumber anu ngabantosan anjeun mendakan nami objék sareng indéks), tapi henteu salawasna.
téks ieu bakal mantuan anjeun decipher aranjeunna.
Sadaya inpormasi anu aya di dieu aya dina Internét di sababaraha tempat, éta disebarkeun pisan! Abdi hoyong nempatkeun sadayana babarengan, ti DBCC PAGE mun hobt_id ka undocumented %% physloc%% jeung %% lockres%% fungsi.
Mimiti, hayu urang ngobrol ngeunaan ngantosan dina konci PAGE, teras teraskeun kana konci KUNCI.
Urang bade nganggo data_file_id dina lengkah saterusna pikeun manggihan nami tabel. Anjeun ngan bisa skip kana lengkah saterusna, tapi lamun kabetot dina ngaran file, Anjeun bisa manggihan eta ku ngajalankeun query dina konteks database kapanggih, ngaganti data_file_id kana query ieu:
USE WideWorldImporters;
GO
SELECT
name,
physical_name
FROM sys.database_files
WHERE file_id = 3;
GO
Dina database WideWorldImporters ieu file disebut WWI_UserData na mah geus disimpen deui ka C: MSSQLDATAWideWorldImporters_UserData.ndf. (Aduh, anjeun nyekel kuring nempatkeun file dina sistem drive! Henteu! Ieu ngerakeun).
1.3) Meunangkeun ngaran objék tina DBCC PAGE
Urang ayeuna terang yén halaman #70133 dina datafile 3 milik database WorldWideImporters. Urang tiasa ningali eusi halaman ieu nganggo DBCC PAGE anu teu didokumentasikeun sareng ngalacak bandéra 3604.
Catetan: Kuring leuwih resep ngagunakeun DBCC PAGE dina salinan disimpen wae dina server sejen, sabab éta barang undocumented. Dina sababaraha kasus, manéhna bisa ngakibatkeun dump a (kira-kira. penerjemah - link, hanjakalna, ngabalukarkeun nowhere, tapi ditilik ku url, urang ngobrol ngeunaan indexes disaring).
/* 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
Ku ngagulung ka hasil, anjeun tiasa mendakan object_id sareng index_id.
Ampir rengse! Ayeuna anjeun tiasa mendakan nami méja sareng indéks kalayan pamundut:
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
Sarta di dieu urang tingali yén antosan on konci éta dina indéks PK_Sales_OrderLines tina tabel Sales.OrderLines.
Catetan: Dina SQL Server 2014 sareng di luhur, nami obyék ogé tiasa dipendakan nganggo DMO sys.dm_db_database_page_allocations anu teu didokumentasikeun. Tapi anjeun kedah naroskeun unggal halaman dina pangkalan data, anu henteu katingali saé pikeun database ageung, janten kuring nganggo DBCC PAGE.
1.4) Naha mungkin ningali data dina halaman anu diblokir?
Nuhun, enya. Tapi… naha anjeun yakin yén anjeun peryogi pisan?
Ieu slow sanajan dina tabel leutik. Tapi éta rada keren, janten saprak anjeun parantos maca dugi ka ayeuna ... hayu urang ngobrol ngeunaan %%physloc%%!
Ayeuna urang terang yén urang hoyong meungpeuk halaman dina Sales.OrderLines, urang tiasa ningali sadaya data dina tabel ieu, anu disimpen dina file data #3 dina halaman #70133, kalayan patarosan ieu:
Use WideWorldImporters;
GO
SELECT
sys.fn_PhysLocFormatter (%%physloc%%),
*
FROM Sales.OrderLines (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'
GO
Salaku Cenah mah, éta slow sanajan dina tabel leutik. Kuring nambihkeun NOLOCK kana pamundut sabab kami masih teu gaduh jaminan yén data anu urang hoyong tingali persis sami sareng waktos konci éta kapanggih - ku kituna urang tiasa aman ngalakukeun bacaan anu kotor.
Tapi, horee, query mulih kuring pisan 25 jajar nu query kami perang.
Cukup ngeunaan konci PAGE. Kumaha upami urang ngantosan konci KUNCI?
Upami pamundut anjeun nyobian ngonci éntri indéks sareng dikonci nyalira, anjeun nampi jinis alamat anu béda.
Megatkeun "6: 72057594041991168 (ce52f92a058c)" kana bagian, urang meunang:
id_database = 6
hobt_id = 72057594041991168
magic hash = (ce52f92a058c)
2.1) Ngadékripsi id_database
Gawéna persis sarua jeung conto di luhur! Kami mendakan nami pangkalan data nganggo pamundut:
SELECT
name
FROM sys.databases
WHERE database_id=6;
GO
Dina kontéks pangkalan data anu kapendak, anjeun kedah naroskeun sys.partitions sareng sababaraha gabungan anu bakal ngabantosan nangtukeun nami tabel sareng indé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
Eta ngabejaan kuring yen pamundut ieu ngantosan on konci Application.Countries ngagunakeun indéks PK_Application_Countries.
2.3) Ayeuna pikeun sababaraha %%lockres%% sihir - upami anjeun hoyong terang éntri mana anu dikonci
Upami kuring hoyong terang dina barisan mana konci anu diperyogikeun, kuring tiasa mendakan ku naroskeun kana méja sorangan. Urang tiasa nganggo undocumented %% lockres%% fungsi pikeun manggihan entri nu cocog jeung Hash magic.
Catet yén pamundut ieu bakal nyeken sakabéh tabel, sarta dina tabel badag ieu bisa jadi teu senang pisan:
SELECT
*
FROM Application.Countries (NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO
Abdi nambihan NOLOCK (on nasehat Klaus Aschenbrenner on twitter) sabab konci tiasa janten masalah. Kami ngan ukur hoyong ningali naon anu aya ayeuna, sareng sanés naon anu aya nalika urus dimimitian - kuring henteu nyangka yén konsistensi data penting pikeun urang.
Voila, catetan anu urang perjuangkeun!
Pangakuan sareng bacaan salajengna
Abdi henteu émut saha anu mimiti ngajelaskeun seueur hal ieu, tapi ieu aya dua tulisan ngeunaan hal-hal anu pangsaeutikna didokumentasikeun anu anjeun resep: