ቁልፍ እና ገጽ WaitResourceን በመዝጊያዎች እና መቆለፊያዎች ውስጥ ያውጡ

የታገደውን የሂደት ሪፖርት ከተጠቀሙ ወይም በSQL አገልጋይ በየጊዜው የሚቀርቡትን የመዝጊያ ግራፎችን ከሰበሰቡ እንደዚህ ያሉ ነገሮች ያጋጥሙዎታል፡-

waitresource="ገጽ: 6:3:70133"

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

አንዳንድ ጊዜ፣ እርስዎ በሚያጠኑት ግዙፍ ኤክስኤምኤል ውስጥ ተጨማሪ መረጃ ይኖራል (የማስቆሚያ ግራፎች የነገሩን እና የመረጃ ጠቋሚውን ስም ለማወቅ የሚረዱዎትን የመረጃ ሀብቶች ዝርዝር ይይዛሉ) ግን ሁልጊዜ አይደለም።

ይህ ጽሑፍ እነሱን ለመፍታት ይረዳዎታል።

እዚህ ያለው መረጃ ሁሉ በተለያዩ ቦታዎች በይነመረብ ላይ ነው, በቀላሉ በጣም ተሰራጭቷል! ሁሉንም ከ DBCC PAGE እስከ hobt_id እስከ ሰነድ አልባ %%physloc%% እና %%lockres%% ተግባራትን አንድ ላይ ማድረግ እፈልጋለሁ።

በመጀመሪያ፣ ስለ PAGE መቆለፊያዎች ስለ መጠበቅ እንነጋገር፣ እና ከዚያ ወደ ቁልፍ ቁልፎች እንሂድ።

1) waitresource=«ገጽ፡ 6፡3፡70133» = ዳታቤዝ_አይድ፡ FileId፡ ገጽ ቁጥር

ጥያቄዎ በ PAGE መቆለፊያ ላይ እየጠበቀ ከሆነ፣ SQL Server የዚያን ገጽ አድራሻ ይሰጥዎታል።

"ገጽ: 6:3:70133" ከፋፍለን እናገኛለን:

  • የውሂብ ጎታ_id = 6
  • ዳታ_ፋይል_መታወቂያ = 3
  • ገጽ_ቁጥር = 70133

1.1) ዳታቤዝ_idን ዲክሪፕት ያድርጉ

መጠይቁን በመጠቀም የመረጃ ቋቱን ስም ይፈልጉ፡-

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

የህዝብ ነው። DB WideWorldImporters በእኔ SQL አገልጋይ ላይ።

1.2) የውሂብ ፋይሉን ስም መፈለግ - ፍላጎት ካሎት

የሠንጠረዡን ስም ለማግኘት በሚቀጥለው ደረጃ data_file_id ልንጠቀም ነው። በቀላሉ ወደሚቀጥለው ደረጃ መዝለል ይችላሉ፣ ነገር ግን የፋይል ስሙን የሚፈልጉ ከሆነ፣ በተገኘው የውሂብ ጎታ አውድ ውስጥ መጠይቅን በማሄድ በዚህ መጠይቅ data_file_id በመተካት ሊያገኙት ይችላሉ።

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

በWideWorldImporters ዳታቤዝ ውስጥ ይህ WWI_UserData የሚባል ፋይል ነው እና ወደ C:MSSQLDATAWideWorldImporters_UserData.ndf ተመልሷል። (ውይ፣ በሲስተሙ ድራይቭ ላይ ፋይሎችን ሳስቀምጥ ያዝከኝ! አይ! አሳፋሪ ነው)።

1.3) የነገር ስም ከ DBCC ገጽ ያግኙ

አሁን በዳታፋይል 70133 ውስጥ ያለው ገጽ #3 የአለም አቀፍ አስመጪዎች ዳታቤዝ መሆኑን እናውቃለን። ሰነድ የሌለውን DBCC PAGE እና ባንዲራ 3604 በመጠቀም የዚህን ገጽ ይዘቶች መመልከት እንችላለን።
ማሳሰቢያ፡ የዲቢሲሲ ገጽን በሌላ አገልጋይ ላይ በሆነ ቦታ በተመለሰ ቅጂ መጠቀም እመርጣለሁ፣ ምክንያቱም ሰነድ አልባ ነገሮች ናቸው። በአንዳንድ ሁኔታዎች እሷ ቆሻሻ መጣያ ሊያስከትል ይችላል (በግምት ተርጓሚ - አገናኙ, በሚያሳዝን ሁኔታ, የትም አይመራም, ነገር ግን በዩአርኤል በመመዘን, ስለ የተጣሩ ኢንዴክሶች እንነጋገራለን.).

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

ወደ ውጤቶቹ በማሸብለል፣ object_id እና index_id ማግኘት ይችላሉ።
ቁልፍ እና ገጽ WaitResourceን በመዝጊያዎች እና መቆለፊያዎች ውስጥ ያውጡ
ሊጨርስ ነው! አሁን የሰንጠረዡን እና የመረጃ ጠቋሚ ስሞችን በመጠይቅ ማግኘት ይችላሉ-

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

እና እዚህ በመቆለፊያ ላይ ያለው ጥበቃ በPK_Sales_OrderLines የሽያጭ መስመር ሰንጠረዥ ላይ እንደነበረ እናያለን።

ማሳሰቢያ፡ በSQL Server 2014 እና ከዚያ በላይ የነገሩን ስም ሰነድ አልባውን DMO sys.dm_db_database_page_allocations በመጠቀም ሊገኝ ይችላል። ነገር ግን በዳታቤዝ ውስጥ ያለውን እያንዳንዱን ገጽ መጠይቅ አለብህ፣ ይህም ለትልቅ የውሂብ ጎታዎች በጣም አሪፍ አይመስልም፣ ስለዚህ እኔ DBCC PAGE ተጠቀምኩ።

1.4) በታገደው ገጽ ላይ ያለውን መረጃ ማየት ይቻላል?

ኑኡ፣ አዎ። ግን ... እርግጠኛ ነዎት በእርግጥ ያስፈልገዎታል?
በትንሽ ጠረጴዛዎች ላይ እንኳን ቀርፋፋ ነው. ግን በጣም ጥሩ ነው፣ስለዚህ እስካሁን ስላነበብክ...ስለ%%physloc%% እናውራ!

%% physloc%% ለእያንዳንዱ ግቤት አካላዊ መታወቂያ የሚመልስ ሰነድ የሌለው አስማት ነው። መጠቀም ትችላለህ %%physloc%% ከ sys.fn_PhysLocFormatter ጋር በSQL Server 2008 እና ከዚያ በላይ.

አሁን በ Sales.OrderLines ውስጥ ያለውን ገጽ ለማገድ እንደፈለግን ስለምናውቅ፣ በዚህ ሠንጠረዥ ውስጥ ያሉትን ሁሉንም መረጃዎች በገጽ #3 በመረጃ ፋይል #70133 ውስጥ የተከማቸውን በሚከተለው መጠይቅ መመልከት እንችላለን።

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

እንዳልኩት በትናንሽ ጠረጴዛዎች ላይ እንኳን ቀርፋፋ ነው። በጥያቄው ላይ NOLOCK ጨምሬያለሁ ምክንያቱም አሁንም ልንመለከታቸው የምንፈልገው መረጃ መቆለፊያው በተገኘበት ጊዜ ከነበረው ጋር ተመሳሳይ ስለመሆኑ ምንም አይነት ዋስትና የለንም - ስለዚህ ቆሻሻ ንባቦችን በጥንቃቄ መስራት እንችላለን።
ነገር ግን ሆሬ፣ መጠይቁ የኛን ጥያቄ የታገለባቸውን 25 ረድፎች መለሰልኝ።
ቁልፍ እና ገጽ WaitResourceን በመዝጊያዎች እና መቆለፊያዎች ውስጥ ያውጡ
ስለ PAGE መቆለፊያዎች በቂ። የቁልፍ መቆለፊያ እየጠበቅን ከሆነስ?

2) waitresource="KEY: 6:72057594041991168 (ce52f92a058c)" = Database_Id፣ HOBT_Id (ከምር ከፈለጉ በ%%lockres%% ሊፈታ የሚችል አስማታዊ ሃሽ)

ጥያቄዎ የመረጃ ጠቋሚ መግቢያ ላይ ለመቆለፍ ከሞከረ እና በራሱ ከተቆለፈ፣ ፍጹም የተለየ የአድራሻ አይነት ያገኛሉ።
«6:72057594041991168 (ce52f92a058c)»ን ወደ ክፍሎች ስንከፍል፡-

  • የውሂብ ጎታ_id = 6
  • hobt_id = 72057594041991168
  • አስማት ሃሽ = (ce52f92a058c)

2.1) ዳታቤዝ_idን ዲክሪፕት ያድርጉ

ከላይ ካለው ምሳሌ ጋር በትክክል ይሰራል! መጠይቁን በመጠቀም የመረጃ ቋቱን ስም እናገኛለን፡-

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

በእኔ ሁኔታ ያው ነው። DB WideWorldImporters.

2.2) hobt_idን ዲክሪፕት ያድርጉ

በተገኘው የመረጃ ቋት አውድ ውስጥ የሠንጠረዡን እና የመረጃ ጠቋሚውን ስም ለመወሰን የሚያግዙ ሁለት መጋጠሚያዎችን በመጠቀም sys.partitions መጠየቅ ያስፈልግዎታል ...

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

ጥያቄው በአፕሊኬሽኑ ላይ እየጠበቀ እንደነበር ነገረኝ።የPK_Application_Countries ኢንዴክስ በመጠቀም አገሮች ይቆለፋሉ።

2.3) አሁን ለአንዳንድ %%lockres%% አስማት - የትኛው ግቤት እንደተቆለፈ ለማወቅ ከፈለጉ

መቆለፊያው በየትኛው ረድፍ ላይ እንደሚፈለግ በትክክል ማወቅ ከፈለግኩ ጠረጴዛውን ራሱ በመጠየቅ ማወቅ እችላለሁ። ከአስማት ሃሽ ጋር የሚዛመድ ግቤት ለማግኘት ሰነድ የሌለውን %%lockres%% ተግባርን መጠቀም እንችላለን።
ይህ መጠይቅ ሙሉውን ጠረጴዛ እንደሚቃኝ እና በትላልቅ ጠረጴዛዎች ላይ ይህ በጭራሽ አስደሳች ላይሆን እንደሚችል ልብ ይበሉ።

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

NOLOCK አክያለሁ (በትዊተር ላይ በክላውስ አስቼንበርነር ምክር) ምክንያቱም መቆለፊያዎች ችግር ሊሆኑ ይችላሉ. እኛ አሁን ያለውን ነገር ማየት እንፈልጋለን፣ እና ግብይቱ ሲጀመር የነበረውን ሳይሆን - የውሂብ ወጥነት ለእኛ አስፈላጊ ነው ብዬ አላምንም።
ቮይላ፣ የታገልንለት መዝገብ!
ቁልፍ እና ገጽ WaitResourceን በመዝጊያዎች እና መቆለፊያዎች ውስጥ ያውጡ

ምስጋናዎች እና ተጨማሪ ንባብ

ከእነዚህ ውስጥ ብዙዎቹን ለመጀመሪያ ጊዜ የገለፀው ማን እንደሆነ አላስታውስም፣ ነገር ግን ሊወዷቸው ስለሚችሏቸው በትንሹ ሰነዶች የተጻፉ ሁለት ልጥፎች እዚህ አሉ።

ምንጭ: hab.com

አስተያየት ያክሉ