SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

DBCC PAGE でストアドプロシージャを見てみる

leave a comment

今日は趣向を変えて DBCC PAGE でストアドプロシージャを見てみたいと思います。
# あまり趣向変わってないのではという突っ込みは全力でスルーします。

■DBCC PAGE でストアドプロシージャを表示


ストアドプロシージャは sp_helptext で中身を表示することが可能です。

sp_helptext の内容を sp_helptext で表示するクエリだと以下の形式になります。

sp_helptext ‘sp_helptext’

これと似たようなことを DBCC PAGE で実行してみようというのが本日のお題です。

ストアドプロシージャも SQL Server のデータですので、データページ / インデックスページ等と同じようにページに格納がされます。

テストで以下のクエリを実行してストアドを作ってみます。

CREATE PROCEDURE usp_pagetest
AS
BEGIN
    SET NOCOUNT ON;
    SELECT @@version
END
GO

この時のトランザクションログの内容がこちらになります。
image

ストアドを作成するためのクエリを実行しているのですが、[LOP_INSERT_ROWS] という操作がいくつか現れています。
INSERT_ROWS と出ているようにストアドもページに格納されます。

今回であれば、[0001:00000080] というページに格納されています。

ということで DBCC PAGE を使ってみてみたいと思います。
トランザクションログの [Page ID] は 16 進数で表示されていますので、ページ番号は 10 進数に直す必要があります。

DBCC TRACEON(3604)
DBCC PAGE(N’TEST’, 1, 128, 1)
DBCC TRACEOFF(3604)

実行結果がこちら。
image

先ほど作成したストアドと同じものがページに格納されているのが確認できますね。

ちなみにほかに  [LOP_INSERT_ROWS] となっていたものですが以下のテーブルになります。

Page ID Object Name
0001:000000a1 sysschobjs
0001:00000108 sysschobjs
0001:00000156 sysschobjs
0001:000000b6 sysschobjs

すべて、[sysschobjs] になるようですね。
さらに踏み込んでみるためにこのテーブルのデータを確認してみたいと思います。
[sysschobjs] ですが、通常の接続では内容を確認することができません。
このテーブルを検索するためには DAC で接続をする必要があります。

ということで、サーバー名に [ADMIN:] をつけて接続をして検索します。
image

SELECT
    sys.fn_PhysLocFormatter(%%physloc%%)
    ,*
FROM
    sys.sysschobjs
WHERE
    (sys.fn_PhysLocFormatter(%%physloc%%) LIKE ‘(1:161:%’
    OR
    sys.fn_PhysLocFormatter(%%physloc%%) LIKE ‘(1:264:%’
    OR
    sys.fn_PhysLocFormatter(%%physloc%%) LIKE ‘(1:342:%’
    OR
    sys.fn_PhysLocFormatter(%%physloc%%) LIKE ‘(1:182:%’)
    AND
    created >= ‘2011-04-14 23:00:00’

 

161 ページ以外がデータページではないようで、取得できたのは以下の行だけでした。
# 他のページは [INDEX_RECORD] が格納されているページのようです。
image

ログからページを割り出しているのであまりスマートではないのですが、DBCC PAGE でもストアドを見ることができることを実験してみました。

Share

Written by Masayuki.Ozawa

4月 14th, 2011 at 11:36 pm

Posted in SQL Server

Tagged with

Leave a Reply