Decipher Key සහ Page WaitResource ඩෙඩ්ලොක් සහ ලොක් වල

ඔබ අවහිර කරන ලද ක්‍රියාවලි වාර්තාව භාවිතා කරන්නේ නම් හෝ SQL සේවාදායකය විසින් සපයන ලද ඩෙඩ්ලොක් ප්‍රස්ථාර වරින් වර එකතු කරන්නේ නම්, ඔබට මෙවැනි දේවල් හමුවනු ඇත:

waitresource="PAGE: 6:3:70133"

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

සමහර විට, ඔබ අධ්‍යයනය කරන එම යෝධ XML හි තවත් තොරතුරු තිබේ (ඩඩ්ලොක් ප්‍රස්තාරවල ඔබට වස්තුවේ සහ දර්ශකයේ නම් සොයා ගැනීමට උපකාර වන සම්පත් ලැයිස්තුවක් අඩංගු වේ), නමුත් සෑම විටම නොවේ.

මෙම පාඨය ඔබට ඒවා විකේතනය කිරීමට උපකාරී වනු ඇත.

මෙහි ඇති සියලුම තොරතුරු අන්තර්ජාලයේ විවිධ ස්ථානවල ඇත, එය ඉතා සරලව බෙදා හරිනු ලැබේ! මට DBCC PAGE සිට hobt_id දක්වා ලේඛනගත නොකළ %%physloc%% සහ %%lockres%% ශ්‍රිත දක්වා සියල්ල එකට තැබීමට අවශ්‍යයි.

පළමුව, අපි PAGE අගුලු මත රැඳී සිටීම ගැන කතා කරමු, ඉන්පසු KEY අගුලු වෙත යමු.

1) waitresource="PAGE: 6:3:70133" = Database_Id: FileId: PageNumber

ඔබගේ ඉල්ලීම PAGE අගුලක් මත රැඳී සිටින්නේ නම්, SQL සේවාදායකය ඔබට එම පිටුවේ ලිපිනය ලබා දෙනු ඇත.

"පිටුව: 6:3:70133" බිඳ දැමීමෙන් අපට ලැබෙන්නේ:

  • දත්ත සමුදාය_id = 6
  • data_file_id = 3
  • page_number = 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 PAGE වෙතින් වස්තුවේ නම ලබා ගන්න

Datafile 70133 හි #3 පිටුව අයත් වන්නේ WorldWideImporters දත්ත ගබඩාවට බව අපි දැන් දනිමු. අපට ලේඛනගත නොකළ DBCC PAGE සහ 3604 කොඩිය භාවිතා කර මෙම පිටුවේ අන්තර්ගතය දෙස බැලිය හැක.
සටහන: වෙනත් සේවාදායකයක කොතැනක හෝ ප්‍රතිසාධනය කරන ලද පිටපතක DBCC PAGE භාවිතා කිරීමට මම කැමැත්තෙමි, මන්ද එය ලේඛනගත නොකළ දේවල් වේ. සමහර අවස්ථාවලදී, ඇය ඩම්ප් එකක් ඇති විය හැක (ආසන්න වශයෙන් පරිවර්තකය - සබැඳිය, අවාසනාවකට මෙන්, කොතැනකවත් මඟ පෙන්වනු නොලැබේ, නමුත් url මගින් විනිශ්චය කිරීම, අපි පෙරූ දර්ශක ගැන කතා කරමු).

/* 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 සොයා ගත හැක.
Decipher Key සහ Page 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

තවද මෙහි අගුල මත රැඳී සිටීම විකුණුම්.OrderLines වගුවේ PK_Sales_OrderLines දර්ශකයේ තිබූ බව අපට පෙනේ.

සටහන: SQL Server 2014 සහ ඉහළ වලදී, ලේඛනගත නොකළ DMO sys.dm_db_database_page_allocations භාවිතයෙන් වස්තුවේ නම සොයා ගත හැක. නමුත් ඔබට දත්ත සමුදායේ සෑම පිටුවක්ම විමසිය යුතුය, එය විශාල දත්ත සමුදායන් සඳහා එතරම් සිසිල් බවක් නොපෙනේ, එබැවින් මම DBCC PAGE භාවිතා කළෙමි.

1.4) අවහිර කරන ලද පිටුවේ දත්ත දැකිය හැකිද?

Nuuu, ඔව්. නමුත්... ඔබට එය ඇත්තෙන්ම අවශ්‍ය බව ඔබට විශ්වාසද?
කුඩා මේස මත පවා එය මන්දගාමී වේ. නමුත් එය තරමක් සිසිල් ය, එබැවින් ඔබ මෙතෙක් කියවා ඇති බැවින් ... අපි %%physloc%% ගැන කතා කරමු!

%%physloc%% යනු සෑම ප්‍රවේශයක් සඳහාම භෞතික හැඳුනුම්පතක් ලබා දෙන ලේඛනගත නොකළ මැජික් කොටසකි. ඔයාට පාවිච්චි කරන්න පුළුවන් SQL Server 2008 සහ පසුව sys.fn_PhysLocFormatter සමඟ %%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ම ආපසු ලබා දෙයි.
Decipher Key සහ Page WaitResource ඩෙඩ්ලොක් සහ ලොක් වල
PAGE අගුලු ගැන ඇති. අපි KEY අගුලක් එනතුරු බලා සිටින්නේ නම් කුමක් කළ යුතුද?

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 එකතු කළා (twitter හි ක්ලවුස් Aschenbrenner ගේ උපදෙස් මත) අගුලු දැමීම ගැටළුවක් විය හැකි බැවිනි. අපට අවශ්‍ය වන්නේ ගනුදෙනුව ආරම්භ වන විට එහි තිබූ දේ නොව දැන් එහි ඇති දේ දෙස බැලීමටය - දත්ත අනුකූලතාව අපට වැදගත් යැයි මම නොසිතමි.
Voila, අපි සටන් කළ වාර්තාව!
Decipher Key සහ Page WaitResource ඩෙඩ්ලොක් සහ ලොක් වල

පිළිගැනීම් සහ වැඩිදුර කියවීම

මෙම බොහෝ දේ මුලින්ම විස්තර කළේ කවුදැයි මට මතක නැත, නමුත් ඔබ කැමති විය හැකි අඩුවෙන්ම ලේඛනගත කළ දේවල් ගැන පළ කිරීම් දෙකක් මෙන්න:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න