IBM Support

[Db2] 一時表を使用している SQL やコマンドを特定する方法

Question & Answer


Question

一時表を大量に使用している SQL やコマンドを特定する良い方法はありますか。

Answer

スナップショット・モニター SQL 管理ビューを利用することで、一時表を大量に使用する SQL およびコマンドを一覧表示できます。
注:Db2 10.5 以降を使用している場合は以下のページを参照してください。
下記サンプル SQL を参考にしてください。

■ 一時表の使用状況確認用サンプル SQL
下記の SQL は、DDL/DML 以外に LOAD および REORG が使用する一時表の情報を出力します。

 mon_tmptbl.sql97
SELECT
 T3.*,
 SUBSTR(T10.STMT_TEXT,1,256) SUB_STMT_TEXT
FROM
(
 SELECT
  AGENT_ID,
  TBSP_ID,
  SUM(DATA_OBJECT_PAGES) TOTAL_TEMP_PAGES
 FROM
  SYSIBMADM.SNAPSTMT T1,
  SYSIBMADM.SNAPTAB T2
 WHERE
  SUBSTR(T2.TABSCHEMA,1,INSTR(T2.TABSCHEMA,'><')) = '<' || T1.AGENT_ID || '>'
 GROUP BY
  AGENT_ID, TBSP_ID
) T3
JOIN
(
SELECT
 AGENT_ID,
 STMT_TEXT
FROM
(
 SELECT
  APPLICATION_HANDLE AGENT_ID,
  STMT_TEXT
 FROM
  SYSIBMADM.MON_CURRENT_SQL T4
 )
 UNION ALL
 (
 SELECT
  AGENT_ID,
  UTILITY_DESCRIPTION --STMT_TEXT
 FROM
 (
  SELECT
   T6.AGENT_ID,
   TABNAME
  FROM
   SYSIBMADM.SNAPAPPL_INFO T5,
   SYSIBMADM.SNAPLOCK T6
  WHERE
   APPL_STATUS = 'LOAD' AND
   T5.AGENT_ID = T6.AGENT_ID
  ) T7
  JOIN
   SYSIBMADM.SNAPUTIL T8
  ON
   T8.UTILITY_DESCRIPTION LIKE '%' || T7.TABNAME
  )
  UNION ALL
  (
   SELECT
    T9.AGENT_ID,
    STMT_OPERATION
   FROM
    SYSIBMADM.SNAPSTMT T9
   WHERE
    T9.STMT_OPERATION = 'REORG'
  )
 ) T10
ON
T3.AGENT_ID = T10.AGENT_ID;



■ 出力例
$ db2 -tf mon_tmptbl.sql97

AGENT_ID TBSP_ID TOTAL_TEMP_PAGES SUB_STMT_TEXT
-------- ------- ---------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    2683       1             8877 with t(c) as (values(1) union all select c+1 from t where c < 1000000), t2(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10) as (select bigint(rand()*1000000000),1,1,1,1,1,1,1,1,1 from t) select * from t2,t2 t3 order by t2.c1
    2477       1              584 OFFLINE LOAD DEL AUTOMATIC INDEXING INSERT NON-RECOVERABLE DB2INST1.TBL01                                                                                                                                

  2 レコードが選択されました。

上記 SQL では、 SUM(DATA_OBJECT_PAGES) により、一時表のサイズを AGENT_ID ごとにまとめ、 TOTAL_TEMP_PAGES として出力しています。
また、STMT_TEXT は見やすくするため、 出力を 256 文字に制限したものを SUB_STMT_TEXT として出力しています。
■ 解説
一時表のスキーマ名は、"<agent_id><auth_id>" の形式をとるため、これを元に一時表を使用するアプリケーションとの突合せが可能です。
  • agent_id は、一時表を作成しているアプリケーションのアプリケーション・ハンドルです。
  • auth_id は、 アプリケーションがデータベースに接続するときに使用する許可 ID です。

また一時表の名前は "TEMP (n, m)" の形式をとります。
  • n は表スペース ID です。
  • m は table_file_id モニター・エレメントです。

db2pd コマンドで確認した例を以下に示します (表のスキーマ名は8文字で途切れています)。
ここでは、アプリケーション・ハンドル「7」、許可 ID 「DB2INST1」の一部が SchemaNm に出力されています。

例)
>db2pd -db sample -tcb

Database Partition 0 -- Database SAMPLE -- Active -- Up 0 days 01:54:25 -- Date 08/14/2012 17:38:59

TCB Table Information:
Address            TbspaceID TableID PartID MasterTbs MasterTab TableName          SchemaNm ObjClass DataSize LfSize LobSize XMLSize
0x07000000490CF958 0         1       n/a    0         1         SYSBOOT            SYSIBM   Perm     1        0      0       0
0x0700000049271ED8 2         -1      n/a    2         -1        INTERNAL           SYSIBM   Perm     1        0      0       0
0x070000004929B458 0         5       n/a    0         5         SYSTABLES          SYSIBM   Perm     29       0      

                     -省略-

0x0700000049236658 0         142     n/a    0         142       SYSVARIABLES       SYSIBM   Perm     4        0      32      0
0x07000000492382D8 0         159     n/a    0         159       SYSMODULES         SYSIBM   Perm     1        0      1       0
0x07000000491CF758 0         -1      n/a    0         -1        INTERNAL           SYSIBM   Perm     3        0      0       0
0x070000004929EED8 3         -1      n/a    3         -1        INTERNAL           SYSIBM   Perm     1        0      0       0
0x07000000492A4758 1         2       n/a    1         2         TEMP (00001,00002) <7><DB2I Temp     1849     0      0       0
0x07000000492A50D8 1         3       n/a    1         3         TEMP (00001,00003) <7><DB2I Temp     2342     0      0       0
0x07000000492A5A58 1         4       n/a    1         4         TEMP (00001,00004) <7><DB2I Temp     2342     0      0       0
0x070000004923B1D8 1         6       n/a    1         6         TEMP (00001,00006) <7><DB2I Temp     2344     0      0       0

                     -省略-
表名の一覧およびアプリケーションと実行中の SQL に関する情報は、各種モニター・ツールより入手可能です。


運用上の考慮点
  • 自動的に生成される一時表とは異なり、ユーザーが宣言した一時表 (※) の場合は、上記サンプル SQL では、アプリケーションおよび SQL を特定できません。
    一時表を宣言する DECLARE GLOBAL TEMPORARY TABLE 文は、ダイナミック SQL スナップショット (コマンド: db2 get dynamic sql for <dbname>)、または db2pd の DynamicCache (コマンド: db2pd -db <dbname> -dynamic) の出力から確認してください。
    ※ ユーザーが宣言した一時表は、表スナップショットで表タイプが "一時表" あるいは "Temporary" のもの、または db2pd の TCB Table Information 出力で ObjClass が "Temp" の表で、表名が "TEMP (n, m)" の命名規則に従わないものです。

関連情報
table_name - 表名 : モニター・エレメント
table_schema - 表スキーマ名 : モニター・エレメント
SNAPSTMT 管理ビューおよび SNAP_GET_STMT 表関数 - ステートメント・スナップショット情報の検索
SNAPTAB 管理ビューおよび SNAP_GET_TAB 表関数 - table 論理データ・グループのスナップショット情報の検索
SNAPAPPL_INFO 管理ビューおよび SNAP_GET_APPL_INFO 表関数 - appl_info 論理データ・グループのスナップショット情報の検索
SNAPLOCK 管理ビューおよび SNAP_GET_LOCK 表関数 - lock 論理データ・グループのスナップショット情報の検索
SNAPUTIL 管理ビューおよび SNAP_GET_UTIL 表関数 - utility_info 論理データ・グループ・スナップショット情報の検索
 
 
お問合せ先
技術的な内容に関して、パスポート・アドバンテージの契約のもと Db2 テクニカル・サポートへお問い合わせください。
Db2 テクニカル・サポート

[{"Type":"MASTER","Line of Business":{"code":"LOB10","label":"Data and AI"},"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SSEPGG","label":"Db2 for Linux, UNIX and Windows"},"ARM Category":[{"code":"a8m500000008PlYAAU","label":"Database Objects-\u003ETables"}],"ARM Case Number":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"10.1.0;9.5.0;9.7.0"}]

Document Information

Modified date:
31 August 2023

UID

swg21649023