AtÅ”ifrÄjiet atslÄgu un Page WaitResource strupceļos un slÄdzenes
Ja izmantojat bloÄ·ÄtÄ procesa pÄrskatu vai periodiski apkopojat strupceļa diagrammas, ko nodroÅ”ina SQL Server, jÅ«s saskarsities ar Å”ÄdÄm lietÄm:
Dažreiz jÅ«su pÄtÄ«tajÄ milzÄ«gajÄ XML bÅ«s vairÄk informÄcijas (strupcijas grafikos ir resursu saraksts, kas palÄ«dz noskaidrot objekta un indeksa nosaukumus), bet ne vienmÄr.
Å is teksts palÄ«dzÄs jums tos atÅ”ifrÄt.
Visa informÄcija, kas Å”eit ir, ir internetÄ dažÄdÄs vietÄs, tÄ vienkÄrÅ”i ir ļoti izplatÄ«ta! Es vÄlos to visu apvienot, sÄkot no DBCC PAGE lÄ«dz hobt_id un beidzot ar nedokumentÄtajÄm %%physloc%% un %%lockres%% funkcijÄm.
Vispirms parunÄsim par gaidÄ«Å”anu PAGE slÄdzenÄs un pÄc tam pÄrejiet uz KEY slÄdzenÄm.
1.2) MeklÄju datu faila nosaukumu - ja jÅ«s interesÄ
NÄkamajÄ darbÄ«bÄ mÄs izmantosim data_file_id, lai atrastu tabulas nosaukumu. Varat vienkÄrÅ”i pÄriet uz nÄkamo soli, bet, ja jÅ«s interesÄ faila nosaukums, varat to atrast, izpildot vaicÄjumu atrastÄs datu bÄzes kontekstÄ, aizstÄjot ar Å”o vaicÄjumu data_file_id:
USE WideWorldImporters;
GO
SELECT
name,
physical_name
FROM sys.database_files
WHERE file_id = 3;
GO
DatubÄzÄ WideWorldImporters Å”is ir fails ar nosaukumu WWI_UserData, un es to atjaunoju uz C:MSSQLDATAWideWorldImporters_UserData.ndf. (Hmm, jÅ«s pieÄ·ÄrÄt mani, ievietojot failus sistÄmas diskÄ! NÄ! Tas ir neÄrti).
1.3) Iegūstiet objekta nosaukumu no DBCC PAGE
Tagad mÄs zinÄm, ka 70133. datu faila lapa #3 pieder WorldWideImporters datubÄzei. MÄs varam apskatÄ«t Ŕīs lapas saturu, izmantojot nedokumentÄtu DBCC PAGE un izsekoÅ”anas karogu 3604.
PiezÄ«me. Man labÄk patÄ«k izmantot DBCC PAGE atjaunotÄ kopijÄ kaut kur citÄ serverÄ«, jo tÄ ir nedokumentÄta lieta. Dažos gadÄ«jumos viÅa var izraisÄ«t izgÄztuvi (apm. tulkotÄjs - saite diemžÄl nekur neved, bet, spriežot pÄc url, mÄs runÄjam par filtrÄtiem indeksiem).
/* 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
Ritinot lÄ«dz rezultÄtiem, varat atrast objektu_id un index_id.
GandrÄ«z pabeigts! Tagad jÅ«s varat atrast tabulu un indeksu nosaukumus ar vaicÄjumu:
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
Un Å”eit mÄs redzam, ka bloÄ·ÄÅ”anas gaidÄ«Å”ana bija tabulas Sales.OrderLines indeksÄ PK_Sales_OrderLines.
PiezÄ«me. OperÄtÄjsistÄmÄ SQL Server 2014 un jaunÄkÄs versijÄs objekta nosaukumu var atrast arÄ«, izmantojot nedokumentÄtu DMO sys.dm_db_database_page_allocations. Bet ir jÄvaicÄ katra datubÄzes lapa, kas lielÄm datu bÄzÄm neizskatÄs Ä«paÅ”i forÅ”i, tÄpÄc izmantoju DBCC PAGE.
1.4) Vai ir iespÄjams redzÄt datus lapÄ, kas tika bloÄ·Äta?
Nuuu, jÄ. Bet... vai esat pÄrliecinÄts, ka jums tas tieÅ”Äm ir vajadzÄ«gs?
Tas ir lÄns pat uz maziem galdiem. Bet tas ir forÅ”i, tÄpÄc, tÄ kÄ esat izlasÄ«jis tik tÄlu, parunÄsim par %%physloc%%!
Tagad, kad mÄs zinÄm, ka vÄlÄjÄmies bloÄ·Ät lapu Sales.OrderLines, mÄs varam apskatÄ«t visus datus Å”ajÄ tabulÄ, kas ir saglabÄta datu failÄ Nr. 3 70133. lappusÄ ar Å”Ädu vaicÄjumu:
Use WideWorldImporters;
GO
SELECT
sys.fn_PhysLocFormatter (%%physloc%%),
*
FROM Sales.OrderLines (NOLOCK)
WHERE sys.fn_PhysLocFormatter (%%physloc%%) like '(3:70133%'
GO
KÄ jau teicu, tas ir lÄns pat uz maziem galdiÅiem. PieprasÄ«jumam pievienoju NOLOCK, jo mums joprojÄm nav garantiju, ka dati, kurus vÄlamies apskatÄ«t, ir tieÅ”i tÄdi paÅ”i, kÄdi tie bija slÄdzenes atklÄÅ”anas brÄ«dÄ«, tÄpÄc varam droÅ”i veikt netÄ«rÄs nolasÄ«Å”anas.
Bet, urrÄ, vaicÄjums man atgriež tÄs paÅ”as 25 rindas, par kurÄm cÄ«nÄ«jÄs mÅ«su vaicÄjums.
Pietiek ar PAGE slÄdzenÄm. Ko darÄ«t, ja mÄs gaidÄm KEY slÄdzeni?
2) waitresource="KEY: 6:72057594041991168 (ce52f92a058c)" = Database_Id, HOBT_Id (maÄ£isks jaukums, ko var atÅ”ifrÄt ar %%lockres%%, ja ļoti vÄlaties)
Ja jÅ«su vaicÄjums mÄÄ£ina bloÄ·Ät indeksa ierakstu un tiek bloÄ·Äts pats par sevi, jÅ«s saÅemat pilnÄ«gi cita veida adresi.
Sadalot ā6:72057594041991168 (ce52f92a058c)ā daļÄs, mÄs iegÅ«stam:
datu bÄzes_id = 6
hobt_id = 72057594041991168
burvju hash = (ce52f92a058c)
2.1) AtÅ”ifrÄt datu bÄzes_id
Tas darbojas tieÅ”i tÄpat kÄ iepriekÅ” minÄtajÄ piemÄrÄ! MÄs atrodam datu bÄzes nosaukumu, izmantojot vaicÄjumu:
SELECT
name
FROM sys.databases
WHERE database_id=6;
GO
AtrastÄs datu bÄzes kontekstÄ jums ir jÄvaicÄ sys.partitions ar pÄris savienojumiem, kas palÄ«dzÄs noteikt tabulas un indeksa nosaukumus ...
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
Tas man saka, ka pieprasÄ«jums gaidÄ«ja Application.Countries bloÄ·ÄÅ”anu, izmantojot indeksu PK_Application_Countries.
2.3) Tagad dažas %%lockres%% burvÄ«bas ā ja vÄlaties uzzinÄt, kurÅ” ieraksts tika bloÄ·Äts
Ja tieÅ”Äm gribu zinÄt, kurÄ rindÄ bija vajadzÄ«ga slÄdzene, to varu noskaidrot, vaicÄjot paÅ”u tabulu. MÄs varam izmantot nedokumentÄtu funkciju %%lockres%%, lai atrastu ierakstu, kas atbilst maÄ£iskajam hash.
Å emiet vÄrÄ, ka Å”is vaicÄjums pÄrbaudÄ«s visu tabulu, un lielÄs tabulÄs tas var nebÅ«t jautri:
SELECT
*
FROM Application.Countries (NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO
Es pievienoju NOLOCK (pÄc Klausa AÅ”enbrenera ieteikuma Twitter), jo slÄdzenes var radÄ«t problÄmas. MÄs tikai vÄlamies aplÅ«kot to, kas tur ir tagad, nevis to, kas bija darÄ«juma sÄkumÄ ā es nedomÄju, ka datu konsekvence mums ir svarÄ«ga.
Voila, rekords, par kuru mÄs cÄ«nÄ«jÄmies!
PateicÄ«bas un tÄlÄka lasÄ«Å”ana
Es neatceros, kurÅ” pirmais aprakstÄ«ja daudzas no Ŕīm lietÄm, taÄu Å”eit ir divas ziÅas par vismazÄk dokumentÄtajÄm lietÄm, kas jums varÄtu patikt: