6.10.25

Недокументированная функция sys.fn_PhysLocCracker

Автор: Paul Randal, SQL Server 2008: New (undocumented) physical row locator function

Один из минусов того, что я больше не в команде SQL в Microsoft, — я не знаю обо всех недокументированных возможностях следующего релиза и, как и все, вынужден их выискивать :-(

Итак, ковыряясь в SSMS в 2008 CTP‑6, я заметил функцию под названием sys.fn_PhysLocCracker, о которой никогда не слышал. Выполнив sp_helptext для неё, получил такой вывод:

— Name: sys.fn_PhysLocCracker
—
— Description:
— Cracks the output of %%physloc%% virtual column
—
— Notes:
——————————————————————————-
create function sys.fn_PhysLocCracker (@physical_locator binary (8))
returns @dumploc_table table
(
 [file_id] int not null,
 [page_id] int not null,
 [slot_id] int not null
)
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)))
   
 insert into @dumploc_table values (@file_id, @page_id, @slot_id)
 return
end

Здорово — но есть кое‑что ещё, о чём я не слышал: %%physloc%%. Что это? Поигравшись немного, я разобрался, как это работает. Для полного замешательства есть ещё одна, идентичная, версия функции под именем sys.fn_PhysLocFormatter — и сработала у меня только она. Вот пример:

CREATE TABLE TEST (c1 INT IDENTITY, c2 CHAR (4000) DEFAULT ‘a’);
GO
INSERT INTO TEST DEFAULT VALUES;INSERT INTO TEST DEFAULT VALUES;INSERT INTO TEST DEFAULT VALUES;
GO
SELECT sys.fn_PhysLocFormatter (%%physloc%%) AS [Physical RID], * FROM TEST;
GO
Physical RID       c1
——————  ———–
(1:411:0)          1
(1:411:1)          2
(1:413:0)          3

Это функция физического указателя записи! Недокументированная и не поддерживаемая (очевидно), но, что поделать, некоторые из лучших вещей именно такие :-) Она возвращает номер файла базы данных, страницу в файле и номер слота на странице в формате (file:page:slot). Я уже могу придумать массу применений, которые буду использовать.

Комментариев нет:

Отправить комментарий