Mifteya û Çavkaniya Rûpelê ya Waitê di nav girtî û qefilan de deşîfre bikin

Ger hûn rapora pêvajoya astengkirî bikar bînin an jî grafikên mirinê yên ku ji hêla SQL Server ve têne peyda kirin bi periyodîk berhev bikin, hûn ê bi tiştên weha re rû bi rû bimînin:

waitresource = "PAGE: 6:3:70133"

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

Carinan dê di wê XML-ya giyanî ya ku hûn lê dixwînin de bêtir agahdarî hebin (grafikên mirinê navnîşek çavkaniyan vedihewîne ku ji we re dibe alîkar ku hûn navên tiştan û navnîşan bibînin), lê ne her gav.

Ev nivîs dê ji we re bibe alîkar ku hûn wan deşîfre bikin.

Hemî agahdariya ku li vir heye li cîhê cûda li ser Înternetê ye, ew tenê pir tê belav kirin! Ez dixwazim her tiştî li hev bikim - ji DBCC PAGE bigire heya hobt_id û heya fonksiyonên bêbelge %%physloc%% û %%lockres%%.

Pêşî, bila em li ser bendên li ser qefleyên PAGE-ê biaxivin, û dûv re em ê biçin ser qefleyên KEY.

1) waitresource="PAGE: 6:3:70133" = Nasnameya Database: Nasnameya Pelê: Hejmara Rûpelê

Ger pirsa we li benda kilîtkirina RAGE-yê ye, SQL Server dê navnîşana wê rûpelê bide we.

Bi şikandina "RÛpel: 6:3:70133" em distînin:

  • database_id = 6
  • data_file_id = 3
  • hejmara_rûpel = 70133

1.1) Database_id şîfre bike

Ka em navê databasê bi karanîna pirsê bibînin:

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

Ev gelemper e DB WideWorldImporters li ser SQL Servera min.

1.2) Li navê pelê daneyê digerin - heke hûn eleqedar in

Em ê di gava paşîn de data_file_id bikar bînin da ku navê tabloyê bibînin. Hûn dikarin bi hêsanî derbasî qonaxa paşîn bibin, lê heke hûn bi navê pelê re eleqedar in, hûn dikarin wê bi xebitandina pirsek di çarçoweya databasa hatî dîtin de bibînin, di vê pirsê de data_file_id bi cîh bikin:

USE WideWorldImporters;
GO
SELECT 
    name, 
    physical_name
FROM sys.database_files
WHERE file_id = 3;
GO

Di databasa WideWorldImporters de ev pelek bi navê WWI_UserData ye û min ew li C:MSSQLDATAWideWorldImporters_UserData.ndf vegerandiye. (Oops, te ez girtim ku pelan li ser dîska pergalê datînim! Na! Ew ecêb bû).

1.3) Navê objektê ji DBCC PAGE bistînin

Naha em dizanin ku rûpela #70133 di pelê daneya 3 de girêdayî databasa WorldWideImporters e. Em dikarin li naveroka vê rûpelê bi karanîna PAGE-a DBCC ya nebelge û ala 3604-ê bişopînin binêrin.
Nîşe: Ez tercîh dikim ku DBCC PAGE li ser kopiyek vesazkirî ya ji hilanînê li cîhek li ser serverek din bikar bînim, ji ber ku ew tiştek bêbelge ye. Di hin rewşan de, wê dibe ku bibe sedem ku depoyek were çêkirin (approx. wergêr - girêdan, mixabin, nahêle cîhek, lê li gorî url-yê dadbar kirin, em li ser navnîşên fîlterkirî diaxivin).

/* 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

Di encaman de bigerin, hûn dikarin object_id û index_id bibînin.
Mifteya û Çavkaniya Rûpelê ya Waitê di nav girtî û qefilan de deşîfre bikin
Hema tê kirin! Naha hûn dikarin navên tablo û navnîşan bi karanîna pirsê bibînin:

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

Û naha em dibînin ku benda kilîtkirinê li ser navnîşa PK_Sales_OrderLines ya tabloya Sales.OrderLines bû.

Nîşe: Di SQL Server 2014 û paşê de, navê objektê dikare bi karanîna DMO-ya nebelge sys.dm_db_database_page_allocations jî were dîtin. Lê divê hûn li her rûpela databasê bipirsin, ku ji bo databasên mezin pir xweş xuya nake, ji ber vê yekê min PAGE DBCC bikar anî.

1.4) Ma gengaz e ku meriv daneyên li ser rûpelê ku hatî asteng kirin bibînin?

Belê, belê. Lê ... hûn guman dikin ku hûn bi rastî hewce ne?
Li ser maseyên piçûk jî hêdî ye. Lê ew bi rengek xweş e, lewra ji ber ku we heya nuha xwendiye... werin em li ser %%physloc%% biaxivin!

%%physloc%% sêrbazek bêbelge ye ku ji bo her têketinê nasnameyek laşî vedigerîne. hûn dikarin bikar bînin %%physloc%% digel sys.fn_PhysLocFormatter di SQL Server 2008 û mezintir de.

Naha ku em dizanin ku me dixwest ku rûpelê di Sales.OrderLines de kilît bikin, em dikarin li hemî daneyên vê tabloyê, ku di pela daneya #3 ya rûpela #70133 de hatî hilanîn, bi karanîna vê pirsê binihêrin:

Use WideWorldImporters;
GO
SELECT 
    sys.fn_PhysLocFormatter (%%physloc%%),
    *
FROM Sales.OrderLines (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'
GO

Mîna ku min got, ew li ser maseyên piçûk jî hêdî ye. Min NOLOCK li daxwazê ​​zêde kir ji ber ku me hîn jî garantiyek tune ku daneyên ku em dixwazin lê binihêrin tam eynî wekî dema ku kilît hat dîtin e - ji ber vê yekê em dikarin bi ewlehî xwendina qirêj bikin.
Lê, zû, pirs ji min re heman 25 rêzên ku lêpirsîna me şer kir ji min re vedigerîne
Mifteya û Çavkaniya Rûpelê ya Waitê di nav girtî û qefilan de deşîfre bikin
Di derbarê qefleyên PAGE de bes e. Ger em li benda qeflek KEY-ê ​​ne?

2) waitresource="KEY: 6:72057594041991168 (ce52f92a058c)" = Nasnameya Database, HOBT_Id (haşa efsûnî ya ku dikare bi karanîna %%lockres%% were deşîfrekirin heke hûn bi rastî wiya dixwazin)

Ger pirsiyara we hewl dide ku tomarek di navnîşan de kilît bike û bixwe tê kilîtkirin, hûn bi celebek navnîşek bi tevahî cûda diqedin.
"6:72057594041991168 (ce52f92a058c)" perçe dikin, em distînin:

  • database_id = 6
  • hobt_id = 72057594041991168
  • haşa sêrbaz = (ce52f92a058c)

2.1) Database_id şîfre bike

Ev tam mîna mînaka li jor dixebite! Navê databasê bi karanîna pirsê bibînin:

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

Di rewşa min de hîn jî heman e DB WideWorldImporters.

2.2) Şîfrekirina hobt_id

Di çarçoweya databasa hatî dîtin de, hûn hewce ne ku pirsek ji sys.partitions re bi cotek pêvekan pêk bînin ku dê ji bo destnîşankirina navên tabloyê û pêvekê bibin alîkar…

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

Ew ji min re vedibêje ku daxwaz li benda serîlêdanê bû.Countries bi karanîna pêveka PK_Application_Countries ve girêdayî bû.

2.3) Naha sêrbazek piçûk %%lockres%% - heke hûn dixwazin fêr bibin ka kîjan têketin girtî ye

Ger ez bi rastî dixwazim bizanim ku kilît li ser kîjan rêzê bû, ez dikarim bi lêpirsîna tabloyê bixwe bibînim. Em dikarin fonksiyona %%lockres%% ya bêbelge bikar bînin da ku têketinek ku bi haşeya sêrbazî re têkildar e bibînin.
Ji kerema xwe not bikin ku ev pirs dê tevahî tabloyê bişopîne, û li ser maseyên mezin dibe ku ev qet ne xweş be:

SELECT
    *
FROM Application.Countries (NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO

Min NOLOCK zêde kir (li ser şîreta Klaus Aschenbrenner li ser Twitter) ji ber ku astengî dikare bibe pirsgirêk. Em tenê dixwazin li tiştê ku niha li wir heye binihêrin, û ne tiştê ku dema danûstendinê dest pê kir li wir bû - ez nafikirim ku hevgirtina daneyê ji me re girîng e.
Voila, qeyda ku me ji bo şer kir!
Mifteya û Çavkaniya Rûpelê ya Waitê di nav girtî û qefilan de deşîfre bikin

Pejirandin û xwendina bêtir

Nayê bîra min kê pêşî gelek ji van tiştan şirove kir, lê li vir du postên li ser tiştên herî kêm belgekirî hene ku dibe ku hûn jê hez bikin:

Source: www.habr.com

Add a comment