ඔබ අවහිර කරන ලද ක්රියාවලි වාර්තාව භාවිතා කරන්නේ නම් හෝ 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
එය පොදු ය
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 භාවිතා කිරීමට මම කැමැත්තෙමි, මන්ද එය ලේඛනගත නොකළ දේවල් වේ. සමහර අවස්ථාවලදී, ඇය
/* 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
තවද මෙහි අගුල මත රැඳී සිටීම විකුණුම්.OrderLines වගුවේ PK_Sales_OrderLines දර්ශකයේ තිබූ බව අපට පෙනේ.
සටහන: SQL Server 2014 සහ ඉහළ වලදී, ලේඛනගත නොකළ DMO sys.dm_db_database_page_allocations භාවිතයෙන් වස්තුවේ නම සොයා ගත හැක. නමුත් ඔබට දත්ත සමුදායේ සෑම පිටුවක්ම විමසිය යුතුය, එය විශාල දත්ත සමුදායන් සඳහා එතරම් සිසිල් බවක් නොපෙනේ, එබැවින් මම DBCC PAGE භාවිතා කළෙමි.
1.4) අවහිර කරන ලද පිටුවේ දත්ත දැකිය හැකිද?
Nuuu, ඔව්. නමුත්... ඔබට එය ඇත්තෙන්ම අවශ්ය බව ඔබට විශ්වාසද?
කුඩා මේස මත පවා එය මන්දගාමී වේ. නමුත් එය තරමක් සිසිල් ය, එබැවින් ඔබ මෙතෙක් කියවා ඇති බැවින් ... අපි %%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 අගුලු ගැන ඇති. අපි 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
මගේ නඩුවේදී, එය එසේමය
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 එකතු කළා (
Voila, අපි සටන් කළ වාර්තාව!
පිළිගැනීම් සහ වැඩිදුර කියවීම
මෙම බොහෝ දේ මුලින්ම විස්තර කළේ කවුදැයි මට මතක නැත, නමුත් ඔබ කැමති විය හැකි අඩුවෙන්ම ලේඛනගත කළ දේවල් ගැන පළ කිරීම් දෙකක් මෙන්න:
- පෝල් රැන්ඩල්ගේ සටහන ගැන
%%physloc%% සහ sys.fn_PhysLocFormatter (පළමු උදාහරණයේ අපගේ දත්ත ඇති පරිදි) - StackOverflow ගැන ප්රශ්නය
%%lockres%% භාවිතා කරමින් (දෙවන උදාහරණයේ දත්ත සොයා ගත් පරිදි). එක් පිළිතුරක් පෝස්ට් වෙත යොමු කරයිGrant Fritchey %%lockres%% ගැන ලියා ඇත්තේ 2010 දී ය .
මූලාශ්රය: www.habr.com