Калид ва саҳифаи WaitResource-ро дар бунбастҳо ва қуфлҳо фаҳмед

Агар шумо гузориши раванди басташударо истифода баред ё графикҳои бастаи аз ҷониби SQL Server пешниҳодшударо ҷамъоварӣ кунед, шумо бо чунин чизҳо дучор хоҳед шуд:

waitresource = "САҲИФА: 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 Server ба шумо суроғаи он саҳифаро медиҳад.

Тақсим кардани "PAGE: 6:3:70133" мо мегирем:

  • database_id = 6
  • data_file_id = 3
  • саҳифа_рақами = 70133

1.1) Рамзи рамзгузории database_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 гиред

Мо ҳоло медонем, ки саҳифаи №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 -ро пайдо кунед.
Калид ва саҳифаи 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 ҷадвали Sales.OrderLines буд.

Эзоҳ: Дар SQL Server 2014 ва боло, номи объектро бо истифода аз DMO ҳуҷҷатнашуда sys.dm_db_database_page_allocations пайдо кардан мумкин аст. Аммо шумо бояд ҳар як саҳифаи пойгоҳи додаҳоро пурсед, ки барои пойгоҳи додаҳои калон он қадар ҷолиб нест, бинобар ин ман DBCC PAGE-ро истифода кардам.

1.4) Оё дидани маълумот дар саҳифаи басташуда имконпазир аст?

Нуу, ҳа. Аммо... шумо мутмаин ҳастед, ки ба шумо дар ҳақиқат ба он ниёз доред?
Он ҳатто дар мизҳои хурд суст аст. Аммо ин хеле олиҷаноб аст, бинобар ин, азбаски шумо ин қадар хондаед...биёед дар бораи %%physloc%% сӯҳбат кунем!

%%physloc%% як пораи ҷодугарии беҳуҷҷатест, ки барои ҳар як вуруд ID-и физикиро бармегардонад. шумо метавонед истифода баред %%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 кофӣ аст. Чӣ мешавад, агар мо интизори қулфи KEY бошем?

2) waitresource="КАЛИД: 6:72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (хеши ҷодугарӣ, ки метавонад бо %%lockres%% рамзкушо карда шавад, агар шумо дар ҳақиқат мехоҳед)

Агар дархости шумо кӯшиш кунад, ки вуруди индексро қуфл кунад ва худаш қулф шавад, шумо як навъи суроғаи тамоман дигар мегиред.
"6: 72057594041991168 (ce52f92a058c)" -ро ба қисмҳо тақсим карда, мо мегирем:

  • database_id = 6
  • hobt_id = 72057594041991168
  • хэш ҷодугарӣ = (ce52f92a058c)

2.1) Рамзи рамзгузории database_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

Он ба ман мегӯяд, ки дархост дар қулфи Application.Countries бо истифода аз индекси PK_Application_Countries интизор буд.

2.3) Ҳоло барои баъзе ҷодуи %%lockres%% - агар шумо хоҳед фаҳмед, ки кадом вуруд баста шудааст

Агар ман дар ҳақиқат мехоҳам бидонам, ки қулф дар кадом сатр лозим буд, ман метавонам тавассути пурсиши худи ҷадвал бифаҳмам. Мо метавонем функсияи ҳуҷҷатнашудаи %%lockres%% -ро барои дарёфти вуруде, ки ба хэши ҷодугарӣ мувофиқ аст, истифода барем.
Дар хотир доред, ки ин пурсиш тамоми ҷадвалро скан мекунад ва дар ҷадвалҳои калон ин тамоман шавқовар нест:

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

Ман NOLOCK илова кардам (бо маслиҳати Клаус Ашенбреннер дар Твиттер) зеро қуфлҳо метавонанд мушкилот дошта бошанд. Мо танҳо мехоҳем бубинем, ки ҳоло дар он ҷо чӣ ҳаст, на он чизе, ки ҳангоми оғози транзаксия вуҷуд дошт - ман фикр намекунам, ки мутобиқати маълумот барои мо муҳим аст.
Войла, рекорде, ки мо барои он мубориза бурдем!
Калид ва саҳифаи WaitResource-ро дар бунбастҳо ва қуфлҳо фаҳмед

Ташаккур ва хондани минбаъда

Ман дар ёд надорам, ки бисёре аз ин чизҳоро кӣ бори аввал тавсиф кардааст, аммо дар ин ҷо ду паём дар бораи чизҳои камтарин ҳуҷҷатгузорӣшуда ба шумо маъқуланд:

Манбаъ: will.com

Илова Эзоҳ