์ฐจ๋จ๋ ํ๋ก์ธ์ค ๋ณด๊ณ ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ 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: ํ์ผ ID: ํ์ด์ง ๋ฒํธ
์์ฒญ์ด PAGE ์ ๊ธ์์ ๋๊ธฐ ์ค์ธ ๊ฒฝ์ฐ SQL Server๋ ํด๋น ํ์ด์ง์ ์ฃผ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
"PAGE: 6:3:70133"์ ๋ถํดํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ID = 6
- data_file_id = 3
- ํ์ด์ง ๋ฒํธ = 70133
1.1) database_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์์ ๊ฐ์ฒด ์ด๋ฆ ๊ฐ์ ธ์ค๊ธฐ
์ด์ ๋ฐ์ดํฐ ํ์ผ 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
์ฌ๊ธฐ์์ ์ ๊ธ ๋๊ธฐ๊ฐ Sales.OrderLines ํ ์ด๋ธ์ PK_Sales_OrderLines ์ธ๋ฑ์ค์ ์์์ ์ ์ ์์ต๋๋ค.
์ฐธ๊ณ : SQL Server 2014 ์ด์์์๋ ๋ฌธ์ํ๋์ง ์์ DMO sys.dm_db_database_page_allocations๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ์ด๋ฆ์ ์ฐพ์ ์๋ ์์ต๋๋ค. ํ์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ํ์ด์ง๋ฅผ ์ฟผ๋ฆฌํด์ผ ํ๋๋ฐ ์ด๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํฉํ์ง ์์ DBCC PAGE๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
1.4) ์ฐจ๋จ๋ ํ์ด์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณผ ์ ์๋์?
๋์ฐ, ๋ค. ํ์ง๋ง... ์ ๋ง ํ์ํ๊ฐ์?
์์ ํ
์ด๋ธ์์๋ ๋๋ฆฝ๋๋ค. ํ์ง๋ง ์ข ๋ฉ์ง๋๋ค. ์ฌ๊ธฐ๊น์ง ์ฝ์ผ์
จ์ผ๋... %%physloc%%์ ๋ํด ์ด์ผ๊ธฐํด ๋ด
์๋ค!
%%physloc%%๋ ๊ฐ ํญ๋ชฉ์ ๋ํ ๋ฌผ๋ฆฌ์ ID๋ฅผ ๋ฐํํ๋ ๋ฌธ์ํ๋์ง ์์ ๋ง๋ฒ์
๋๋ค. ๋น์ ์ด ์ฌ์ฉํ ์์๋
์ด์ ์ฐ๋ฆฌ๋ 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) database_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 ์์ธ์ ์ฌ์ฉํ์ฌ Application.Countries ์ ๊ธ์์ ๋๊ธฐ ์ค์์ ์๋ ค์ค๋๋ค.
2.3) ์ด์ ์ผ๋ถ %%lockres%% ๋ง๋ฒ์ ๋ํด - ์ด๋ค ํญ๋ชฉ์ด ์ ๊ฒผ๋์ง ํ์ธํ๋ ค๋ ๊ฒฝ์ฐ
์ ๊ธ์ด ํ์ํ ํ์ ์ ๋ง๋ก ์๊ณ ์ถ๋ค๋ฉด ํ
์ด๋ธ ์์ฒด๋ฅผ ์ฟผ๋ฆฌํ์ฌ ์ฐพ์ ์ ์์ต๋๋ค. ๋ฌธ์ํ๋์ง ์์ %%lockres%% ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์ง ํด์์ ์ผ์นํ๋ ํญ๋ชฉ์ ์ฐพ์ ์ ์์ต๋๋ค.
์ด ์ฟผ๋ฆฌ๋ ์ ์ฒด ํ
์ด๋ธ์ ์ค์บํ๋ฉฐ ํฐ ํ
์ด๋ธ์์๋ ์ ํ ์ฌ๋ฏธ๊ฐ ์์ ์ ์์ต๋๋ค.
SELECT
*
FROM Application.Countries (NOLOCK)
WHERE %%lockres%% = '(ce52f92a058c)';
GO
NOLOCK์ ์ถ๊ฐํ์ต๋๋ค(
Voila, ์ฐ๋ฆฌ๊ฐ ์ธ์ด ๊ธฐ๋ก!
๊ฐ์ฌ์ ๊ธ ๋ฐ ์ถ๊ฐ ์ ๋ณด
๋๊ฐ ์ด๋ฐ ๊ฒ๋ค์ ์ฒ์์ผ๋ก ์ค๋ช ํ๋์ง๋ ๊ธฐ์ต๋์ง ์์ง๋ง, ๋ค์์ ์ฌ๋ฌ๋ถ์ด ์ข์ํ ๋งํ ์ต์ํ์ ๋ฌธ์ํ์ ๋ํ ๋ ๊ฐ์ ๊ฒ์๋ฌผ์ ๋๋ค.
- Paul Randal์ ๊ฒ์๋ฌผ
%%physloc%% ๋ฐ sys.fn_PhysLocFormatter (์ฒซ ๋ฒ์งธ ์์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฏ๋ก) - StackOverflow์ ๋ํ ์ง๋ฌธ
%%lockres%% ์ฌ์ฉ (๋ ๋ฒ์งธ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๊ฒ์ฒ๋ผ). ๋ต๋ณ ์ค ํ๋๋ ๊ฒ์๋ฌผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.2010๋ ์ ์์ฑ๋ %%lockres%%์ ๋ํ Grant Fritchey .
์ถ์ฒ : habr.com