Wednesday, March 19, 2008

One of the drawbacks of not being in the SQL team at Microsoft any longer is that I don't know about all the undocumented features in the next release - I have to hunt around for them like everyone else :-(

So I was poking about in SSMS in 2008 CTP-6 and noticed a function called sys.fn_PhysLocCracker that I'd never heard of. Doing an sp_helptext on it gets the following output:

-- 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

Cool - but something else I've never heard of %%physloc%% - what's that? After playing around for a while, I figured out how to make it work.  Just to be confusing, there's another identical version of the function called sys.fn_PhysLocFormatter - and that's the only one I could get to work. Here's an example:

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

It's a physical-record locator function! Undocumented and unsupported (obviously), but hey, some of the best features are :-) It gives the database file, page within the file, and slot number on the page in the format (file:page:slot). I can think of a *bunch* of uses for this which I'll be exploring over the next few months.

How cool is that?!?!

Wednesday, March 19, 2008 4:25:13 PM (Pacific Standard Time, UTC-08:00)  #    Comments [6]  | 
Thursday, March 20, 2008 5:27:12 AM (Pacific Standard Time, UTC-08:00)
Very coll, its can be very useful.

Thanks for Support! :-)
Thursday, March 20, 2008 12:37:44 PM (Pacific Standard Time, UTC-08:00)
Very cool, yet the possibility for misuse scares the *** out of me... I -almost- wish you hadn't blogged it (but on the flip side, it certainly is useful -- so thanks!)
Sunday, March 30, 2008 5:33:26 AM (Pacific Standard Time, UTC-08:00)
In your page in "Create Function" you said "create function sys.fn_PhysLocCracker (@physical_locator binary (8))"
In SQL you said SELECT sys.fn_PhysLocFormatter (%%physloc%%) AS [Physical RID], * FROM TEST;


sys.fn_PhysLocCracker
sys.fn_PhysLocFormatter

Is it Cracker or Formatter?
Prasanna
Sunday, March 30, 2008 5:48:15 AM (Pacific Standard Time, UTC-08:00)
Actually both of these exist but the only one I could get to work is sys.fn_PhysLocFormatter. I've put a comment in the post to that effect.

Thanks!
Friday, August 22, 2008 3:45:43 PM (Pacific Standard Time, UTC-08:00)
Is there a similar function for Sql Server 2005 ?
Gjorgji
Friday, August 22, 2008 4:24:16 PM (Pacific Standard Time, UTC-08:00)
No - there's nothing similar for 2005
Paul Randal
Name
E-mail
Home page

Comment (Some html is allowed: a@href@title, strike) where the @ means "attribute." For example, you can use <a href="" title=""> or <blockquote cite="Scott">.  

Enter the code shown (prevents robots):

Live Comment Preview

Theme design by Jelle Druyts

Pick a theme: