ライセンス変更や毎年の保守料金の値上がりなどOracle Database(DB)関連のコストに悩むユーザーは多い。思い切ってOracle DBをやめて他のDBに移行したい。こう考えるユーザーも多いはずだ。その際の移行先の候補として有力な選択肢となるのがOSS(オープンソースソフトウエア)のRDBMS(リレーショナルデータベース管理システム)である「PostgreSQL」だ。

 機能の実現レベルの差とともに、Oracle DBからPostgreSQLの移行を検討する際に、大きなポイントとなるのがDBの仕様差だ。仕様差はOracle DBとPostgreSQLの「処理結果が異なる」状態の原因になる。

 仕様差は機能差よりも厄介だ。仕様差についてOracle DBとPostgre SQLで比較した情報が少ない。そのうえ、仕様差があったとしても移行テスト時に異常終了することはなく、移行後の出力結果だけを見ても分からない。移行元の出力結果と比較して初めて差異が判明する。仕様差は基本的な動作の違いにより発生し、問題が発生した場合に広範囲な対応が必要になる可能性が高いことが特徴だ。

 仕様差への対策として有効なのが、単体テストによる問題の早期発見だ。早期発見により、移行コストの増加を最小限にできる。また多くの移行を経験しているベンダーの知見に頼ることも1つの策である。

 仕様差の例を見てみよう。まずは基本的な仕様差の例として除算を含む以下の2つの式を見てほしい。

1÷3×3=1
1/3+1/3+1/3=1

 上記の簡単な計算をOracle DB、PostgreSQLでそれぞれ実行した場合、Oracle DBでは「1」になるが、PostgreSQLでは数値の型によって「0」か「0.999…」になる。結果を見て「バグだ」と思うかもしれないが、これは仕様である。

 つまりSQL内で除算を含む計算が実装されている場合、Oracle DBからPostgreSQLにそのまま移行すると新旧比較で答えが一致しない。対策は誤差として許容するか、許容できない場合はSQL内で計算をさせずに計算結果のみをDBに格納するような対応が必要となる。

 もう1つ「トランザクションの結果が異なる」という仕様差を紹介しよう。Oracle DBとPostgreSQLは、もともと単体のトランザクションのエラー動作に違いがある。

 さらにここでは、複数のトランザクション間での違いを説明しよう。Oracle DBもPostgreSQLもデフォルトのトランザクション分離レベルは「READ COMMITTED」である。ところが同じSQLが正常に動作して、トランザクションが正常終了した場合であっても、結果が異なる場合がある。

Oracle DBとPostgreSQLの仕様差の例
トランザクションの同時実行の結果が異なるケース
[画像のクリックで拡大表示]

 こうした仕様差は「どちらが正しい」と考えるのではなく、「移行前と同じ結果にならない」と知っておくことが重要だ。仕様差が業務として許容できるのであれば対応は不要だが、許容できない場合はアプリケーション側での対応が必要になる。

この先は有料会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら