Oracleとの互換性を高めた3つのポイント
当然ながら、DB2とOracleでは基本的なアーキテクチャも異なるし、SQLもまるっきり同じというわけにはいかない。そのため、移行時にはそれなりにプログラムに手を入れる必要がある。とはいえ、機能的には両者ともそれなりに豊富に揃っているので、こちらにあってあちらにないという機能はそれほど多くはないはずだ。
しかしながら、Oracleの便利な機能を十分に使いこなしていればいるほど、DB2への移行は苦労することになるはずだ。 ところが、最新版のDB2 9.7では、OracleにあってDB2にはないといった機能を、大幅に減らすことに成功している。これにより、それなりにOracleの機能を使い込んでいたとしても、OracleからDB2への移行の手間を従来に比べて大きく削減しているのだ。
DB2 9.7でこの手間の削減に大きく貢献しているのが、Oracle独自の拡張プロシージャ言語であるPL/SQLのサポートがまず挙げられる(図1)。これは、足りなかったPL/SQLの機能をエミュレーションするといったものではない。
なんとPL/SQLのコンパイラを追加し、別途実装してしまったのだ。これにより、Oracleで動いていたPL/SQLのプログラムが、多くの場合、手をほとんど入れずにDB2 9.7の上で動いてしまうのだ。これは、エミュレータ方式ではないので、パフォーマンスの劣化も心配ないとのことだ。
もう1つのOracleとの互換性を高めたポイントが、Oracle固有の関数やデータ型のサポートをDB2 9.7では大幅に追加しているところだ(図2)。たとえば、結合演算子の(+)やVARCHAR2データ型なども新たに追加されており、それらを利用することで、SQLの書き換えの必要も大幅に削減されている。
3つ目の大きな変化が、DB2 9.7でのロックメカニズムの変更だ。Oracleを使っている技術者であれば当たり前の機能とも言える、読み取り一貫性機能がDB2 9.5までは実装されていなかった。そのため、更新中のレコードを読み込む際には、更新レコードはロックされ読み込むにはロックが解除されるのを待つ必要があったのだ。
これを回避するために、DB2では更新中のロックがなるべく発生しないようプログラミング側でなんらかの工夫をする必要もあった。DB2 9.7ではOracleと同様のREAD COMMITTED分離レベルを採用できるようになり、この拡張も移行の手間を大幅に削減することにつながる。