一般的に分野ごとに異なるデータベースを利用している場合や別システムとの連携、災害発生時の損害分散などのようにデータベースが分散させている構成の場合、これらのデータへアクセスする機能としてデータベースリンクが用いられます。
リモート環境にあるデータベースのオブジェクトを、ローカル環境のデータベース上にあるかのように操作することができるデータベースリンクですが、以下のようなメリットとデメリットがあります。実際にデータベースリンクを使用した場合にどの程度パフォーマンスが低下するのかOracleのデータベースリンクにて検証してみましょう。
メリット
ローカルユーザはリモートデータベースのユーザとならなくとも、権限の制限内でリモートデータベースのデータにアクセスが可能となり、リアルタイムにリモートデータベースにあるオブジェクトの操作が可能となります。
デメリット
リモートデータベースへ接続するためネットワーク状態の影響や、ローカルデータベースにデータを取得する仕組みによりローカルデータベース内のみでの操作に比べパフォーマンスが低下する場合があります。
検証内容
図1
2台のマシンを用意し物理的に離れた環境にそれぞれデータベース(Oracle)を構築する。
検証詳細
・データベースAと物理的に離れたデータベースBを用意し適当なユーザを作成
・データベースAに対しデータベースBへのデータベースリンクを登録
・どちらのデータベースにもテーブルA、テーブルB、テーブルCを作成し、
テーブルAには1000万件、テーブルBには10万件のデータを投入する
テーブルCはテーブルAと同定義とし、INSERT先のテーブルとする
・上記構成のもと検証用のSELECT文、INSERT文を実行(下記参照)
・一回の検証ごとにテーブルデータを削除し、DBバッファキャッシュをクリア
・上記検証をマシンA、マシンBのそれぞれで実施する
【データベースリンク】
CREATE DATABASE LINK “DBLINK_テーブルB”
CONNECT TO “OB” IDENTIFIED BY “Password” USING ‘データベースB’
【ローカル環境用(データベースリンクを利用しない)】
◆SELECT文(テーブルAとテーブルBを結合)
SELECT A.*
FROM テーブルA A
LEFT OUTER
JOIN テーブルB B ON A.列1 = B.列1
WHERE B.列2 BETWEEN 400000 AND 500000
AND B.列3 > 'XXXXXXXXXX'
◆INSERT文(上記SELECT文を利用しテーブルCへデータ移行)
<<全件>>
INSERT INTO テーブルC
SELECT * FROM テーブルA
<<条件抽出>>
INSERT INTO テーブルC
SELECT A.*
FROM テーブルA A
LEFT OUTER
JOIN テーブルB B ON A.列1 = B.列1
WHERE B.列2 BETWEEN 400000 AND 500000
AND B.列3 > 'XXXXXXXXXX'
【リモート環境用(データベースリンクを利用する)】
◆SELECT文(テーブルAとテーブルBを結合)
SELECT A.*
FROM テーブルA@データベースリンク A
LEFT OUTER
JOIN テーブルB B ON A.列1 = B.列1
WHERE B.列2 BETWEEN 400000 AND 500000
AND B.列3 > 'XXXXXXXXXX'
◆INSERT文(上記SELECT文を利用しテーブルCへデータ移行)
<<全件>>
INSERT INTO テーブルC
SELECT * FROM テーブルA@データベースリンク
<<条件抽出>>
INSERT INTO テーブルC
SELECT A.*
FROM テーブルA@データベースリンク A
LEFT OUTER
JOIN テーブルB B ON A.列1 = B.列1
WHERE B.列2 BETWEEN 400000 AND 500000
AND B.列3 > 'XXXXXXXXXX'
検証環境
今回の検証環境は以下の通りです。
物理的に異なるマシン上にそれぞれデータベースを設置しています。
【データベースA】
マシン | OS | Windows7 |
CPU | Intel Core E8400 3.00GHz | |
メモリ | 3GB | |
その他 | 特に無し | |
DB | 対象RDBMS | Oracle 11.2.0.1.0 |
【データベースB】
マシン | OS | Windows Server 2012 |
CPU | Intel Xeon 3065 2.33GHz | |
メモリ | 1GB | |
その他 | 特に無し | |
DB | 対象RDBMS | Oracle 11.2.0.1.0 |
検証結果
[RELATED_POSTS]
結論
今回実施した検証環境では「データベースリンクを使用しても大きくパフォーマンスに変化はみられない。」という結果になりました。
データベースリンクはパフォーマンスが低下すると言われていましたが、この検証からはそのようなデメリットが見られませんでした。
なお、INSERT文(条件抽出)実行時では各マシンで各処理5倍ほどの差が発生しましたが、マシンA上での処理速度が影響していると判断し、データベースリンクの利用で差が発生したものではないと考えます。
本検証と同様に簡単なクエリであっても5分以上の差が発生したり、結果が返らないほど悪化したという報告ケースもある中、この結果となったことにはテーブル構成やデータ、INSERT文(条件抽出)実行時のようにハード、ネットワークの影響等も大きく、必ずしもデータベースリンクを利用してもパフォーマンスが悪くなるということが無いと言えるのではないでしょうか。
また、データベースリンクのように遠隔地にあるデータベースを操作する場合にOracleの機能でマテリアライズドビューがありますが、こちらもデータベースリンクを使った構文にすることでリモート環境のデータ参照をすることができます。
データベースリンクとの違いとしては、データベースリンクはリアルタイムにデータを取得するのに対し、マテリアライズドビューでは定期的(指定可能)にローカルデータベースへデータを取得し、実データとして保持することができます。
データベースリンクを利用したクエリのパフォーマンスが悪い場合、データが最新である保証はできませんが、マスタテーブルなど、データがあまり変わらないテーブルに対し、データベースリンクを用いたマテリアライズドビューを利用することも改善策の一つではないでしょうか。
今回これで改善ができるかどうかまでを検証し報告したかったのですが、今後マテリアライズドビューに関しての検証依頼があれば、今後の研究テーマの一つとしていきたいと思います。
- カテゴリ: