SQL Server/SQL Server Tip

문서화 되지 않은 sys.fn_PhysLocFormatter 함수

SungWookKang 2015. 7. 17. 10:13
반응형

문서화 되지 않은 sys.fn_PhysLocFormatter 함수

 

  • Version : SQL Server 2008, 2008R2, 2012

 

어떠한 이유로 인하여 데이터가 비정상적으로 저장 되었거나 데이터를 select 하였는데 반환된 값이 정상적이지 않을 경우 우리는 DBCC PAGE 명령어를 이용하여 페이지 레벨에서 저장되어 있는 값을 확인 한다. 이 때 실제 SELECT 된 데이터의 상관관계를 확인할 수 있는 방법이 없을까? 문서화 되어 있지는 않지만 sys.fn_PhysLocFormatter를 이용하여 확인 할 수 있다.

 

sys.fn_PhysLocFormatter 함수가 어떤 기능을 하는지 알아 보자.

sp_helptext 'sys.fn_physLocFormatter'

 

Text

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------

-- Name: sys.fn_PhysLocFormatter

--

-- Description:

--    Formats the output of %%physloc%% virtual column

--

-- Notes:

-------------------------------------------------------------------------------

create function sys.fn_PhysLocFormatter (@physical_locator binary (8))

returns varchar (128)

as

begin

 

    declare @page_id    binary (4)

    declare @file_id    binary (2)

    declare @slot_id    binary (2)

 

    -- Page ID is the first four bytes, then 2 bytes of page ID, then 2 bytes of slot

    --

    select @page_id = convert (binary (4), reverse (substring (@physical_locator, 1, 4)))

    select @file_id = convert (binary (2), reverse (substring (@physical_locator, 5, 2)))

    select @slot_id = convert (binary (2), reverse (substring (@physical_locator, 7, 2)))

    

    return '(' + cast (cast (@file_id as int) as varchar) + ':' +

                 cast (cast (@page_id as int) as varchar) + ':' +

                 cast (cast (@slot_id as int) as varchar) + ')'

end

 

 

 

물리적 위치를 확인 하기 위해 다음 함수를 호출하여 TBL_A라는 테이블을 조회 하였다. 다음과 같이 물리적인 주소를 확인 할 수 있다.

SELECT sys.fn_PhysLocFormatter(%%physloc%%) as [Physical RID], *

FROM TBL_A

 

 

[Physical RID]열은 데이터의 물리적인 위치를 나타낸다.

1 : 데이터베이스 파일

55 : 파일 내의 페이지 (테스트하는 사용자 마다 다름)

0 : 슬롯 번호

 

따라서 나의 경우에는 TBL_A의 데이터가 55페이지 및 78페이지에 데이터가 저장된 것을 확인 할 수 있다.

 

DBCC PAGE명령어를 이용하여 데이터 페이지를 확인 할 수 있다.

DBCC TRACEON (3604)

DBCC PAGE(SW_TEST, 1, 55, 1) WITH TABLERESULTS

 

 

 

실제 물리적인 데이터가 저장된 정보를 확인 할 때 매우 유용하게 사용 할 수 있는 기능인 듯 하다.

 

2012-11-22 / 강성욱 / http://sqlmvp.kr

 

반응형