SYSCS_DIAG 診断表および関数

Derbyにはシステム表式が用意されており、データベースの状態やデータベースへの接続の診断情報を取得できます。

Derbyには二種類の診断表式があります。
診断表
Derbyの一般的な表と同様なものです。 表名を置くことができる場所ならどこにでも診断表の名前をおけます。
診断表関数
Derbyの一般的な関数と同様なものです。診断表関数には関数に応じて、0あるいはそれ以上の引数を取ることができます。SQLに定義された表関数の構文に基づき、これらの関数を使う必要があります。

以下の表にはDerbyの診断表式の名称と種類を記します。

表 1. Derbyのシステム診断表式
診断表式 式の種類
SYSCS_DIAG.ERROR_LOG_READER 表関数
SYSCS_DIAG.ERROR_MESSAGES
SYSCS_DIAG.LOCK_TABLE
SYSCS_DIAG.SPACE_TABLE 表関数
SYSCS_DIAG.STATEMENT_CACHE
SYSCS_DIAG.STATEMENT_DURATION 表関数
SYSCS_DIAG.TRANSACTION_TABLE
制約事項: DDLや圧縮の手続きにて診断表を参照した場合、Derbyは例外を返します。

SYSCS_DIAG.ERROR_LOG_READER 診断表関数

SYSCS_DIAG.ERROR_LOG_READER診断表関数からは、derby.logファイルや指定した任意のログファイルにある全てのSQL文が得られます。

この診断表関数を使うことで、活動中のトランザクションおよび任意の時点のトランザクションを知ることができます。たとえばデッドロックやロックの時間切れが発生した場合、エラーログからタイムスタンプ(timestampConstant)を見つけることができます。

SYSCS_DIAG.ERROR_LOG_READER診断表関数を使うには、SQL表関数の構文に基づく必要があります。

例を挙げます。:
SELECT * 
    FROM TABLE (SYSCS_DIAG.ERROR_LOG_READER()) 
    AS T1
ここでT1はユーザが指定した表の名前で、これは任意の識別子です。

SYSCS_DIAG.ERROR_LOG_READER診断表関数には、随意で指定する引数としてログファイルの名前を与えることができます。ログファイルの名前を指定する場合、ファイル名はJavaで文字列とみなせる式でなければなりません。

For example:
SELECT * 
    FROM TABLE (SYSCS_DIAG.ERROR_LOG_READER('myderbyerrors.log')) 
    AS T1
ヒント: 既定ではDerbyのログファイルには起動、終了、エラーメッセージしかありません。 より詳細な情報をDerbyのログファイルに出力する方法は、Derbyのチューニングガイドderby.stream.error.logSeverityLevel属性と、derby.language.logStatementText属性を読んでください。

SYSCS_DIAG.ERROR_MESSAGES 診断表

SYSCS_DIAG.ERROR_MESSAGES診断表には、全てのSQLState、地域に対応したエラーメッセージ、 Derbyデータベースでの例外深刻度が記述されます。 文にて直接にSYSCS_DIAG.ERROR_MESSAGES診断表を参照することができます。

例を挙げます。
SELECT * FROM SYSCS_DIAG.ERROR_MESSAGES

SYSCS_DIAG.LOCK_TABLE 診断表

SYSCS_DIAG.LOCK_TABLE診断表には、現在時点のDerbyデータベースの全ロックが記述されます。 SYSCS_DIAG.LOCK_TABLE診断表は文にて直接参照することができます。

例を挙げます。
SELECT * FROM SYSCS_DIAG.LOCK_TABLE

SYSCS_DIAG.LOCK_TABLE診断表が文にて参照される場合、表のロックのスナップショットが撮られます。 このスナップショットは診断表を参照しても、アプリケーションの通常処理時間や処理の流れに影響が出ないように用意されるものです。 このスナップショットが撮られる時、ロックが状態遷移中である可能性があります。

SYSCS_DIAG.SPACE_TABLE 診断表関数

SYSCS_DIAG.SPACE_TABLE診断表関数では、指定した表とその索引が利用している領域を表示できます。 この診断表関数により表や索引を圧縮することで、どれだけ領域を節約できるか知ることができます。

SYSCS_DIAG.SPACE_TABLE診断表関数を使うには、SQL表関数の構文に従う必要があります。 この診断表関数は二つの引数をとります。スキーマ名表名です。 表名は必須です。スキーマ名を指定しなかった場合、現在のスキーマが適用されます。

たとえば以下の問い合わせでは、データベースにある全ユーザ表と索引の利用する領域を返します。
SELECT T2.*
    FROM 
        SYS.SYSTABLES systabs,
        TABLE (SYSCS_DIAG.SPACE_TABLE(systabs.tablename)) AS T2
    WHERE systabs.tabletype = 'T'
ここでT2はユーザ指定の表名で、任意の識別子を指定できます。

スキーマ名表名は、何れもJavaの文字列型とみなされる式でなければなりません。 スキーマ名表名がデリミトされない識別子であった場合、名前は大文字で指定しなければなりません。

例を挙げます。
SELECT * 
    FROM TABLE (SYSCS_DIAG.SPACE_TABLE('MYSCHEMA', 'MYTABLE')) 
    AS T2

SYSCS_DIAG.STATEMENT_CACHE 診断表

SYSCS_DIAG.STATEMENT_CACHE診断表にはSQL文キャッシュの内容が記述されます。 SYSCS_DIAG.STATEMENT_CACHE診断表は文から直接参照できます。

例を挙げます。
SELECT * FROM SYSCS_DIAG.STATEMENT_CACHE

SYSCS_DIAG.STATEMENT_DURATION 診断表関数

SYSCS_DIAG.STATEMENT_DURATION診断表関数を使って、derby.logファイルや指定したログファイルにあるSQL文の実行時間を知ることができます。

この診断関数を使うことで、アプリケーションのJDBCコードのどこにボトルネックがあるかの、手がかりを得ることができます。

SYSCS_DIAG.STATEMENT_DURATION診断表関数を使うには、SQLの表関数構文に基づく必要があります。

例を挙げます。
SELECT * 
    FROM TABLE (SYSCS_DIAG.STATEMENT_DURATION()) 
    AS T1
ここでT1はユーザが指定した表名で、任意の識別子を指定できます。
制約事項: この表では、個々のトランザクションIDにおける最後の文毎に、行が対応していません。トランザクションによる情報の変更があった場合、トランザクションIDはコミットやロールバンクの前後で値が変わります。

SYSCS_DIAG.STATEMENT_DURATION診断表関数には随意の引数としてログファイルを指定できます。 ログファイル名を指定した場合、ファイル名はJavaの文字列とみなせる式でなければなりません。

例を挙げます。
SELECT * 
    FROM TABLE (SYSCS_DIAG.STATEMENT_DURATION('somederby.log')) 
    AS T1
ヒント: 既定ではDerbyのログファイルには起動、終了、エラーメッセージだけが出力されます。 より詳細な情報をDerbyのログファイルに出力する方法は、Derbyのチューニングガイドderby.stream.error.logSeverityLevel属性と、derby.language.logStatementText属性を読んでください。 それ以外の情報もあれば、SYSCS_DIAG.STATEMENT_DURATION診断表関数で問い合わせ可能です。

SYSCS_DIAG.TRANSACTION_TABLE 診断表

SYSCS_DIAG.TRANSACTION_TABLE診断表には現在データベースに存在する全トランザクションが記述されます。SYSCS_DIAG.TRANSACTION_TABLE診断表は文から直接参照できます。

例を挙げます。
SELECT * FROM SYSCS_DIAG.TRANSACTION_TABLE

文にてSYSCS_DIAG.TRANSACTION_TABLE診断表が参照されると、トランザクション表のスナップショットが撮られます。スナップショットは診断表を参照しても、アプリケーションの通常処理時間や処理の流れに影響が出ないよう用意されます。トランザクションはスナップショットの作成時に状態遷移中である場合もあります。