DBT-3 Oracle移植可能性調査報告書

日本ヒューレット・パッカード株式会社

1.はじめに

本文書は PostgreSQL上で動作するOSDL DBT-3 version 1.9(以下DBT-3) の MySQL 移植作業を踏まえた、 Oracle 10gデータベースへの移植可能性の調査報告書である。

DBT-3のMySQLへの移植作業において明らかになった移植作業上の各ポイントについて列挙し、 その各々のポイントについてOracle 10gへ移植する場合の対応方法について調査を行った。

2.DBT-3について

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つの各テストで実施時間およびシステム状態、データベース統計情報を収集する。

  1. Loadテスト
    CSVデータをデータベースにバルクインサートする。
  2. Powerテスト
    22の複雑なクエリを実施する。
  3. Throughputテスト
    Powerテストと同じ22のクエリを1つ以上のプロセスで同時に実施する。

DBT-3は以下のコンポーネントから構成される。

  • テストドライバ(シェルスクリプト)
    • データベース非依存スクリプト
      • DBT-3メイン・テストドライバ
      • レポート生成スクリプト
      • システム統計情報収集スクリプト
      • その他
    • データベース依存スクリプト
      • データベース初期化スクリプト
      • Load/Power/Throughputの各テスト用スクリプト
      • データベース統計情報収集スクリプト
      • データベース起動・停止スクリプト
      • その他
  • 補助コマンド
    • 結果計算(power)
    • クエリ整形(get_statement)
    • 時刻取得(get_time)
    • テストデータ生成ツール(dbgen)
    • クエリテンプレート処理ツール(qgen)
  • クエリ
    • 対象データベース用の22のクエリ

3.Oracleへの移植ポイント概要

DBT-3をMySQLへの移植作業を踏まえ、Oracleへ移植する際に調査・修正対象となるポイントの概要は次の通りである。

  • (1)クエリの修正
    PowerテストおよびThroughputテストで利用する22のクエリおよびテストドライバ内で利用している各クエリについて、 Oracle SQL方言に対応するようにクエリを修正する必要がある。 特に以下の点には留意が必要である。
    • データ型
    • 日時処理
  • (2)クエリ整形ツールの修正
    クエリテンプレートを読み込み対象データベース用に整形するget_statementおよびqgenを Oracle SQL の構文に適合するよう修正する必要がある。
  • (3)スクリプトの修正
    以下の項目について Oracle に対応するための修正が必要である。
    • configure.acの対応
    • データベース生成手順
    • データベース起動・停止
    • CSVデータのバルクインサート
    • クエリの実施方法 (任意行数のクエリまたはファイル読み込みによる)
    • データベース統計情報の収集

4.Oracleへの移植ポイント詳細(1) : クエリの修正

4.1.データ型

データベーススキーマの各カラムのデータ型をOracleのデータ型にする必要がある。

PostgreSQLとOracleのデータ型マッピング
PostgreSQLOracleコメント
INTEGERNUMBER(10,0)4bytes符号付整数
REALFLOAT単精度浮動小数点
CHARCHAR固定長文字列
VARCHARVARCHAR2可変長文字列
DATEDATE年月日
TIMESTAMPTIMESTAMP(6)マイクロ秒の精度

4.2.日時処理

PostgreSQLとOracleでは以下の違いが存在するため、日時処理を行うクエリを修正する必要がある。

Oracleの日時処理:

  • シングルクォート ' でくくる範囲に day を含まない。
  • days(複数)ではなく、day(単数)である。
  例: l_shipdata <= date '1998-12-01' - interval '3' day

5.Oracleへの移植ポイント詳細(2) : クエリ整形ツールの修正

get_statement で各SQL文の行末処理が記述されている。 これをOracleに対応させる必要がある。

またget_statementおよびqgenでは、データベースの差異を吸収するために 定義を用いており、それを展開することでデータベースに応じたクエリ整形を行っている。 そのため、get_statementおよびqgenにOracle 用定義を追加する必要がある。 特に注意すべき定義について下記に列挙する。

注意すべき定義 (get_statement)
定義Oracleでの定義内容コメント
SQL_ISOLATIONSET TRANSACTION ISOLATION LEVEL READ COMMITED;アイソレーションレベル
START_TRANSET TRANSACTION READ ONLY;トランザクション開始
END_TRANCOMMIT;トランザクション終了
SQL_COMMIT(なし)クエリ終了

注意すべき定義 (qgen)
定義Oracleでの定義内容コメント
GEN_QUERY_PLANEXPLAIN PLANクエリ実施計画の取得
START_TRANSET TRANSACTION READ ONLY;トランザクション開始
END_TRANCOMMIT;トランザクション終了
SET_DBASECONNECT username@dbt3;データベース切り替え

6.Oracleへの移植ポイント詳細(3) : スクリプトの修正

6.1.configure.acスクリプト修正

configure.ac は DBT-3 の設定を行う configure スクリプトを生成するためのソースである。

DBT-3 を Oracle に移植するにあたり、Oracle用にDBT-3を設定可能なように 以下の項目をconfigure.acに追加する必要がある。

  • --with-oracleオプションの追加
    Oracle用のオプションを追加し、DBT-3をOracle用に初期化可能にする。
  • DBT-3が利用するOracle用ファイルのセットアップ処理の追加
    Oracleで利用するバイナリの検索処理および各種 Oracle用スクリプトファイルのセットアップ処理を追加する。

6.2.データベース生成手順について

DBT-3では、テスト実施時にテスト対象のデータベースが存在しない場合、データベースを生成する。 このための処理は create_db.sh スクリプトに記述されているので、Oracle用データベースを作成可能なように 修正する必要がある。

PostgreSQLやMySQLでは簡単なコマンドを実行するだけでデータベースを生成することができたが、 Oracleでは複雑な手順が必要となる。

Oracleでは Database Configuration Assistant(dbca)というデータベース生成 GUI ツールが用意されており、 このツールを利用して生成したデータベースと同じ設定のデータベースを生成するためのスクリプトを作成することができる。 この機能を利用し生成したスクリプトを create_db.sh から起動させることで、 データベースの生成を行うことができる。

6.3.データベースの起動・停止

PostgreSQLおよびMySQLではデータベース管理コマンドまたはデータベース起動用コマンドを利用して、 データベースの起動と停止が可能となっている。 Oracleでは、データベースの起動と停止は SQL*Plusコマンド から実施する必要がある。

  • 起動手順
    1. Oracle用に環境変数が設定されている必要がある。
    2. データベースに接続せずに SQL*Plus を起動する。
      $ sqlplus /NOLOG
    3. SYSDBAとしてOracleに接続する。
      sqlplus> CONNECT username/password AS SYSDBA;
    4. データベースを起動
      sqlplus> STARTUP;
  • 停止手順
    1. SQL*Plus を起動し、SYSDBAとしてOracleに接続
      $ sqlplus username/password@dbname AS SYSDBA
    2. データベースを停止
      sqlplus> SHUTDOWN IMMEDIATE;

6.4.CSVデータのバルクインサート

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)

6.5.クエリの実施方法

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

6.6.データベース統計情報の収集

Oracleデーターベースで統計情報を収集するため、Statspackの利用を検討する。

Statspackは、ある時点でのデータベース統計情報を収集したスナップショットとよばれるデータを蓄積し、 2つの異なるスナップショットを比較することでレポートを生成する。 各スナップショットは1から単純増加するスナップショットIDで識別される。 Statspackではスナップショップ・レベルに応じて以下の情報を収集することができる。

  • 基本統計情報
  • アドバイス情報
  • SQL統計情報
  • SQL詳細情報
  • セグメント情報
  • 親・子ラッチ情報

実際の移植および評価実施時には生成するレポートの粒度について検討が必要である。 レポートの粒度はスナップショットの取得タイミングに依存する。 考えられる取得タイミングは以下の通り。

  • 各テストの実施前後
    Loadテスト、Powerテスト、Throughputテストの各テスト実施時のレポートを生成する。
  • テスト実施時の任意間隔
    ユーザが指定する間隔でスナップショットを取得し、レポートを出力することで、 時間経過によるデータベース状態の推移を確認することができる。
  • クエリの実施前後
    各クエリの実施前後でのデータベース状態の変化を確認することができる。

7.関連文書