パーソナルツール
現在の場所: ホーム ブログ Categories DB2
« 2018January »
Su Mo Tu We Th Fr Sa
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
このBlogについて
 代表の向井田ことMUKAです。当ブログサイトでは、MAGICやDB2に関する技術者向け情報を公開しています。お気軽にお立ち寄り下さい。
最近のエントリ
twitter / 新RT機能を英語モードで・・・ muka 2009年11月19日
twitter / List Widget muka 2009年11月03日
twitter API / Retweet の仕様が・・・ muka 2009年10月30日
twitter API / Lists muka 2009年10月24日
IBM Rational Software Conference 2009 と アジャイル開発 muka 2009年10月08日
twitter API / geoタグ! muka 2009年10月01日
Twitter Developers Meetup in Tokyo muka 2009年09月11日
Club DB2 2009/9/4 muka 2009年09月05日
最近のコメント
Re:Club DB2 2009/8/29 muka 2009年09月01日
Re:Club DB2 2009/8/29 SIM 2009年08月31日
最近のトラックバック
Club DB2 8/29の感想エントリと今後の予定 Unofficial DB2 BLOG 2009年09月01日
カテゴリ
misc (47)
dbMAGIC (47)
DB2 (47)
mail (47)
Web (47)
twitter (47)
 

DB2

一つ上に移動
IBMのハイブリッドデータベースDB2 9(デービー・ツー・ナイン)に関するもの

DB2のLockを捕まえる・・・(2)


 前回は、db2pdの簡単なご紹介をさせて頂きました。
 今回は、そのもう少し高度な使い方や、作成したツールについてご紹介致します。




db2pdの高度な機能


 db2pdのオプションは種類が多いのが特長です。ざっと数えても40種近くあります。
 それらを分類すると、インスタンスに関連する情報をレポートするものと、データベースに関する情報をレポートするものの、2系統があるようです。
  • インスタンスに関連する情報をレポートするオプション
    インスタンスのエージェント、メモリ、データベース構成に関する情報を取得
  • データベースに関連する情報をレポートするオプション
    データベース毎のアプリケーション、トランザクション、バッファプール、ロック、表スペース、SQLステートメント等に関する情報を取得
すぐに全部をマスターするのは大変ですが、必要に応じて使いながら徐々に理解を深めていっては如何でしょうか?

 さて、先のIBMさんのドキュメントには、db2pdの使用例として、ロック待機の特定、デッドロックの調査の例が記載されています。実は今回のテーマ、きっかけは「この手順をもっと自動化しては・・・」ということから始まっています...。
 まず、次のようにしてロックの一覧を取得します。
db2pd -db データベース名 -locks

 実際にロックがない場合は出力されませんので注意!

次に、トランザクション、アプリケーション、動的SQLを取得します。
db2pd -db データベース名 -transactions -applications -dynamic

 上記のように複数のオプションを一括して指定が可能です。

下の図は、出力されたテキストを加工して主要な部分のみを抜きだしたものですが、Locks → Transactions → Applications → Dynamic SQL Statements とたどっていくことによって、ロックが起きているアプリケーションとそのクエリを確認することができることを示したものです。

v092_26.jpg

結果のダイジェスト。複数のテーブルを関連付けるとステートメントを求めることができる・・・。


 参考までに上図の元になったテキストファイルを掲載しておきます。

 結構、「暗号解読」みたいな手順が必要ですが、そのあたりもこのdb2pdの楽しさみたいなものかも知れませんw



ロック監視用ツールの作成


 ということで、DBMSのロックをdb2pdを使用して捕まえることができることがわかりました。しかし、コマンド操作に慣れていない場合や、複数の表の連結を人の目で行うにはちょっと難儀することがお分かり頂けるかと思います。そこで、db2pdの実行を自動化し、監視実行ボタンを押すだけで簡単にロックを捕獲できるようなツールを作成してみました。
 コマンドラインで実行した場合と比べてみたとき、次のような問題点を解決しています。

  • 自動監視と情報取得を連動
     db2pd 自体にも「-repeat」オプションがあります。これを使用することによって連続的に情報の取得が可能です。しかし結果をファイルに出力した場合、累積的にファイルに書き出されるので、取得時間が長くなると後の処理が大変です。
     当ツールでは、ロック検出と詳細情報取得の処理を分離することによって、ロックの検出があったときのみ情報を取得するようにしています。
     起動後、画面上にある「db2pdの実行」ボタンを押すと監視状態になります。

    v092_08.jpg

    起動画面。前回のdb2pd出力結果があればそれを表示します・・・。


     ロックを検出すると、直ちにトランザクション、アプリケーション、動的SQLの情報を取得(先に示したコマンドとほぼ同等のものを実行)します。

    v092_09.jpg

    ロックを検出すると自動ループが止まります。確認ボタンを押すと結果表示へ・・・。


  • テーブルを自動作成・自動連結
     取得したロック、トランザクション、アプリケーション、動的SQLの情報をワーク用のテーブルに読み込みます。カラムに納めるべき情報を識別して読み込みますので、ステートメント等は折り返していても連結して処理します。また、Ver 9.7用のdb2pdの出力結果は一部カラムが増えたり、長さが変わったりしていますが、9.5の書式と9.7の書式を自動判別してこれを処理しています。

    v092_10.jpg

    ロック検出結果画面。ロックに関連付けられたステートメントは自動的に表示します。


     動的SQLに関しては、別個に記載されている「Dynamic SQL Statements:」、「Dynamic SQL Environments」、「Dynamic SQL Variations」を連結して同じ行に表示します。見易くなりますね!

    v092_31.jpg

    SQLステートメントに関する3つの表は一つに連結されて表示します。

  • ロックに関する情報の絞り込み
     ロックの「TranHdl」(トランザクションハンドル)別に、関連するトランザクション、アプリケーション、ステートメントをそれぞれ自動表示します。基本はテキストを解読したのと同じですが、探す手間を省いてくれます。

    v092_27.jpg

    先のステートメントを求めた手順がロジック化されているので、ステートメントがすぐに・・・


     必要に応じて、取得したテーブルの全ての行を表示することも可能です。

    v092_28.jpg

    取得した表は個別に参照も可能です。各テーブルのコンテキストメニュー(マウス右ボタンのメニュー)から起動します。


  • カラムの意味をツールチップで表示
     カラムの意味をツールチップで表示しますので、普段db2pdに馴染まない方でもすぐに利用が可能です。

    v092_29.jpg

    項目にマウスを近づけると、ツールチップに意味を表示します。


  • 除外するロックを指定し、他のロックを取得
     一度読みこんだロックは除外することが可能です。継続して他のロックを検出させることが可能です。

    v092_30.jpg

    「除外」チェックボックスにチェックを入れて、他のロックを続けて検出・・・



終わりに


 このブログエントリの公開と前後して、「MAGIC Decrypter for V10 Version 0.92」を公開させて頂きました。すでにダウンロードされた方もいらっしゃるかもしれませんが、今回ご紹介したプログラムはその評価版の中に組み込んであります。
 この記事をお読み頂いて、使ってみようかな?と思われた方は是非お気軽に・・・。
 MAGICをお使いでない方も、もしかしたら、あらこんなものが(割と)簡単に組み込めるのか・・・と思って下されば幸いです(DB2もMAGICももっと普及して欲しいと思っておりますので・・・!)。

 今回は、短い連載となりました。が、db2pdは研究してみると更に新しい発見があるかも知れません。
 そのあたりもぜひ続編として掲載できればと思っています...。

<追記>
 早速お使い頂いている方から質問がありました。うまくロックを取得してくれないと・・・。
 db2pd はリモートサーバに対しては結果を取得することができません。なぜならローカル・メモリの内容を解析するからです。ということで、ご注意下さい。



DB2のLockを捕まえる・・・(1) DB2のLockを捕まえる・・・(1)
サイズ 8539 - File type text/html
カテゴリ
dbMAGIC
DB2

Club DB2 2009/8/7

 昨日もクラブDB2に参加させて頂きました。
 今回は、「DB2 9.7 DWH系新機能の紹介」と表題にあるように、新ネタの話題でとても興味深かったです。

  • 索引圧縮機能
  • スキャンシェアリング
  • LOBデータのINLINE格納
  • パーティション索引

 特に盛り上がったというか、質問やら所感みたいなものが飛び交ったのが「索引圧縮機能」。
 公開されたテストでは、下記のような検証結果について報告されました。
  • カーディナリティの値で圧縮傾向は異なるか・・・
  • カーディナリティの異なるカラムの複合索引で組み合わせ順は影響するか・・・
  • カラムタイプで圧縮の期待できるものはどういうタイプか・・・
  • 表圧縮と索引圧縮によって、どれくらいのパフォーマンスの効果があるか・・・
結論的に言えば、「『設計上としてはあまり推奨できない傾向にある索引?』のほうが圧縮効果が高い・・・」ということ。このあたりの「ちょっと微妙な結果」が盛り上がった原因にあったのかと推測します。
 「正しい設計をするに越したことはないけど、微妙な設計をしても、それなりにDBMSはカバーしてくれる(かもしれない・・・)」ということですネw

 スキャンシェアリングでは、それを無効にするための非公開のスイッチがあるとのことでした。(参加者に配布された資料には誤って記載されていた・・・)
 このスキャンシェアリングは、「多重度が高く表スキャンするような処理があっても処理が遅くならない」という機能です。単独のクエリが実行される場合は、スイッチのON/OFFに関係なく同じ程度の負荷がかかるとのこと。
 「使ってはいけないスイッチがある機能は、完成度の高い機能である」という格言?があるそうです(某I社社員談)。

 ということで簡単ですが、様子のご報告を・・・。
 こういう新機能紹介はとても有難いですね。いつもながらスタッフの皆さん有難うございました!



カテゴリ
misc
DB2

DB2 V9.7のOracle互換機能(NUMBER)

今回は、DB2 Ver 9.7で追加された機能の一部を検証してみましたので、結果をご報告致します。


某二次会で・・・

 この前のClub DB2の二次会ネタなのですが、DB2 9.7のOracle互換性の件が話題になりました。

私:「ねぇ、新しいDB2ではORACLEのNUMBERがサポートされるようになったじゃない?」
A:「そうだね...」
私:「Create TableでNUMBERを指定して表を作り、db2lookでカラムの属性見たら
   どうなるんだろう?」
A:「そうだね。桁数によって、INTEGERとかBIGINTとかFLOATみたいに変わるの
   かなぁ?」
私:「えぇっ、誰も知らないのかなぁ・・・?」
A:「Express-Cだと試せないじゃん。誰だろう製品版持ってるのは・・・?」

 結局9.7のExpress-C版でないバージョンを持っている人がその場にいなかったので、「お前が試せ!」と言うことになりました。(--;
 ということで、夏休みの宿題を、これからやってみます・・・。


互換機能の設定は・・・

 まず、互換性の設定については、SIMさんのブログで公開されていますので、そちらを参考にして下さい。

DB2 9.7小ネタ - Oracleとの互換性を最大にする設定

 ちなみに、このエントリーで私は別件で質問をコメントしたのですが、SIMさんからの返信が無いので、私に会う人の何人かが、「どうして回答が無いのかなぁ」なんて聞かれてしまったのですが、個人的にSIMさんからはTwitterで回答をもらっていました。
 証拠といってはなんですが、それを、私のIDのファブリンク(twitterの機能)に入れておきました。

 ※ きっとそのうち新たな回答(「こうすればできるみたいよ」みたいな・・・)が来るのではないかと期待しています。(^^)


表を作成する・・・


 データベースが作成されたら表を作ってみましょう。
 コントロールセンターのウィザードで生成されたSQLを編集してみても良いでしょう。
 変な表ですが、テストなので・・・

CREATE TABLE DB2ADMIN.ORA_TEST_1 (
     ID NUMBER(4) NOT NULL
 , NUM1 NUMBER(9)
 , NUM2 NUMBER(10)
 , NUM3 NUMBER(5,3)
 , CONSTRAINT ID PRIMARY KEY (ID)) ;

 成功すると次のような画面になります。

db2_97_01.gif

 ちなみに、失敗したときは、次のようなメッセージが出ます。

SQL0204N  "NUMBER" は未定義の名前です。  SQLSTATE=42704

 レジストリ変数を変更した後、インスタンスの再起動が必要なのですが、それを忘れてしまうと同じようなメッセージが出ると思います。 


db2lookを実行する・・・


 さて、今回の結論を確かめるために「db2look」を実行します。
 コントロールセンターを実行していれば、表をマウス右ボタンでクリックして「DDLの生成」を実行します。
 オプションの指定ですが、「データベース・オブジェクト」だけチェックしても目的は達成されます。実行されるコマンドは次のものです。

db2look -d ORA_TEST -t  "ORA_TEST_1"  -a -e  -l  -x  -c ;

 さて、結果ですが、次のようになりました。

db2_97_02.gif


-- この CLP ファイルの作成に使用した DB2LOOK のバージョン: "9.7" 
-- タイム・スタンプ: 2009/08/18 21:17:46
-- データベース名: ORA_TEST      
-- データベース・マネージャーのバージョン: DB2/NT Version 9.7.0         
-- データベース・コード・ページ: 943
-- データベース照合シーケンス: UNIQUE
CONNECT TO ORA_TEST;

------------------------------------------------
-- 表の DDL ステートメント "DB2ADMIN"."ORA_TEST_1"
------------------------------------------------
CREATE TABLE "DB2ADMIN"."ORA_TEST_1"  (
          "ID" DECIMAL(4,0) NOT NULL ,
          "NUM1" DECIMAL(9,0) ,
          "NUM2" DECIMAL(10,0) ,
          "NUM3" DECIMAL(5,3) )  
         IN "USERSPACE1" ;

-- 表の主キーの DDL ステートメント "DB2ADMIN"."ORA_TEST_1"
ALTER TABLE "DB2ADMIN"."ORA_TEST_1"
    ADD CONSTRAINT "ID" PRIMARY KEY
        ("ID");
COMMIT WORK;
CONNECT RESET;
TERMINATE;
-- すべての作成者に統計を生成します
-- db2look ユーティリティーは指定された表のみ考慮します
-- 表の DDL の作成


「桁溢れ」を起こしてみる・・・


 「もしかしたらエラーコードも変わるんじゃないの?」って話になりましたので(をい!)、実際に桁あふれを起こしてエラーメッセージを確かめてみました。

UPDATE DB2ADMIN.ORA_TEST_1 SET NUM1 = 1234567890 WHERE ID = 1
DB21034E  コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、そのコマンドが返されました。
SQL0413N  数値データ・タイプの変換中にオーバーフローが発生しました。
SQLSTATE=22003

 どうやら、変わりないようです。

 「へぇ、へぇ、へぇ・・・」(^^;


まとめ


 今回の検証結果から見ると、整数、小数、桁の大きい数など、数値については全て「NUMBER」タイプは、「DECIMAL」タイプに置き換えられて保持されるようです。
 正直言って、表の設計において「DECIMAL」タイプを使ったことはあまり無いんですね。ですから、その良し悪しについてまでは言及できませんが、どうなのでしょうか?
 関連する内容について、まとめておきたいと思います。

  • DB2 V9.7では、様々なOracle互換機能が追加されている
  • DB2 V9.7のOracle互換機能を使うためには、db2setコマンドを使い、システム変数「DB2_COMPATIBILITY_VECTOR」を設定する。
    (フル互換にするなら、「DB2_COMPATIBILITY_VECTOR=ORA」を設定)
  • 機能を有効にするには、インスタンスの再起動が必要
  • CREATE DATABASE コマンドを実行したときのレジストリ変数の値によって、互換性有無(度合)が決定される
  • しかし、どういう互換性でCREATE DATABESE が実行されたかを知る術は無い...
    (もしくは非公開・・・?)
  • CREATE TABLE コマンドで、NUMBERタイプがサポートされた
  • NUMBERで作成されたカラムのタイプは、内部的には「DECIMAL」で保持されている
  • エラーコードやメッセージが変わることは無い?(少なくとも今回のケースでは...) ※1

 ※1: 実は、あるアプリを実行していて、この互換性を変更した場合に挙動が変わってしまったことがありました。それについては、徐々に原因を解明していこうと思っています。




カテゴリ
DB2

Club DB2 2009/9/4

 昨日参加させて頂きましたClub DB2のご報告など・・・。


内容について


 今回は、「元Oracleユーザーが語る『ここが違うよDB2』」というタイトルの内容で行われました。
 アジェンダを紹介しておきますと、下記の通りです。

  • DBの違いとは?
  • DB内部アーキテクチャーの違い
    • 構成要素
    • プロセスとサーバ構成
    • メモリ管理
    • データ格納方式
    • システム管理情報
    • ユーザーとグループ
    • ログ運用
    • ユーティリティ
    • 統計情報と再編成
  • アプリケーションから見た仕様の違いを吸収したDB2 9.7の新機能
    • データタイプSQLのサポート
    • PL/SQLのサポート
    • 同時実行性の向上


 前半がアーキテクチャ的な観点かたみた両DBMSの違いについて、後半が互換機能の具体的な例とその限界点みたいな内容となりました。
 比較して頂いた内容を改めてみるとOracleとDB2のその生い立ちから始まって、思想性の違いなどが見えてくるような気がしました。
 質疑応答の中でも、そういった話題(たとえば、「Oracleのこういうところまでは、今後DB2がサポートすることは無いのではないか・・・」とか)が結構あって、とても面白かったと思います。
 PL/SQLの互換性の問題については、具体的な例なども記載されていましたので、資料としてもとても参考になると思いました。

DB2 9.7になって、Oracleとの違いを吸収する方向でいろいろな改編が加えられた訳ですが、これが今後どういった方向に進むのかは正直分りません。
 でも、どんどん進化していく中で、より技術者にもエンドユーザにも親しめるDBMSになって頂ければと思っています。そうすれば、(Oracleにも負けない位に)多くのユーザの心を捕まえられるのではないかと・・・。



新しい試み?


 主催者側での新しい試みとして、Ustream での TEST が行われた模様です・・・。
 我々は内容を受けていたので見たわけではないのですが、何人かはモニターされてた模様。
 これからも、どんどん面白そうなことやってください。w




カテゴリ
misc
DB2