የታገደውን የሂደት ሪፖርት ከተጠቀሙ ወይም በ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
የህዝብ ነው።
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 ማግኘት ይችላሉ።
ሊጨርስ ነው! አሁን የሰንጠረዡን እና የመረጃ ጠቋሚ ስሞችን በመጠይቅ ማግኘት ይችላሉ-
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%% ለእያንዳንዱ ግቤት አካላዊ መታወቂያ የሚመልስ ሰነድ የሌለው አስማት ነው። መጠቀም ትችላለህ
አሁን በ 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 ረድፎች መለሰልኝ።
ስለ 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
በእኔ ሁኔታ ያው ነው።
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 አክያለሁ (
ቮይላ፣ የታገልንለት መዝገብ!
ምስጋናዎች እና ተጨማሪ ንባብ
ከእነዚህ ውስጥ ብዙዎቹን ለመጀመሪያ ጊዜ የገለፀው ማን እንደሆነ አላስታውስም፣ ነገር ግን ሊወዷቸው ስለሚችሏቸው በትንሹ ሰነዶች የተጻፉ ሁለት ልጥፎች እዚህ አሉ።
- የፖል ራንዳል ልጥፍ ስለ
%% physloc%% እና sys.fn_PhysLocFormatter (በመጀመሪያው ምሳሌ ላይ የእኛ ውሂብ እንዳለን) - በ StackOverflow ላይ ያለ ጥያቄ
%%lockres%% በመጠቀም (በሁለተኛው ምሳሌ ላይ ውሂቡን እንዳገኘን). ከመልሶቹ አንዱ ወደ ልጥፍ ይመራልግራንት ፍሪትቼ በ2010 ወደ %%lockres%% ተጽፏል .
ምንጭ: hab.com