日本ヒューレット・パッカード株式会社
本文書は PostgreSQL上で動作するOSDL DBT-3 version 1.9(以下DBT-3) の MySQL 移植作業を踏まえた、 Oracle 10gデータベースへの移植可能性の調査報告書である。
DBT-3のMySQLへの移植作業において明らかになった移植作業上の各ポイントについて列挙し、 その各々のポイントについてOracle 10gへ移植する場合の対応方法について調査を行った。
DBT-3 (OSDL Database Test 3) は Transaction Performance Processing Council(TPC) が提供している TPC-H をベースに OSDL (Open Source Development Labs, inc、現Linux Foundation) で開発された Linux カーネルに対するワークロードツールである。
DBT-3で実施されるテストは以下の3つから構成される。 この3つの各テストで実施時間およびシステム状態、データベース統計情報を収集する。
DBT-3は以下のコンポーネントから構成される。
DBT-3をMySQLへの移植作業を踏まえ、Oracleへ移植する際に調査・修正対象となるポイントの概要は次の通りである。
データベーススキーマの各カラムのデータ型をOracleのデータ型にする必要がある。
| PostgreSQL | Oracle | コメント |
|---|---|---|
| INTEGER | NUMBER(10,0) | 4bytes符号付整数 |
| REAL | FLOAT | 単精度浮動小数点 |
| CHAR | CHAR | 固定長文字列 |
| VARCHAR | VARCHAR2 | 可変長文字列 |
| DATE | DATE | 年月日 |
| TIMESTAMP | TIMESTAMP(6) | マイクロ秒の精度 |
PostgreSQLとOracleでは以下の違いが存在するため、日時処理を行うクエリを修正する必要がある。
Oracleの日時処理:
例: l_shipdata <= date '1998-12-01' - interval '3' day
get_statement で各SQL文の行末処理が記述されている。 これをOracleに対応させる必要がある。
またget_statementおよびqgenでは、データベースの差異を吸収するために 定義を用いており、それを展開することでデータベースに応じたクエリ整形を行っている。 そのため、get_statementおよびqgenにOracle 用定義を追加する必要がある。 特に注意すべき定義について下記に列挙する。
| 定義 | Oracleでの定義内容 | コメント |
|---|---|---|
| SQL_ISOLATION | SET TRANSACTION ISOLATION LEVEL READ COMMITED; | アイソレーションレベル |
| START_TRAN | SET TRANSACTION READ ONLY; | トランザクション開始 |
| END_TRAN | COMMIT; | トランザクション終了 |
| SQL_COMMIT | (なし) | クエリ終了 |
| 定義 | Oracleでの定義内容 | コメント |
|---|---|---|
| GEN_QUERY_PLAN | EXPLAIN PLAN | クエリ実施計画の取得 |
| START_TRAN | SET TRANSACTION READ ONLY; | トランザクション開始 |
| END_TRAN | COMMIT; | トランザクション終了 |
| SET_DBASE | CONNECT username@dbt3; | データベース切り替え |
configure.ac は DBT-3 の設定を行う configure スクリプトを生成するためのソースである。
DBT-3 を Oracle に移植するにあたり、Oracle用にDBT-3を設定可能なように 以下の項目をconfigure.acに追加する必要がある。
DBT-3では、テスト実施時にテスト対象のデータベースが存在しない場合、データベースを生成する。 このための処理は create_db.sh スクリプトに記述されているので、Oracle用データベースを作成可能なように 修正する必要がある。
PostgreSQLやMySQLでは簡単なコマンドを実行するだけでデータベースを生成することができたが、 Oracleでは複雑な手順が必要となる。
Oracleでは Database Configuration Assistant(dbca)というデータベース生成 GUI ツールが用意されており、 このツールを利用して生成したデータベースと同じ設定のデータベースを生成するためのスクリプトを作成することができる。 この機能を利用し生成したスクリプトを create_db.sh から起動させることで、 データベースの生成を行うことができる。
PostgreSQLおよびMySQLではデータベース管理コマンドまたはデータベース起動用コマンドを利用して、 データベースの起動と停止が可能となっている。 Oracleでは、データベースの起動と停止は SQL*Plusコマンド から実施する必要がある。
$ sqlplus /NOLOG
sqlplus> CONNECT username/password AS SYSDBA;
sqlplus> STARTUP;
$ sqlplus username/password@dbname AS SYSDBA
sqlplus> SHUTDOWN IMMEDIATE;
PostgreSQLおよびMySQLではSQL文としてCSVデータのバルクインサートがサポートされている。 OracleではSQL文によるバルクインサートはサポートされておらず、 SQL*Loaderコマンドを利用する必要がある。 またSQL*Loaderのための制御ファイルが必要である。
SQL*Loader 利用例
$ sqlldr username/password control=customer.ctl
制御ファイル例: customer.ctl
-- customerテーブルにデータを投入する。 LOAD DATA INFILE 'customer.csv' INTO TABLE customer INSERT FIELDS TERMINATED BY '|' (c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_mktsegment, c_comment)
DBT-3のテストドライバでのクエリ実施は、任意行数のクエリを実施する場合と、 クエリが記述されたファイルを指定して実施する場合がある。Oracleでは どちらの場合も SQL*Plus コマンドを利用してクエリを実施する。
任意行数のクエリを実施する場合の例
sqlplus username/password || exit 1 << EOT
CREATE TABLE customer (
c_custkey INTEGER,
c_name ${VARCHAR}(25),
c_address ${VARCHAR}(40),
c_nationkey INTEGER,
c_phone CHAR(15),
c_acctbal FLOAT,
c_mktsegment CHAR(10),
c_comment ${VARCHAR}(117));
EOTファイルを指定してクエリを実施する場合の例
sqlplus username/password || exit 1 << EOT @query_file.sql EOT
Oracleデーターベースで統計情報を収集するため、Statspackの利用を検討する。
Statspackは、ある時点でのデータベース統計情報を収集したスナップショットとよばれるデータを蓄積し、 2つの異なるスナップショットを比較することでレポートを生成する。 各スナップショットは1から単純増加するスナップショットIDで識別される。 Statspackではスナップショップ・レベルに応じて以下の情報を収集することができる。
実際の移植および評価実施時には生成するレポートの粒度について検討が必要である。 レポートの粒度はスナップショットの取得タイミングに依存する。 考えられる取得タイミングは以下の通り。