目次


DB2 Express-C 9.7.4の新機能

Comments

はじめに

DB2 Express-CはDB2のコミュニティー向けエディションです。本番用システムで使用することもでき、アプリケーションに組み込んで配布することも可能です。開発目的のためにのみ使用することもできます。全ての機能が無償で提供されます。

DB2 Express-Cはあらゆる規模のサーバーにインストール可能で、最大2コアのプロセッサーと2 GBのメモリーで使用します。また、データベース規模に制限はありません。DB2 Express-Cが提供する一連の堅牢な機能は、他のベンダーが提供するどのデータベース製品のコミュニティー向けエディションにも劣りません。

DB2 Express-C Version 9.7は2009年6月に提供が開始されました。以後、DB2 Express-Cのイメージは3度改訂されています。最新バージョンは、2011年5月2日に提供されたV9.7.4です。本誌では、V9.7から最新のV9.7.4までに追加された主な新機能と強化機能についてまとめました。V9.7とその後継バージョンの新機能については、リソース・セクションに掲載されているIBM DB2 Database for Linux, UNIX and Windowsのインフォメーション・センターの概要をご参照ください。

本誌で提供されるシステム活用例をご参照ください。特に記載がないかぎり、例にはDB2のSAMPLEデータベースを使用しています。DB2 Express-Cのコードを新バージョンにアップデートすると、既存データベースもdb2updv97コマンドを使用してアップデートする必要があります。例えば、最初にDB2 Express-C V9.7.1.をインストールした際にSMAPLEデータベースを作成したとします。SAMPLEデータベースを使用してDB2 Express-C V9.7.4で提供する新機能を使用したい場合は、db2updv97 -d sampleを起動する必要があります。

本コマンドによって、既存のデータベース上で新バージョンの新機能を有効化します。DB2 Express-Cのコードをアップデート後に新規データベースを作成した場合は、最新機能がデータベースに自動的に備わるため、本コマンドを起動する必要はありません。

ロック機能の強化

新規の分離レベルであるCurrently Committee (CC)は、書き込み処理(UPDATE処理)は読み取り処理(SELCT処理)をブロックしなくなりました。読み取り処理は、UPDATE処理を実行する前に現時点でコミットされた値を読み取ります。この機能強化によって同時実行が改善し、デッドロックが削減します。

以下のコンテンツを含むT1という名称のテーブルが存在するとします。

表1. テーブルT1のコンテンツ
FIRSTNAMELASTNAME
RaulChong
JinXie

AppAという名称のアプリケーションが以下のステートメントを発行するものの、コミットは実行しないとものします。

 
Update T1 set lastname = 'Smith' where firstname = 'Raul'

その後、AppBという名称のアプリケーションが以下のステートメントを発行します。

Select lastname from T1 where firstname = 'Raul' with CS

AppA(書き込み処理)のupdate文による排他ロック解除を待つ必要があるかため、DB2 V9.7以前のバージョンでは、AppBが発行するステートメントはハングします。新規のCS機能(新規のDB2 V9.7データベースの標準機能)を有効化すると、AppBのステーメントは待機することなく、現時点でコミットされている値を返します。この場合、AppAが発行したUPDATEがまだコミットされていないため、返される値はChongになります。

パフォーマンスの強化

DB2 V9.7では、ステートメント・コンセントレーター機能を新規に提供します。この機能は、動的SQLを使用しており、RubyやPHPなどの言語で開発されたプログラムのパフォーマンスを改善します。ステートメント・コンセントレーターは、パラメーター値以外は全く同じSQL文を探し出し、機能名のとおり、複数のステートメントを1つのステートメントにまとめます。例えば、以下のステートメントが存在するとします。

SELECT name FROM employee WHERE empid = 10
SELECT name FROM employee WHERE empid = 20
SELECT name FROM employee WHERE empid = 30

これらをステートメント・コンセントレーターによって以下のように集約します。

SELECT name FROM employee WHERE empid = ?

疑問符 (?) は、パラメーター・マーカーを指します。この例では、DB2は起動時に10、20および30の値を提供します。

以前のバージョンに比べて、この機能によってパフォーマンスが大きく向上しました。ステートメント・コンセントレーターの機能が装備されていないDB2の旧バージョンでは、上記の各ステートメントをユニークなステートメントとして取り扱い、各ステートメントについて個別にコンパイルして実行しますが、全てのステートメントに対するアクセス・プランが同じであるため、アクセス・プランを繰り返し計算することによるリソースの無駄が発生します。ステートメント・コンセントレーター機能によって、DB2 V9.7はステートメントを1度だけコンパイルすることで、当該ステートメントのアクセス・プランを取得し、再利用することができます。

もう1つのパフォーマンス強化は、ラージオブジェクト(LOB)の保存です。特定サイズ以下のLOBをデータ行にインラインで保存することができるようになりました。これによってバッファープール経由でLOBにアクセスできるため、LOBのパフォーマンスを改善することができます。

アプリケーション開発の強化

DB2 V9.7は、アプリケーション開発では以下のような機能強化を提供します。

  • トリガーとユーザー定義関数(UDF)において、SPL PLへのサポートを改善できるようになりました。DB2 V9.7より前のバージョンでは、SQL PLのサブセットであるインラインSQL PLのみをサポートしていましたが、トリガーが単一フェーズの中にトリガー・イベントとしてUPDATE処理、DELETE処理および INSERT処理を実行することができるようになりました。
CREATE TABLE COMPANY_STATS (NBEMP INTEGER)
!

CREATE TRIGGER HIRED
 AFTER INSERT OR DELETE OR UPDATE OF SALARY ON EMPLOYEE
 REFERENCING NEW AS N OLD AS O FOR EACH ROW
   BEGIN
         IF INSERTING
         THEN UPDATE COMPANY_STATS SET NBEMP = NBEMP + 1;
         END IF;
 
         IF DELETING
         THEN UPDATE COMPANY_STATS SET NBEMP = NBEMP - 1;
         END IF;

         IF (UPDATING AND (N.SALARY > 1.1 * O.SALARY))
         THEN SIGNAL SQLSTATE '75000' SET MESSAGE_TEXT='Salary increase>10%';
         END IF;
   END
!

旧バージョンでは、イベントごとにトリガーを個別に作成する必要がありました。上記の例では、トリガー・アクションを指定するために、ブーリアン条件としてINSERTING、DELETING およびUPDATINGを特別な述部としています。また、旧バージョンでは、AFTERトリガーでしか使用できませんでしたが、BEFOREトリガーに UPDATE、DELETE、INSERTおよびデータを修正するルーチンを記述することができるようになりました。

  • SQL PLによるストアード・プロシージャーとUDFに関して、標準のパラメーター値を設定して、名前を付けることができます。さらに、ブーリアン、カーソル、行、アレイのデータ型がサポートされるようになりました。
  • TRUNCATE SQL文を使用して、迅速に削除ができるようになりました。
  • LISTAGGの合算関数をサポートできるようになりました。その名のとおり、この関数は一連の文字列をWITHIN GROUP句で指定された順序で合算することによってリストを作成します。例えば、SAMPLEデータベースに接続して、以下を実行するとします。
SELECT 
      workdept, 
      LISTAGG(lastname, ', ') WITHIN GROUP (ORDER BY lastname)
      FROM emp 
      GROUP BY workdept

この例では、workdept列とカンマで仕切られたLASTNAMEのリストがアルファベット順で返されます。

A00   HAAS, HEMMINGER, LUCCHESSI, O'CONNELL, ORLANDO
B01   THOMPSON
C01   KWAN, NATZ, NICHOLLS, QUINTANA
D11   ADAMSON, BROWN, JOHN, JONES, LUTZ, PIANKA, SCOUTTEN, STERN, WALKER, YAMAMOTO, 
      YOSHIMURA
D21   JEFFERSON, JOHNSON, MARINO, MONTEVERDE, PEREZ, PULASKI, SMITH
E01   GEYER
E11   HENDERSON, PARKER, SCHNEIDER, SCHWARTZ, SETRIGHT, SMITH, SPRINGER
E21   ALONZO, GOUNOT, LEE, MEHTA, SPENSER, WONG
  • ROWNUMやROWIDの使用をはじめとする、他のSQLシンタックスをサポートできるようになりました。
  • DB2 V9.7では、関連するデータベース・オブジェクトの定義を集約化するために、モジュールのコンセプト(OracleのPackageに近いコンセプト)をサポートしています。
  • DB2 V9.7は、データ型間で暗黙の型変換をサポートするようになりました。この機能は、PHPやRubyなどの動的言語にとっては有益です。例を挙げると、以下のような処理が可能です。
create table t1 (col1 int)
select * from t1 where col1 = '42'

この例では、文字列値の42を整数列のcol1と比較することができます。

  • 日付、文字列およびその他の種類のデータを加工するために、新規の関数が数多く提供されています。
  • DB2では、セッション中にのみ使用可能な一時テーブルであるCreate Global Temporary Table (CGTT)をサポートできるようになりました。CGTTとDeclared Global Temporary Table (DGTT)の違いは、CGTTの場合はテーブル定義がDB2のカタログ・テーブル内に常に存在する点です。したがって、CGTTが一度作成されると、再作成せずにどのセッションでも使用できます。ただし、行はセッションごとに独立しています。
  • パブリック・エイリアス(パブリック・シノニムとも言います)を使用して、グローバル・オブジェクトを参照できるようになりました。DB2 V9.7より前のバージョンでは、全てのDB2オブジェクトにおいて前半部分でスキーマ名を指し、後半部分でオブジェクト名を指すユニークな二部構成の名称を持っていました。パブリック・シノニムを作成することによって、以下のような、ユーザーIDがデータベースに接続しているか否かにかかわらず、スキーマ名のないオブジェクトを参照できます。
connect to sample user arfchong using mypsw
create public synonym raul for table arfchong.staff
select * from raul                                 ## works OK
select * from arfchong.raul                        ## Error
connect to sample user db2admin using psw
select * from raul                                 ## works OK
  • DB2 V9.7はオブジェクトの従属関係ルールを緩和することで、より柔軟なスキーマの拡張を実現します。 例えば、以下の従属関係が存在するとします。

ビュー2 --> ビュー1 --> テーブル1

以前のバージョンであれば、ビュー1を変更する場合、ビュー2を先にドロップする必要がありました。ビュー2はビュー1に従属しているからです。しかし、DB2 V9.7では、ビュー2のドロップは必要ありません。即時にまたはビューが再利用される際に、DB2がビュー2の再検証を実行するためです。本機能は、アプリケーションのテストを行う場合や、データベース・スキーマの変更を行う場合に(例: 列の追加を行う場合)役に立ちます。

スキーマ拡張に関するその他の機能改善には、以下の通りです。

  1. 列名を変更することができます。
  2. REPLACEオプションがCREATE文に追加されるため、DROP文を発行する必要がなくなりました。したがって、オブジェクト上の全権限がそのまま存続します。
  3. ALTER COLUMNにおいて、SET DATA TYPEをあらゆるデータ型に対して使用できるようになりました。
  • Visual StudioのアドインとIBM Data Server Provider for .NETの機能が拡張しました。本プロバイダーは、 ホスト変数、モジュール、ARRAYデータ型, 複合文および可変長タイムスタンプをサポートできるようになりました。

32ビット版のIBM Data Server Provider for .NETは、 64ビットのドライバー・パッケージに含まれており、 64ビット・ドライバーをインストールすると、32ビット・ドライバーもsqllib\bin\netf20_32という名称の別のディレクトリーにインストールされます。

db2dsdriver.cfgファイルおいて新規のQueryTimeoutというキーワードが提供され、タイムアウトする前にクエリーが起動すべき時間を設定することができます

その他の機能拡張としては、CALL文が名前付き引数をあらゆる順序で使用できる機能などがあります。

  • 上記の機能拡張をサポートするために、JDBCとSQLJの機能を拡張しました。
  • NUMBER、VARCHAR2および1秒未満の正確な時間に対応するTIMESTAMP などの新規のデータ型をサポートします。
  • Python-DB2アプリケーションへのサポートを改善しました。
  • pureXMLの機能拡張として、Declared Global Temporary Tableをサポートします。
  • LIMIT句とOFFSET句を使用した新規のSQLシンタックスがサポートされるようになりました。SQL文で返されるレコード数を制限したい場合は、LIMIT句が役立ちます。例えば、USERSテーブルに100レコードが存在し、5レコードのみを返したい場合、以下のステートメントを使用できます。
SELECT * FROM users LIMIT 5

OFFSE句は、検索結果を返す際に開始行から何行をスキップするか指定します。例えば、USERSテーブルの11行目から15行目を返したい場合、以下のステートメントを使用します。:

SELECT * FROM users LIMIT 5 OFFSET 10

アプリケーション・レイヤーで複数ページの検索結果をフィルタリングするのではなく、コード内で直接データベースからスクロールしたい場合に、上記の2種類の句が役に立ちます。

デフォルトで、LIMIT句とOFFSET句は有効化されていますが、これらの句が機能していない場合は、以下のコマンドを実行することで有効化できます。

$ db2set DB2_COMPATIBILITY_VECTOR=MYS
$ db2stop
$ db2start
  • 新規にCONNECT_PROCのデータベース・コンフィギューレーション・パラメーターが提供され、これを使用してストアード・プロシージャーの名称を設定できます。このプロシージャーは、データベースへの接続プロセス中に自動的に呼び出されるため、単一の集中管理ロケーションからの接続パラメーター設定に使用できます。例えば、このプロシージャーを使用して、アプリケーションを変更することなく、CURRENT_PATH、CURRENT_SCHEMAおよびCURRENT LOCALE LC_TIMEのような特別レジスターやグローバル変数の設定が可能です。
  • LIKE 述部のような新規機能によって、列参照をパターン表現として使用できます。したがって、LIKE述部をあいまいなJOIN述部として使用できます。例えば、INNERJ OINを使用する際、通常は異なるテーブルの2列を比較して同一性のテストを行います。本機能では、同一性ではなく、LIKE述部に基づいたテストを行うことができます。以下の2つのテーブルが存在しているとします。
表2. COMPANY
NAMEPHONE
ACME416-123-1111
SOMOS905-122-9999
ZZZ713-999-8888
XLS647-123-9999
TELX416-590-1224
表3. PHONECODES
CityAREACODE
Toronto416
Mississauga905
Oshawa647
Houston713
  • 電話の市外局番に基づいて各企業が所在する市の名前を確認したいとします。この例では、以下のようなクエリーを起動します
SELECT A.name, B.city 
     FROM company A, phonecodes B 
     WHERE B.areacode LIKE substr(A.phone,1,3)

このクエリーでは、PHONECODESテーブルのAREACODE列とCOMPANYテーブルのPHONE列の最初の3文字であいまい結合を実行します。クエリーの実行結果は以下のとおりです。

NAME       CITY
---------- ---------------
ACME       Toronto
TELX       Toronto
SOMOS      Mississauga
XLS        Oshawa
ZZZ        Houston

リカバリーとストレージの強化

DB2を使用しているユーザー様や現在使用を検討中のユーザー様から、DB2で保存できるデータ容量についてご質問頂くことがあります。本製品の新バージョンをご提供するたびに、IBMのDB2開発チームは限界に挑戦してきました。DB2 V9.7では、大容量の一時テーブル容量を4倍に拡張しました。例を挙げると、32KBのページサイズのテーブルスペースは旧バージョンでは16 TB でしたが、最新バージョンでは64 TBです。

db2cklogという新規ツールを使用することで、ロールフォワード・リカバリーでアーカイブ・ログ・ファイルを使用する前に、本ファイルの有効性をチェックすることができるようになりました。 本ツールを起動するには、以下のコマンドを入力します。  

db2cklog 2

2は、S0000002.LOGという名称の2つ目のログのことを指します。

セキュリティーの強化

DB2の旧バージョンではシステム管理者がほぼすべての情報にアクセスすることができました。DB2 V9.7では、業務を分離するためのセキュリティー・モデルを強化しました。これによってデータ流出のリスクを最小化し、政府によるコンプライアンス要件に対応できるようになります。管理者権限が新規に設定されており、そのうちの2つの管理権限レベル、DATAACCESSおよびACCESSCTRLを使用することで、データへのアクセス権限とデータアクセス権限を付与する権限をそれぞれ提供します。これによって、セキュリティー管理者はシステム管理者やデータベース管理者の権限を取り消したり、データへのアクセスを禁止したりすることが可能になります。

さらに監査機能が強化され、過去のデータベース・アクティビティーをトラッキングができるようになりました。例えば、特定のテーブルに影響を及ぼすリクエストが過去に発生した状況を分析する必要がある場合に、データベースの監査情報を使用して分析に必要な情報を取得することが可能です。

管理機能の強化

DB2によって、オンラインでテーブルを異なるテーブルスペースに移動することが可能になりました。 これによって、ユーザーがテーブルにアクセス中であっても、テーブルストレージのロケーションを変更することができます。本機能により、お客様は24時間いつでもDB2データの利用が可能になります。DBAがあるテーブルスペースのストレージが容量の限界に近づいていることに気付くと、DB2 V9.7で提供されるADMIN_MOVE_TABLEのストアード・プロシージャーを使用して、テーブルを空き容量のある別のテーブルスペースに移動させます。ユーザーは全く影響を受けずに、通常どおりSELECT、INSERT、UPDATEおよびDELETEの機能を使用できます。本機能を有効化するために、DB2はテーブルのシャドーコピーを作成し、オリジナルのテーブルに対して行われた変更をトラッキングします。その後、変更がシャドーコピーに適用されます。

その他の機能拡張として、データベース・スキーマの移行管理の向上が挙げられます。DB2内に存在するSQLスキーマを、テーブル、ビュー、インデックス等のさまざまなデータベース・オブジェクトを分類するためのツールとして活用できます。例えば、RFCHONG.T1テーブルとRFCHONG.V1ビューが同じRFCHONGスキーマを使用しているとします。あるスキーマを使用している全てのオブジェクトを別のデータベースに移行したい場合、これを実施するひとつの方法として、テーブルについてはdb2moveユーティリティーを使用することができます。TRANSPORTオプションに基づいてRESTOREコマンドを使用し、テーブルスペースとSQLスキーマの組み合わせをデータベースのバックアップ・イメージから別のアクティブなデータベースにコピーすることができるようになりました。

インストールの強化

db2valのDB2 コピー検証ツール・コマンドを使用して、DB2 Express-Cのインストールと構成が正しく完了したことを簡単に確認できるようになりました。

LinuxおよびWindows上で稼働するDB2 Express-Cイメージのフットプリントは大きく(最大37%)削減されました。DB2 Express-C imagesイメージはAmazonのクラウドやIBMのクラウドで使用でき、Rightscaleのサーバー・テンプレートでも使用されています。Amazonのクラウド、IBMのクラウドおよびRightscaleのリンクについては、リソースをご参照ください。

DB2のSpatial ExtenderおよびText Search

約10年間にわたってご提供しているにもかかわらず、スペーシャル(地理空間)機能の認知度は高くありません。そのため、V9.7の最新イメージで初めて提供される機能ではなく、DB2 Express-Cを含むDB2の全エディションにおいてDB2 Spatial Extenderを無償で使用可能であることを認識しておいてください。Spatial Extenderによって、SQLで空間データと測地データを活用することができます。例えば、この機能を使用することで、「トロント在住で昨年3,000ドル以上当社の製品を購入したお客様の最寄り小売店舗は?」といった質問への回答を導き出せます。

DB2 Spatial Extenderを医療アプリケーションで使用することもできます。例えば、「脳のMRIスキャンで悪性細胞のパターンは?」といった質問への回答も導き出せます。

より詳細な情報については、リソースのIBM DB2 Database for Linux, UNIX and Windowsのインフォメーション・センターで提供されるDB2 Spatial Extenderについてのページをご参照ください。

DB2 Express-C 9.5.2ではText SearchがDB2に含まれ、テキスト列の検索を迅速に実行できるようになりました。DB2 Express-C 9.7.4では、パフォーマンス、コンフィギュレーションおよびチューニングの機能も強化しました。Text Searchに関するより詳細な情報については、リソースのDB2 Express-C 9.5.2の新機能をご参照ください。

結論

本誌では、V9.7から最新のV9.7.4間にDB2 Express-Cに提供される主要な機能強化ポイントについて説明しています。無償で提供される、最新のDB2のコミュニティー向けエディションには、パフォーマンス、アプリケーション開発、ストレージ、セキュリティー等の新機能が含まれています。これらの機能のなかには、DB2の無償エディションでのみ提供されているものもあります。

最新バージョンのDB2 Express-C 9.7.4を是非ご活用ください。

関連情報


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management
ArticleID=680344
ArticleTitle=DB2 Express-C 9.7.4の新機能
publish-date=06142011