[PR]Perl好きの女性Webエンジニア二人がIBM DB2を試してみた

(※この記事は日本アイ・ビー・エム提供によるPR記事です。)

このたびの東日本大震災で被災された皆さまに心よりお見舞い申し上げます。皆さまの安全と一刻も早い復旧と復興を心からお祈り申し上げます。

2011年の、ある平日の夜のことでした。id:acotieさんと、id:aomushi510さんの二人が訪ねたのは、東京都中央区日本橋箱崎町にある日本IBM本社事業所。迎えてくれたのは、日本IBMにおけるDB2のスペシャリスト、中林紀彦さんと、下佐粉昭(しもさこ あきら)さんのお二人でした。

早速DB2のお話を、と思ったところ、会議室には素敵なコーヒーカップにあたたかいコーヒー、さらにたくさんのおやつ……。「これなんて放課後ティータイム!?」と思いつつも、acotieさんが話を切り出します。

あこ(id:acotie) こんばんは、今日はお時間ありがとうございます。DB2をいろいろ学べる機会をいただけると聞いて、楽しみにやってきました。

あお(id:aomushi510) 普段は別のRDBMSを使っていますが、acotieさんに誘われて、DB2にどんな特徴があるのか学んでみようとやってきました。今日は自分のMacにDB2をインストールしてきました!

あこ 私も入れてあります!

中林なか) 日本IBMの中林です。ようこそIBMへ。お二人ともありがとうございます。おやつとコーヒーを用意してお待ちしていました。インストールしたDB2は試しましたか?

あお はい、サンプルのデータベースを入れて、EMPテーブルにSELECT *して、くらいだけですが。

あこ 私もちょっと動かしてみただけです。

下佐粉しも) おお、十分です。完璧だ。うれしいな。あ、日本IBMの下佐粉(しもさこ)と申します。DB2のブログを書いていて、「DB2 ブログ」で検索すると、たいてい一番上に出てくるブログの中の人です。今日は最初にDB2の特徴を私から紹介させてください。

――横からすみません、ライターの青宮です。お時間や、コーヒー、おやつのご用意などありがとうございます。ちなみにこのおやつは……。

なか 私たちがDB2について紹介するとき、感心していただけた場合には、おやつをプレゼントしたいと思います。

しも えっ、そういう企画だったんだ(笑)

――おお、ありがとうございます。acotieさん、aomushi510さん、おやつほしさに「へー」ってわざとらしく感心するのがどうかは、よーく考えてくださいね(笑)

あこ なるほど(笑)

あお おやつ欲しい(笑)

しも 本当に感心してもらって、おやつをお渡ししたい! DB2の説明がんばります。あ、インストールしていただいたDB2もあるので、気に入っていただいた部分は、実際に試していただけるといいなと思っています。

ワンポイント用語集

EMPテーブル - DB2のSAMPLEデータベースにあるテーブルの一つ。架空の企業の従業員の名前、誕生日、給与などが格納されている。

SELECT * - データベースプログラミングでよく利用するSQL文の一種。SELECT * FROM [テーブル名]という問い合わせをデータベースに実行すると、そのテーブルが含むすべてのデータを取得できる。

たいてい一番上に出てくるブログ - http://db2.jugem.cc/ http://db2.jugem.cc/

■ 無料版もある28歳のRDBMS、いろいろな環境で動作

しも それではDB2の特徴的なところをいくつか説明するところから。DB2は1983年生まれ、28歳のRDBMSです。歴史は長いほうです。

なか DB2ってどんなイメージを持っていますか?

あお クローズな、社内システム的なところで使われているイメージがすごくあります。固くて、まじめな感じがします。周りで使っているって人は、残念ながら、あんまり聞いたことがありません。

あこ そもそも無料で使えるってことを知りませんでした。

あお そうそう、そうなんですよね。試してみるまでそこを知らなかった。

しも はい、Webプログラミングの世界では、残念ながら認知度はあまり高くないと思います。まず「無料」のところをお伝えしたいです。DB2には「DB2 Express-C」という無料で使えるエディションがあります。無料版でも実用的です。データベースのサイズは無制限ですし、使用目的や期限の制限もありません。本番で普通にご利用いただけるケースも十分あると思います。

あこ 有償版と比べて、他に何か制限はあるんですか?

しも 主なところではメモリー2GB、CPU2コアまでという制限があります。この範囲で済むプロジェクトでしたら、快適にご利用いただけるでしょう。

なか DB2はいろいろな環境で動くことも売りにしています。Windowsや、Linux、AIX、z/OS、AS/400……。

しも SolarisやHP-UXなど他社さんの商用UNIXでも動作します。それからPower Systems版のLinuxなんてのも。MacOSもですね。

あこ レアなハードウエアでも動くんですね。

しも 対応言語も多いです。JavaやPHP、Ruby、C/C++、COBOLなどなど。

なか もちろんPerlにも対応しています。

あお ふむふむ。

しも 一番特徴的なのは、すべての言語で、データベースに接続するためのドライバを、自社で開発していることです。

あこ 自社開発ですか!

あお 知らなかった!

しも これって、意外と便利なことが多いです。例えばPerlのドライバを利用して、なにかうまくいかないことがあったとき、もしIBMのサポートをご購入いただいていた場合でしたら、IBMに電話してPerlの質問ができます。

ワンポイント用語集

DB2 Express-C - DB2の無料版。http://www.ibm.com/developerworks/jp/offers/db2express-c/ からダウンロードできる。

Power Systems版のLinux - Power Systemsは、「POWER」CPUを搭載したIBMのUNIXサーバーのシリーズ。OSとしてAIXやi5/OS(いわゆるOS/400)の他、Linuxも利用できる。Power Systems上で動作するLinuxを「Linux on POWER」と呼び、IBM DB2が対応している。 http://www-06.ibm.com/systems/jp/power/


■ 自動でパフォーマンスチューニング

しも 基本的なところはこのくらいにして、DB2ならではの機能を紹介していきますね。たいていどんなRDBMSでも、データベースを設定するためのパラメータって50個とか100個とか、たくさん数がありますよね。それを全部、いい感じの値に設定するのって結構しんどいじゃないですか。

あこ はい。

しも DB2には、それらを自動化する機能があります。Self Turning Memory Manager(STMM)っていいます。

あこ ふーん。

しも なかなか賢くて、自己学習型なんですよ。データベースって用途がいろいろあるじゃないですか。決済システム使うとか、ショッピングカートとか、特性ってそれぞれ違います。特性それぞれにあったパラメータがあるはずです。それを決める仕組みがルールベースでは難しいので、自己学習型にしました。

あお んん?

しも 具体的には、DB2が受け取るSQLをずーっと観察して、DB2がこのパラメータをこっちに変えたらどうなるかなーってのを観察して、そうしていろいろなパラメータを上下させながら学習していくってものです。

あお おお。なんかすごそう……。

なか STMMが値を変えるタイミングは、デフォルトでは3分間のポーリングです。3分単位で、観察、値の変更、学習の三つを繰り返します。観察するのは、その間に流れるクエリー、レコードの内容、ヒープの使い方などです。それでどうもソートが多いからソートヒープを広げてみようとか。

あお すごーい!

あこ 賢い……(感嘆)

しも あ! 感心していただきました!

なか ではおやつをプレゼントです。札幌プティドーナツをどうぞ。

あこ (もぐもぐ)これおいしい。

しも 中のクリームにいろいろな種類があるそうです。揚げてなくて、人形焼みたいに金型で焼いた小さなドーナツです。わりとあっさりしていてパクパクいけます。

あお (もぐもぐ)これチョコだ。おいしい。

ワンポイント用語集

クエリー - クライアントからデータベースサーバーに接続して、SQL文などで問い合わせをすること。またはその問い合わせそのもの。

ヒープ - 探索などで確保するメモリー領域のこと。データに対して、ヒープの容量が少なすぎる場合、処理速度が落ちる。

ソートヒープ - ソート(並べ替え)に用いるヒープのこと。

札幌プティドーナツ - ギンザ プティ カスタがプロデュースする直径3.5cmの焼きドーナツ。 http://www.petit-custa.com/shop/shop2.html

■ ほったらかしで3倍のパフォーマンスに

――あ、私もドーナツいただいていいんですか……いただきます(もぐもぐ)。あずきだあ。ところで自動チューニングがどんな感じで動くか、例があれば見てみたいんですが。

しも (もぐもぐ…)おっと、あ、はい。OLTP系のベンチマークの例があります。

しも STMMの学習例がこれです。縦軸がトランザクション数で、上の方が高性能です。最初、重いベンチマークをセットして、デフォルトで1分あたり4万5000クエリー処理しています。45分くらいたつと、値が上下に振れ始めます。1時間半くらい経つと、だいたい3倍弱の1分あたり14万クエリーになります。

あお これはすごい!

あこ 調整したあとも、最後収束していくんですね。

あお そうですね。安定するまでやるみたい。

しも はい。左側の上っていく1時間半の部分を「Phase 1」と読んでいます。ひたすら試してみるんですけど、ときどきグラフが下に伸びていて、よく見ると失敗しているんですね。

あこ ほんとだ、下がってるところもある。

しも そうです。で、失敗した場合は「やべっ!」っていって、すぐ戻す。そうやっていくと、学習が進んで、だいたいこんなもんかなって感じで1時間30分くらいで3倍弱くらいのレベルになります。その先「Phase 2」ってやつに入って、そこでDB2は動かす幅を小さくしながら、そこで安定するかどうかを探っていきます。このデータだとかなり大きいので3時間くらいかかって安定しておしまい、という流れです。

あお おーすごいなあ、これは。

――実際のDB2のユーザーさんで、STMMをONの人ってどのくらいいらっしゃるんですか?

しも 正確にはわからないんですけど、ここ5、6年のバージョンではデフォルトONで出荷しているんですね。なので実際は、知らずにONになっているというお客さんが大半かと思います。よくある企業情報システムでは、日中と夜中のトランザクションってデータベースに求める特性がだいぶ違うので、STMMに詳しいお客様は、夜中だけ学習をOFFにするということをしています。

あこ あーなるほどー。夜間バッチは学習対象にしないで、日中のオンラインでレスポンスが重要なところだけを学習させて、そこのパフォーマンスを優先するってことですね。

なか テストのときに学習を走らせておいて、チューニングを終えた状態で、本番ではOFFにしてリリースするとかってことをしている人もいます。

あお ふむふむ。参考になる。

しも STMMが対象としているパラメータは20個くらいですかね。よくいじるのは7、8個です。8つのパラメータを全部ベストの状態にするって、人間でやると1ヶ月欲しいって感じになっちゃいますよね。

あお そうですね。

しも こいつにやらせると一晩おいておけばOKです。

あこ ほー……。このSTMMを動かすときの負荷ってどのくらいなんですか?

なか ほとんどないです。CPUで0.3パーセントとか、そういうオーダーです。

あこ ってことは、本番でサービスを動かしながら、STMMを動かすってのもできるってことですか。

なか はい、大丈夫です。だからデフォルトでONにして出荷しています。

あこ すげえ……。

あお すごいなあ。

ワンポイント用語集

OLTP - OnLine Transaction Processingの略。ユーザーの要求にデータベースやアプリケーションが即座に答える処理のこと。

トランザクション - 分割できない一連の情報処理の単位。例えば、銀行の預金口座から現金を引き出すとき、現金をATMに出す処理と、口座の残高を減らす処理は分割できないので一つのトランザクション。

■ XMLをRDBの中にポンポンと放り込めるDB2のpureXML機能

しも もう一つDB2ならではのお薦め機能があります。XML機能です。「pureXML機能」と呼んでいます。

なか 構造化データって、お仕事で使われることはありますか? XMLも使うのかな……。

あこ あ、使います。XMLも……JSONのほうが多いですかね。YAMLもJSONと同じくらい使います。

しも XMLは書くのがしんどいですよね。面倒くさいというか。

あこ そうですね。がっつり表現できるんですけども、そもそも文字が多くて、日本語も入ったりと、いろいろ面倒くさそうなイメージがどうしてもあります。

しも やっぱりJSONとかキレイでいいですよねえ。おっと、DB2のpureXMLの話でした。ざっくり言ってしまうと、XMLの構造化データをRDBであるDB2の中にポンポンと貼り込めます。で、やたら高速に引き出せるんですよ。数十G、数百GのXMLのデータをポーンと放り込んで、1個だけパーンって取り出せるというのが売りです。

あこ おお、速いんですか。どうなってるんだろう。

しも はい、そのやり方がちょっと面白くて、あ、RDBだと、列にNUMBER型とか、INTEGER型とか、型を付けますよね。

あお はい、テーブルを作るときに指定します。

あこ VARCHAR(6)とか。

しも そこに「XML」って書けるんです。

あお おお、「XML型」かあ(笑)

しも そうです、XML型の列です。その列にぽこっとXMLを放り込めます。

あこ おお?! そのSQLってどういうふうになるんですか? XMLの要素がこれのものを取り出すとか。

しも はい、いくつかやりかたがあるんですけど、XPathって言語ご存じですか?

あこ スラッシュでつなげるアレですよね。

しも そうです。SQLの中にXPath書けるんですよ。

あこ へえええええ(感心)

しも 最近のDB2ではXQueryも全部解釈するようになってます。なんで、XQueryかXPathを投げていただくと、ぽこっと出せます。

あお へえええええ(笑)

あこ SQL文の中にXPath(笑) 新しい(笑)

あお WHERE句に(笑)

しも そうです。WHEREの中にXPathを書いたりします。

なか たいへん喜んでいただいたので、おやつをプレゼントです。DEAN & DELUCAのマカロンです。お好きな色をどうぞ。

あお あ、じゃ、私はピンクを!

あこ わたしはこの茶色いのにしよっかな。

あお (もぐもぐ…)これおいしいなあ。

ワンポイント用語集

XML - 文書やデータを、構造付で記述するためのマークアップ言語。特徴は汎用的に利用できること。Extensible Markup Languageの略。

JSON - JavaScriptで扱いやすく、人間にも読み書きしやすい、データ交換のためのフォーマット。JavaScript Object Notationの略。

YAML - 構造化データなどを文字列として扱うためのデータ形式。リストやハッシュなどを構造を手軽に表現できる。

XPath - XML文書の特定部分を指し示すための構文のこと。

XQuery - XMLデータを問い合わせするための言語。

DEAN & DELUCAのマカロン - マカロンは洋菓子の一種。メレンゲや砂糖、アーモンドパウダーを混ぜ合わせてから成形して焼き、クリームをはさむ。DEAN & DELUCAは、食のセレクトショップ。 http://www.deandeluca.co.jp/

■ DB2に格納されたXMLにアクセス

あこ (もぐもぐ…)ざっくりでいいんですけど、XMLをDB2にどう入れて、どう格納されて、どう取り出すかってあたりを教えていただけますか?

しも はい。まずクエリーを投げるほうなんですが、プログラミング言語を選ばないんですよ。SQLをDB2に投げる機能を備えているプログラミング言語からだったら、DB2のXML機能を全部呼び出せます。

あこ あ、そうなんだあ。

しも なので、さっきちょっと言ったように、SQL文の代わりに「XQUERY~」と書いたり、SQLのWHERE節にXPathを書いたりして、問い合わせを実行できます。

あこ XMLを入れるときは…

しも はい、普通にINSERT文で入ります。

あこ そっか(笑) なるほど、SQL文と結果セットの関係はそのまま、でもXQUERY書いたり、クエリーの結果がXMLだったりするんですね。

しも XMLを受け取ったDB2は、XML文書をパースして、エラーチェックをしたうえで、ツリー情報を解析して、そのツリー構造の通りに、HDDに保存します。なので、検索が高速なんですね。

あお ああ、構文チェックしてくれるのありがたいなあ。

しも DB2の実装としては、ストレージエンジンをそれぞれ別に用意しています。

あこ テーブルの構造としては、RDBとしての列と、XML列が並んでいるけれども、保存先としては、ぜんぜん別のところに保存されるってことですか?

しも そうです。列としては一緒のところに並んでいますが、物理的には別のところに保存されます。外部記憶上の持ち方としては、ぜんぜん違う構造になっています。

しも ときどき誤解されるのは、DB2がXMLを採用したといっても、超長いVARCHARとして入れてるんじゃないかって思われることがありますが、そうではないです。

あこ だから速く取り出せるってことですよね。

しも はい。ちょっと古いデータですが、1.5GHzのCPUのサーバーで、XMLを取り出すクエリーのSELECT文で、1秒間に5000から6000くらい処理できます。

あこ ほー。

しも XMLの要素にインデックスを張ることもできるんですよ。

あこ えっ…

あお えっ…

――なにそれこわい…

あこ 詳しく教えてください!

あお くわしく! くわしく!

しも 例えば、入社日時ってエレメントがあって、ここばっかりよく取り出されますって場合は、CREATE INDEX文が、XMLに拡張されてて、社員のエレメントの下の入社日時エレメント、ってところにINDEX作りなさいってCREATE INDEX文が作れるんですね。そうすると、ここの検索がINDEX効いててビャッって取り出せるのですごく速くなる。

あこ サンプルコードありますか?

しも こんな感じです。インデックスを作るので普通にcreate index~です。

create index idx2 on books(bookinfo) generate keys 
  using xmlpattern '/book/price' as sql double;

しも booksテーブルの中のbookinfo列、generate keys usingってここらへんまでいっしょで、ここでxmlpatternって書くとXPathが書けるんで……。

あこ はいはい(笑)

あお なぜか読める(笑)

あこ すごーい(笑) これは面白いですねえ。XMLだからXPathってのもすごい自然な流れで。

しも ここがXPathってのは慣れている人には書きやすいですね。

あお すごく指しやすいです。

しも このインデックスは、DB2の中では(RDBとしての)普通のインデックスと同じ扱いなんで、RDBのインデックスを使い慣れている人なら、とくに悩まず使えると思います。タイトルみたいな文字列にも張れますし、priceみたな数字にも張れます。

あお かなり細かいカスタム検索みたいなのもできそうですね。

しも できますね。よく使われるところはindex張っておいて、高速に返す。

■ XML活用事例

あお いろいろできそうだなあ。実際に、DB2のXMLを利用している事例はありますか? どんなXMLデータを入れているか気になります。

なか ネットショップの事例が一番わかりやすいと思います。例えばムラウチさんはどうでしょう。弊社の事例ページがあります。

しも ちょっとブラウザで開いていただいて、と。そもそも、RDBで正規化しにくいデータってあるじゃないですか。例えば、鉛筆とパソコン、食器、楽器なんかを一緒に扱おうとすると、列の定義って難しくなりますよね。

あお (ムラウチさんのサイトをチェックしながら…)うんうん。大変です。

しも ムラウチさんも、ものすごく品目が多い、充実したECサイトなので、商品に全部関連する情報をRDBで扱おうとすると大変なことになります。

あお カテゴリとかもあるのかー。

なか パソコンと照明器具を同じテーブルに入れようとすると……

あこ 大変だー(笑)

あお 無理無理無理(笑)

しも そういうときにテーブル分けて、どんな商品だったらどうJOINしてーってやりだすとやっぱり大変です。そういうところで1時間悩むんだったら、そういう面倒なところはすべてXMLで吸収してもらおうって考え方です。商品テーブルは、JANコードとか、商品名とか、値段くらいにしておいて、ほかの情報は全部XMLとしてXML列に。

あお はあああ(感心)

あこ ふーん(感心)

なか たしか製品の種類が80万件くらいあったと思います。

あこ 1レコードそれぞれにRDBで扱いにくい商品情報をXMLとして入れると。ふむふむ。

しも そう、そうすると開発の順番を変えられるんですよね。データベースのスキーマを決めきらないと開発に入れないというのが普通なんですけど、これの場合は、作り始めて必要になったところで、XMLの属性や要素を追加することで対処できます。

あこ そっかあ、ALTER TABLEしないとって面倒がないのか。

あお ソースコードとデータベースのスキーマがあわなくなるってケースも減りそうですね。

あこ ああ、ありますねー。すごい楽できそう。

あお そもそも、こういうWebサイトのバックエンドでDB2が使われているとかってのをぜんぜん知らなくて。

あこ 私もはじめて知りました。

あお ちょっとビックリしました。

しも 派手な感じとDB2のイメージがあわないかもしれませんが、実は使われています。

ワンポイント用語集

JOIN - SQLによるデータベースへの問い合わせにおいて、テーブルを結合する処理のこと。

JANコード - 共通化され、POSシステムや受発注システムで広く利用されている商品コードのこと。商品パッケージのバーコードにある数字として見かける。JIS X 0501として標準化されている。

ALTER TABLE - RDBMSにおいて、テーブルの列(カラム)を追加や、削除、変更するときに利用するSQL文のこと。

■ XML機能の使いどころは「先に決まらない」と「いくつあるかわからない」

あこ DB2での、上手なXMLの使い方をもっと知りたいです。

しも 基本的には二つあります。一つは「先に決まらない」というパターンです。たとえば先ほどの商品テーブルの例だと、新製品の商品情報なんて新しい項目が増え続けますよね。ユーザー管理でも、キャンペーンのときだけ管理項目を足したくなるってことはあるのではないかと思います。

あお あるある(笑)

しも もう一つは「いくつあるかわからない」というパターンです。例えば社員テーブルを作るときに電話番号カラムを複数切って、オフィスの電話、携帯電話、自宅の電話……って入れようとするんですけど、いまどき携帯電話の番号をいくつも持っている人いますよね。

あこ 最大何個持っているかわからない……。

なか そこでRDBとして、電話番号1から5ってやっちゃうと、6個目が入らない。

あお たしかに。

あこ 電話番号が少ない人はほとんどnullだらけになりますね。

なか すると電話番号テーブルを別に作って、idと電話番号でJOINするってことをやる。

しも だんだん面倒になりますね。

あお あー。

しも こういう個数が読めないものをXMLとして扱うっていうのはすごくいいです。

なか もう一つあるとすると、ツリー構造のデータですね。例えば映画ってコンテンツを扱うとき、映画の制作日と公開日、DVDの発売日とか、タイトルと邦題とか、キャストとその代表作とかがあるとします。

しも こういうツリー構造をRDBに入れてくださいってお二人にお願いすると、無意識のうちにこれをどうやって列に分解しようかって考え始めちゃいますよね。

あお はい。

しも そこで、いくつかテーブルができて、JOINで取り出してってします。でもXMLとしてDB2で扱えば、何も考えずにツリーのまま格納できます。

あこ そうですね。たしかに映画の例で格納してっていわれたら発狂しそうになると思います。きっと「あとからこれ足して」とか言われるんだ(笑)

あお うそーん(笑) やめてー(笑)

あこ 「えーっ!」ってなる(笑)

なか えーっ!ってなりますよね(笑) XMLのまま扱っておけば、どんどん下に階層的にくっつけていけるので「くっつけた、はい」で、できあがりです。

あこ 素晴らしい!(パチパチパチ)

あお (パチパチパチ)

なか 拍手が出た! マカロンをどうぞ。二つ三つくらい持っていってください(笑)

しも うれしいな。おそらく今のWebプログラミングだと、こういう面倒なデータは、memcachedなどに、JSONのような構造化データを格納していることが多いと思います。

あこ そうですね。

あお なるほど、アプリ側でがんばって処理してますね、そういえば。

しも もちろんよしあしはあって、RDBのかちっとした部分、XMLのぐちゃっと扱える部分、その両方をDB2だったらうまく一個所で扱えると思います。

あこ INSERTするときに(XMLの)構文チェックなんかは……。

しも はい、エラーとして返ります。

あこ 便利ー(うれしそうに)

しも XMLは書くのは面倒ですけれども、表現できる範囲はリッチな特性があります。JSONとの相互変換機能もプロシージャで簡単に実現できます。

なか そういう意味で、構造化データの貯蔵庫としてXMLをDB2で、うまく使っていただける機会は結構あるんではないかと。

あこ これ知らなかったです。面白い。

ワンポイント用語集

memcached - メモリーへのキャッシュに特化したサーバーソフトウエア。Webアプリケーションの大規模なデータ処理でよく用いられる。

■ DB2のXML機能を試す

しも だいぶXML機能にご興味いただけたようなので、DB2のXMLまわりを、お手元のPCで試していただきましょうか。

なか ちょうどサンプルがありますし。あ、お二人ともMacなんですね。

あお MacいいですよMac。

しも Mac気になるなあ。DB2はインストール済みですよね。

あこあお はい!

なか ではデータベースを作るところから。

db2 create database xmlsampl using codeset UTF-8 territory JP

しも DB2ではデータベース名は8文字までなんで、sampleのeがないです。文字コードセットはUTF-8で、日本語ですってことですね。

あお お、来た。「completed successful……」

なか えっ!はやっ! なんでそんな速いの!!

しも SSDだからかなあ。速いなあ。そっか、英語版なのでメッセージが英語ですね。ところで僕のPCはまだやってます。create databaseってハードディスクへのアクセスが多くて、時間かかるものなんですよ。

あこ 来た来た。

しも 僕のまだだ……SSDのMac欲しいなあ……あ、来た。ではテーブル作りましょう。まず、今作ったデータベースに接続します。

db2 connect to xmlsampl

なか つないだらテーブルを作ります。SQLはこうです。ファイル作って、db2 -tvf [ファイル名]で渡せます。

CREATE TABLE xmlitem(
        id      INTEGER NOT NULL PRIMARY KEY,
        item    XML
);

なか 2列のテーブルを作りました。INTEGERでPRIMARY KEYのid列と、itemっていうXML列です。

あお お、できた。できたのかな…。なんかdesc的なコマンドで、できたやつをみたいんですけど、どうしたらいいですか?

しも 素晴らしい。「db2 describe table xmlitem」と入力してください。

あお (カタカタ…)おー、できてましたあ。やったあ。

あこ 私もできたー。

あお 初めてのXML列!

ワンポイント用語集

SSD - 半導体メモリーを利用した外部記憶装置。Solid State Driveの略。ハードディスクの代替として利用することが多い。ハードディスクとくらべて、高価だが、より高速に動作し、とくにランダムアクセス性能に優れる。

■ できたテーブルにXML文書を投入する

なか サンプルのファイルに、サンプルデータを一気に読み込むload_ddl.txtというのがあります。これを実行してください。

db2 -cvf load_ddl.txt

ですね。

あこ load_ddl.txtにはどんなことが書いてありますか?

なか はい、LOADコマンドで、

load from load_xml.txt of del XML from xml insert into xmlitem;

と書いてあります。load_xmlってテキストファイルからデータを落とします。区切り文字はカンマです。XMLデータは「XML」ってディレクトリから。で、XML列にインサートしなさい――って意味ですね。

あお load_xml.txtはどんな中身なのか見ます!

しも はい、こんな感じです。

10101,"<XDS FIL='10101.xml' />"
10102,"<XDS FIL='10102.xml' />"
10103,"<XDS FIL='10103.xml' />"
10104,"<XDS FIL='10104.xml' />"
10105,"<XDS FIL='10105.xml' />"
10107,"<XDS FIL='10107.xml' />"
……

しも idとXMLファイルが指定してあります。XDSはそのファイルの中身をXMLとしてーという意味です。

あお お、入ったかな。「db2 select * from xmlitem」と。入ってたー。

あこ やったー。

しも これで準備ができました。

■ XQUERYでDB2に問い合わせをする

しも では、DB2 XQUERY~って感じでクエリーを投げてみましょう。

XQUERY db2-fn:xmlcolumn('XMLITEM.ITEM')

あお (カタカタ…)それいけ。お、きた。358レコード。

あこ きたきた。358ですね。

しも ほんとだ358レコード。動いてますね。じゃあ今度はちょっと絞り込んでみましょうか。うしろにこうやってXPathをつけるだけで、サイズがLの商品を検索できます。

XQUERY db2-fn:xmlcolumn('XMLITEM.ITEM')/アイテム[サイズ='L']/商品 

あお 285件ですね。

あこ あれーおっと、カッコの場所を間違えました……なおしてっと。でたー285件。Lサイズ多い。

しも SSDのMac速いなあ。いいなあ…。最後に、select文にXPathを書いた場合を見てみましょう。

select c.id, c.item
  from xmlitem c
  where xmlexists(
    '$i/アイテム[商品 = "フランス風カーディガン(七分袖)"]'
    passing c.item as "i")

なか フランス風カーディガン(七分袖)の商品だけ抜いてこい、ですね。

しも 七分袖ってそんなのあるのかな。お、このカッコはどっちだ、全角ですね。(カタカタ…)

あお お、1レコードしかない?

しも そうです。商品番号20101の1個しかないです。

あこ おおー出た20101。

あお やったあ。

しも XPathの普通の構文で書けば、「フランス風カーディガン」を含む七分袖じゃないやつもだーっと出せますね。

あお なるほどー。

なか という感じで、XMLをDB2に格納して、XQueryやXPathで問い合わせできるということを体験いただけたと思います。

あこあお ありがとうございましたー!

■ 残ったおやつの行方は……

――長い時間ありがとうございました。最後にacotieさん(あこ)、aomushi510さん(あお)、それぞれご感想をちょっとずつ教えてください。

あこ そもそもRDBって奥深い世界ですが、DB2も奥深い世界があるなーって思いました。ぜんぜん知らないことがたくさんあって。一方で、自動チューニング(STMM)や、XML機能など、DB2の開発者さんの思いがちゃんとあって、それを感じられたのは楽しかったです。触ってみると、思っていた印象と全然違って、ユーザーフレンドリーで、すごく親しみが持てました。ありがとうございました。

あお 普段はWebアプリケーションを作っているのですが、そことの親和性みたいのはすごいあったなあって感じました。DB2を使っているWebの事例もうかがいましたし、XQueryやXPathを、SQLと組み合わせて使えたりとか、データベースをメンテナンスする人に優しいところが、Webアプリケーションを使っている人向けっぽい感じがしました。とくに人数がすごく少ないときなんかは、そういう環境にやさしい機能がいろいろあって、使ってみたいなあって思えました。

なか おお、ありがとうございます。

しも DB2の魅力が伝わったようでうれしいなあ。残りのおやつも全部お持ち帰りください!

あこあお ありがとうございます!

――今日は皆さま、ありがとうございました! ここをお読みの皆さまにもプレゼントがあります。詳しくはすぐ下に!

■ IBMノベルティグッズと、この記事で登場したDEAN & DELUCAのマカロンをプレゼント

※キャンペーンは終了しました。たくさんのご応募、ありがとうございました。

IBMノベルティグッズ(LEDライト/携帯電話充電機能付き AM/FMラジオ、USBポータブルステレオスピーカー)を抽選でプレゼントします。応募方法は、この記事をはてなブックマークに追加するだけ。さらに、Twitter連携して記事への感想をお寄せいただいた方には、抽選でこの記事で登場したDEAN & DELUCAのマカロンもプレゼント! 詳しくは、下の応募要項をご覧ください。

応募要項

  • 応募期間
    • 2011年5月23日(月)から2011年6月5日(日)24時まで
  • 賞品と当選人数
    • IBMグッズの詰め合わせを5名様、この記事に登場したDEAN & DELUCAのマカロンを5名様
  • 応募方法
    • IBMグッズの詰め合わせ
      • この記事をはてなブックマークに追加
    • DEAN & DELUCAのマカロン
      • ブックマークコメントにこの記事への感想を書いて、Twitter連携した上で、はてなブックマークに追加
    • ※プライベートモードでご利用の方は対象となりません
  • 当選発表
  • 賞品発送
    • 当選発表後、はてなよりメールをお送りし、送付先情報(送付先住所、受取人氏名、電話番号)をお聞きします

[PR]企画・制作:はてな
写真:佐藤麻紀