DoqueDB ユーザーズマニュアル

[トップページに戻る]
はじめに
マニュアルの見方
DoqueDBとは
全文検索エンジンとしての主な特徴
RDBMSとしての主な特徴
規約
1章 全文索引チュートリアル
1.1 書式
1.2 索引タイプ
1.3 遅延更新
1.4 ランキング検索
1.5 自然文検索
1.6 全文複合索引
2章 インストール
2.1 パッケージ
2.2 インストール
2.3 インストールファイル
2.4 syslogの使用
2.5 アンインストール
3章 サーバ管理
3.1 サービスの起動と停止
3.2 バージョン
3.3 パラメーター
3.3.1 パラメーターの格納場所
3.3.2 パラメーターの変更
3.3.3 デフォルトで設定されているパラメーター
3.3.4 チューニング用パラメーター
3.3.5 検索用パラメーター
3.3.6 ログ用パラメーター
3.4 組込みデータベースと組込み表
3.4.1 組込みデータベース
3.4.2 組込み表
3.5 ユーザー
3.5.1 ユーザー認証
3.5.2 ユーザー管理
3.5.3 パスワード変更
3.5.4 新規ユーザー作成
3.5.5 ユーザー削除
3.5.6 ユーザー権限管理
3.6 多言語対応
3.7 データベース構成ファイル
3.7.1 データベースパス
3.7.2 ファイル数
3.8 バックアップ
3.8.1 オンラインバックアップ
3.8.2 オフラインバックアップ
3.8.3 オフラインバックアップ(2)
3.8.4 リストア手順
3.8.5 データベースファイルのコピー
3.8.6 強制リストア手順
3.9 自動復旧
3.9.1 Not available
3.9.2 終了処理なしのプロセスの終了
3.9.3 自動復旧処理
3.10 ロールフォワードリカバリ
3.10.1 データベース属性の変更
3.10.2 ロールフォワードリカバリログ
3.10.3 ロールフォワードリカバリのためのバックアップ
3.10.4 ロールフォワードリカバリの実行
3.11 ログ
3.11.1 ログ出力設定
3.11.2 アクセスプラン
3.11.3 ログメッセージ
4章 クライアントインターフェース
4.1 バージョン
4.2 sqli
4.2.1 sqliの引数
4.2.2 sqliのコマンド
4.3 JDBC
4.3.1 JDBCのユーザー認証
4.3.2 JDBCのURL
4.3.3 JDBCのサンプルプログラム
5章 ロード/アンロードコマンド
5.1 ロードコマンド
5.1.1 実行コマンド
5.1.2 スクリプトファイルの作成
5.1.3 ロードファイルの用意
5.1.4 ロードの実行
5.1.5 ロードのログ
5.2 アンロードコマンド
5.2.1 実行コマンド
5.2.2 スクリプトファイルの作成
5.2.3 アンロードの実行
5.2.4 アンロードのログ
5.3 ロードファイル仕様
5.3.1 テキスト形式のロードファイル
5.3.2 XML形式のロードファイル
6章 SQL言語
6.1 定数および識別子
6.1.1 定数
6.1.2 識別子
6.1.3 キーワード
6.1.4 デリミタ
6.2 スカラ式
6.2.1 データ型
6.2.2 値指定
6.2.3 データベース名
6.2.4 表参照
6.2.5 列参照
6.2.6 全文検索結果参照
6.2.7 集合関数
6.2.8 数値関数
6.2.9 データ列値関数
6.2.10 日時値関数
6.2.11 値式
6.2.12 数値式
6.2.13 データ列値式
6.2.14 ブール値式
6.3 問合せ式
6.3.1 行値構成子
6.3.2 表値構成子
6.3.3 表式
6.3.4 結合表
6.3.5 問合せ式本体
6.3.6 副問合せ
6.4 述語
6.4.1 比較述語
6.4.2 BETWEEN述語
6.4.3 IN述語
6.4.4 LIKE述語
6.4.5 NULL述語
6.4.6 EXISTS述語
6.4.7 CONTAINS述語
6.4.8 CONTAINSオペランド
6.5 スキーマ定義
6.5.1 データベース定義
6.5.2 エリア定義
6.5.3 表定義
6.5.4 列定義
6.5.5 ヒント句
6.5.6 データベース定義変更
6.5.7 エリア定義変更
6.5.8 表定義変更
6.5.9 データベース削除
6.5.10 エリア削除
6.5.11 表削除
6.5.12 データベースマウント
6.5.13 データベースアンマウント
6.6 索引定義
6.6.1 B+木索引定義
6.6.2 全文索引定義
6.6.3 ビットマップ索引定義
6.6.4 配列索引定義
6.6.5 索引定義変更
6.6.6 索引削除
6.7 権限管理
6.7.1 GRANT文
6.7.2 REVOKE文
6.8 セッション管理
6.8.1 DISCONNECT文
6.8.2 シングルユーザーモード
6.9 トランザクション
6.9.1 SET TRANSACTION文
6.9.2 START TRANSACTION文
6.9.3 COMMIT文
6.9.4 ROLLBACK文
6.10 データ操作
6.10.1 バックアップ開始
6.10.2 バックアップ終了
6.10.3 整合性検査
6.10.4 INSERT文
6.10.5 UPDATE文
6.10.6 DELETE文
6.10.7 一括登録
6.11 問合せ
6.11.1 問合せ指定
6.12 分散マネージャー
6.12.1 子サーバーの定義
6.12.2 分散ルールの定義
6.12.3 関数の定義
6.12 非同期レプリケーション
6.13.1 スレーブデータベースの定義
6.13.2 一時停止と再開
6.13.3 マスターへの昇格
6.13.4 データベース構成
6.13.5 制限事項
附録
A. N-gram索引
B. ヒント句の使い方
C. LOB型の使い方
D. IDENTITY列の使い方
E. 異表記正規化辞書
F. 質問処理辞書
G. B+木索引の使い方
G.1 カラムサイズ
H. 全文索引の使い方
H.1 全文索引のスキーマ定義
H.2 全文索引の挿入
H.3 全文索引の問合せ
H.4 全文索引のランキング検索
H.5 全文索引の自然文検索
H.6 全文索引の拡張検索
H.7 全文索引のストップワード
I. 全文索引の遅延更新
J. ビットマップ索引の使い方
J.1 異なりデータ数
K. 複数インストール
L. 用語定義
M. 参考文献

はじめに

本書はDoqueDBのマニュアルです。 検索サーバーやRDBMSとしてDoqueDBをお使いいただくために必要な情報が書かれています。

マニュアルの見方

先頭から順番に読んでもかまいませんが、 目的に応じて以下のセクションを読むことをおすすめします。

DoqueDBとは
DoqueDBの主な特徴が書かれています。 DoqueDBにはじめて触れる方におすすめです。
1章 全文検索チュートリアル
DoqueDBとはであげた特徴のうち、全文索引の簡単な使い方が書かれています。 DoqueDBの全文検索について手早く理解したい方におすすめです。
3章 サーバ管理
サーバを管理するためのパラメーターの設定や ログの見方などが書かれています。 サーバ管理者の方々はひととおり目を通すことをおすすめします。

本書は、DBMSを使ったソフトウェアの開発経験や、 サーバ管理の経験のある方を対象としています。 そのため、ある程度の一般知識を前提とした記載があります。 未経験者の方はその他専門書等を参照することをおすすめします。

DoqueDBとは

DoqueDBはリコーで開発された全文検索エンジンであり、 情報検索システムで必要とされる優れた検索性能を提供します。 また、一般的なRDBMSとしての機能も有しています。

全文検索エンジンとしての主な特徴

DoqueDBの全文検索エンジンとしての特徴は以下のとおりです。

ランキング検索
独自のランキングアルゴリズムを用い、 検索結果を適合度の順に並べることができます。
自然文検索
検索語として文章を入れることができ、 システムが自動的に最適な検索語を抽出します。
関連語拡張
適合文書のフィードバックにより 自動的に関連性の高い検索語を追加することができます。
言語サポート
日本語、英語の2言語に対応しています。

RDBMSとしての主な特徴

DoqueDBはRDBMSとして非常に重要な以下の機能を有しています。

オンラインバックアップ
システムの運用を中断せずにバックアップが可能です。
自動リカバリー
不慮の電源断などのために 正常にシステムが終了しなかった場合でも、 システムの再起動時に自動的にデータベースの整合性を回復します。

また、SQLやJDBCを使用したアクセスが可能であり、 高速に全文検索可能な情報検索アプリケーションを容易に構築できます。

規約

本書は、構文、入力例、プログラム等の説明にBNFの記法を用いた表記を使っています。 BNFにはいくつかの記法がありますが、 本書は標準SQL:2003で使われているBNFに従っています。 以下に本書が用いている特殊な意味をもった記号をあげます。

<>
これに囲まれた文字列は、非終端記号を意味します。 リテラルではありません。たとえば、実際の入力等では、 その文字列が説明するものに置き換えて入力する必要がります。
[]
これに囲まれた文字列は、省略可能であることを意味します。
{}
これに囲まれた文字列は、グルーピングされていることを意味します。
|
左側の文字列と右側の文字列が、選択可能であることを意味します。
...
直前の(グルーピングされた)文字列が、1回以上繰り返されることを意味します。

また、BNF以外では以下の記号に特殊な意味を持たせています。

「」
前後の文字列との区切りを明確にしたいときに加えて、 これに囲まれた文字列は、リテラルであることを意味します。(非終端記号は除きます)
読点としての使用に加えて、 列挙されたリテラルを区切るために使うことがあります。

1章 全文索引チュートリアル

本章では、データベースの基本的な知識を持つ人を対象として、 全文索引の簡単な使用方法を記載しています。

DoqueDBには豊富な全文検索機能があります。 全文検索は、全文索引を定義することにより利用可能となります。 全文索引は転置ファイル形式の索引ファイルになっており、 確率モデルに基くスコアを取得することができます。 詳細については、附録全文索引の使い方を参照してください。

1.1 書式

全文索引は、文字列型または配列文字列型のカラムに定義することができます。 SQL構文は以下のようになっています。

create fulltext index <索引名> <表名> on <索引要素リスト>
 [ <言語列指定> ] [ <スコア調整列指定> ] [ <ヒント句> ] [ <索引エリア句> ]
<索引要素リスト>
文字列型または配列文字列型のカラムを指定します。 B+木索引と違い複合索引は定義できません。
<言語列指定>
LANGUAGE型のカラムを指定します。
<スコア調整列指定>
float型のカラムを指定します。
<ヒント句>
全文索引の動作を規定するための情報を指定します。
<索引エリア句>
現在のバージョンでは未サポートです。

詳細については、全文索引定義ヒント句を参照してください。

1.2 索引タイプ

全文索引は3つの索引タイプをサポートしており、 索引タイプによって検索動作が変わってきます。

NGRAM
文字列タイプの索引(N-gram索引)で、文字列検索を行えます。
WORD
単語タイプの索引で、単語単位検索を行えます。
DUAL
文字列と単語の機能を持つ索引です。

索引タイプの指定は <ヒント句> で行います。 たとえば、word索引を定義するには以下のように記述します。

SQL> create fulltext index I on T(C) hint 'inverted=(indexing=word)';

1.3 遅延更新

転置ファイルという構造は、 その特性上、ファイルサイズが大きくなると更新に非常に時間がかかるようになります。 DoqueDBの全文索引は、小さいサイズの小転置ファイルと、 大きなサイズの大転置ファイルを保持し、更新時間の増大を抑えることができます。 この指定は <ヒント句> で行います。

SQL> create fulltext index I on T(C) hint 'delayed';

遅延更新の指定は、オプションです。 遅延更新の詳細については全文索引の遅延更新を参照してください。

1.4 ランキング検索

与えられた検索条件などに合致したものを、 適合度の順にランキングして提示することができます。 ランキング検索を行うには、 検索条件に対する各テキストデータのスコアを計算する関数 score() を selectリストに追加します。 次のSQL文では、表 T の列 data に対し、単語「システム」による ランキング検索を行います。

SQL> select rowid, score(data) from T
      where data contains 'システム' order by score(data) desc;

ランキング検索の結果は、仮想的な列 score が追加された行の集合となります。 列 score には、 関数 score() が算出した、各テキストデータの検索条件への適合度を示す値が 入ります。

1.5 自然文検索

検索条件に自然文を利用する検索を、自然文検索と呼びます。 自然文検索を行うには、containsオペランドでfreetextを指定します。 次のSQL文では、 自然文「リコーの環境保護への取り組み」による自然文検索を行います。

SQL> select rowid, score(data) from T
      where data contains freetext('リコーの環境保護への取り組み')
       order by score(data) desc;

自然文検索の仕組みは以下のようになっています。

  1. 検索語の抽出。 検索条件である自然文に対して形態素解析を行い、自動的に検索語を抽出する。
  2. 検索語への重み付け。 抽出された検索語に応じて個々の検索語に重みを付ける。
  3. 検索条件の生成。 各語をOR演算子で連結した検索条件を生成する。
  4. ランキング検索の実行。 得られた検索条件をランキング検索で実行する。

1.6 全文複合索引

複数のカラムを指定して1つの全文索引を定義することができます。 これにより、複合索引の対象カラムの任意の組み合わせで擬似的に 連結した文字列に対して検索することが可能となります。 たとえば、ある表に、タイトル、要約、本文と3つのカラムがあったとします。 これまでは、これらのカラムを別々の検索項目としてランキング検索する場合と、 これらのカラムの文字列を連結したものを対象としてランキング検索する場合があるとき、 これらのカラムを連結したカラムを用意する必要がありました。 しかし、この全文複合索引を定義すれば、連結したカラムを用意する必要がなくなり、 ディスクスペースを節約し、更新処理を高速にすることが可能となります。

SQL> create table T(title nvarchar(128), abstract ntext, body ntext);
SQL> create fulltext index T_ALL on T(title, abstract, body)
       hint 'delayed, inverted=(indexing=dual, tokenizer=DUAL:JAP:ALL:2)';
SQL> select title from T where (title, abstract, body) contains 'システム'
       order by score(title, abstract, body) desc;

2章 インストール

DoqueDBのインストール方法とパッケージ内容を説明します。

DoqueDBを1つのサーバに複数インストールすることも可能です。 詳細については、附録複数インストールを参照してください。

2.1 パッケージ

DoqueDBのインストールパッケージはdoquedb-<バージョン>.<アーキテクチャー>.tar.gzです。 パッケージには以下のファイルとディレクトリが含まれています。

ファイル名・
ディレクトリ名
説明
README.txt 最初に読むべき文書です。
conf.sh インストールパスや、設定用のパラメーターが記述されているファイルです。
install.sh インストールスクリプトです。 インストールパス等の情報は、conf.sh を参照しています。
setup.sh インストール後にDoqueDBのセットアップを行うスクリプトです。 必要なパラメーターがパラメーターファイルに書き込まれ、 データベースの初期化が行われます。
unsetup.sh アンインストール前にDoqueDBのアンセットアップを行うスクリプトです。 全データベースを削除します。
uninstall.sh アンインストールスクリプトです。
doquedb.sh DoqueDBデーモンの開始・停止を行うスクリプトDoqueDBの雛形です。 install.shはこのファイルを参照し、DoqueDBスクリプトを作成します。
Sqli.sh SQLインタプリターであるスクリプトsqliの雛形です。
UserAdd.sh
UserDel.sh
UserPassword.sh
ユーザー管理を行うスクリプトuseradd, userdel, userpasswordの雛形です。
load.sh
unload.sh
一括ロード/アンロードを行うスクリプトdqload, dqunloadの雛形です。
dump.sh
restore.sh
データベースのバックアップとリストアを行うスクリプトです。 詳細は 3.9.5 データベースファイルのコピー をご覧ください。
obj/bin/ DoqueDBデーモン、SQLインタプリター、ユーザー管理プログラムなどの 各種実行ファイルが格納されているディレクトリです。
obj/data/ 形態素解析、異表記正規化、質問処理の辞書が格納されているディレクトリです。
obj/etc/ サーバの初期設定ファイルが格納されているディレクトリです。
obj/java/ 一括ロード/アンロードを実行するjarファイルが格納されているディレクトリです。
obj/lib/ DoqueDBの各種ライブラリーが格納されているディレクトリです。 C++クライアントプログラムを作成する際に使用するライブラリーも格納されています。
jdbc/
hibernate/
JDBCドライバー、Hibernateダイアレクトファイルが格納されているディレクトリです。 対応するjavadoc形式のリファレンスマニュアルも含まれています。
doc/ サンプルプログラムが格納されているディレクトリです。
LICENSES/ DoqueDBが使用するOSSのライセンス情報が格納されているディレクトリです。 詳細についてはNOTICE.txtをご覧ください。

2.2 インストール

DoqueDBのインストール手順を説明します。

  1. doquedb-<バージョン>.<アーキテクチャー>.tar.gzを展開し、ディレクトリdoquedbに移動します。
    $ sudo su -
    # tar xvf doquedb-<バージョン>.<アーキテクチャー>.tar.gz
    ...
    # cd doquedb
    
  2. conf.shにはインストール時に必要な各種設定が記述されています。 必要に応じて内容を変更してください。
    デフォルトのインストールディレクトリは/var/lib/DoqueDB、 データベースディレクトリは/var/lib/DoqueDB/dbです。 データベースをほかのファイルシステムに置きたければ、 databasepathを変更してください。
    # vi conf.sh
    
  3. install.shを実行します。
    # ./install.sh
    Install Objects
    
    必要なファイルが、インストールディレクトリにインストールされます。
  4. setup.shを実行します。データベースの初期化を行います。
    # ./setup.sh
    Install Mod Parameter
    Install Default Parameter
    Install System Parameter
    Initialize Database
    
    デフォルトのデータベースパスは<インストールディレクトリ>/dbです。
  5. binに移動します。 デフォルトのbinディレクトリは、<インストールディレクトリ>/binです。
    # cd /var/lib/DoqueDB/bin
    
  6. DoqueDBデーモンを開始します。 引数startを指定して実行すると、DoqueDBデーモンが開始されます。 DoqueDBデーモンはDoqueDBが提供するサービスの本体です。 以降ではDoqueDBデーモンの起動・終了を「サービスの起動・終了」と呼ぶことがあります。
    # ./doquedb start
    SydServer starting (root) ... done.
    
  7. リブート時のための設定を行います。 リブート時に自動的にDoqueDBデーモンを立ち上げるように設定するには、以下も実行します。
    # ln -s /var/lib/DoqueDB/bin/doquedb /etc/rc3.d/S99doquedb
    # ln -s /var/lib/DoqueDB/bin/doquedb /etc/rc4.d/S99doquedb
    # ln -s /var/lib/DoqueDB/bin/doquedb /etc/rc5.d/S99doquedb
    # ln -s /var/lib/DoqueDB/bin/doquedb /etc/rc6.d/K01doquedb
    # ln -s /var/lib/DoqueDB/bin/doquedb /etc/rc2.d/K01doquedb
    # ln -s /var/lib/DoqueDB/bin/doquedb /etc/rc1.d/K01doquedb
    # ln -s /var/lib/DoqueDB/bin/doquedb /etc/rc0.d/K01doquedb
    

2.3 インストールファイル

インストール後のDoqueDBのファイルについて説明します。 <インストールディレクトリ>以下の構成は以下のようになります。

<インストールディレクトリ>/
 ├ bin/
 │  └ java/
 ├ data/
 ├ db/
 ├ doc/
 │  └ sample/
 ├ etc/
 ├ lib/
 ├ log/
 ├ LICENSES/
 │  └ NOTICE.txt
 ├ README.txt
 └ README_ja.txt
bin/
実行ファイルなどがインストールされます。 主な実行ファイルは以下のとおりです。
ファイル名 説明
doquedb DoqueDBデーモン起動スクリプト
sqli SQLインタプリター
userpassword
useradd
userdel
ユーザー管理コマンド
  • パスワード変更
  • 新規ユーザー作成
  • ユーザー削除
dqload
dqunload
一括ロード/アンロードコマンド
bin/java/
JDBCドライバなどのjarファイルがインストールされます。
data/
形態素解析と異表記正規化、質問処理に使われる辞書がインストールされます。 詳細については、附録異表記正規化辞書質問処理辞書を参照してください。
db/
標準設定でインストールを行うと、ここにデータベースディレクトリが作られます。
doc/
パッケージに含まれるサンプルプログラムがコピーされます。
etc/
パラメーターファイルがインストールされます。 各ファイルの説明は以下のとおりです。
ファイル名 説明
default.conf
mod.conf
system.conf
パラメーターファイル
  • DoqueDBパラメーター
  • C++標準ライブラリパラメーター
user.pswd ユーザのパスワード保存ファイル
lib/
ライブラリファイルがインストールされます。 各ファイルの説明は以下のとおりです。
ファイル名 説明
libSyKernel.so DoqueDBカーネル
libSyDrvAry.so
libSyDrvBmp.so
libSyDrvBtr.so, libSyDrvBtr2.so
libSyDrvFts.so, libSyDrvFts2.so
libSyDrvInv.so
libSyDrvKtr.so
libSyDrvLob.so
libSyDrvRcd.so, libSyDrvRcd2.so
libSyDrvVct.so, libSyDrvVct2.so
libSyDrvCom.so
各種ファイルドライバー
  • 配列索引ファイル
  • ビットマップ索引ファイル
  • B木索引ファイル
  • 全文索引ファイル
  • 転置ファイルカーネル
  • KD木索引ファイル
  • LOBファイル
  • レコードファイル
  • ベクターファイル
  • 共通部
libSyMesEng.so
libSyMesJpn.so
メッセージライブラリー
  • 英語
  • 日本語
libDoqueDB.so DoqueDBクライアントライブラリー
libenstem.so
libunajp.so
libuna.so
言語処理ライブラリー
  • 英語ステミング
  • 形態素解析
  • 上位層
libcommon.so C++共通ライブラリー
libboost_system.so.<バージョン>
libboost_filesystem.so.<バージョン>
Boost C++ライブラリー
(NOTICE.txtをご覧ください)
log/
ログファイルが出力されます。 各ファイルの説明は以下のとおりです。
ファイル名 説明
doquedb.log ログファイル
doquedb.pid DoqueDBデーモンのプロセスID (起動時に作成されます)

2.4 syslogの使用

インストール時、DoqueDBのログファイルは、 /var/lib/DoqueDB/log/doquedb.logに書き出すように設定されます。 このログファイルは、DoqueDBデーモン起動中にローテートすることができません。 しかし、DoqueDBはログをsyslogに書き出すことができます。 この機能を使用して、ログファイルをローテートします。

  1. DoqueDBパラメーターファイルの修正。 default.confのエントリーを、以下のように修正します。
    Common_MessageOutputError   ModErrorMessage
    Common_MessageOutputInfo    ModMessage
    
  2. 下位ライブラリーパラメーターファイルの修正。 mod.confのエントリーを、以下のように修正します。
    ModMessageOutputError   4
    ModMessageOutputNormal  4
    
  3. syslogの設定変更。 /etc/syslog.conf (または/etc/rsyslog.conf) に、以下の内容を追加します。
    local0.info         /var/log/doquedb.log
    
    さらに、*.err(なければ *.info)のselectorフィールドに、local0.noneを追加します。
    *.err;local0.none   /var/log/system.log
    
  4. syslogdの停止。 syslogdにHUPシグナルを送信します。
    # kill -HUP <syslogdのプロセスID>
    
  5. syslogのローテート設定。 /etc/logrotate.d/syslogの一行目の'{'の直前に、以下の文を追加します。
    /var/log/doquedb.log
    

2.5 アンインストール

DoqueDBのアンインストール手順を説明します。

  1. DoqueDBデーモンを停止します。
    $ sudo su -
    # cd /var/lib/DoqueDB/bin
    # ./doquedb stop
    SydServer stopping (root) .... done.
    
  2. doquedb-<バージョン>.<アーキテクチャー>.tar.gzを展開します。 インストール時に展開したものがある場合は不要です。
    # tar xvf doquedb-<バージョン>.<アーキテクチャー>.tar.gz
    ...
    # cd doquedb
    
  3. conf.shを変更します。 conf.shの内容を変更してインストールした場合は、同様に変更します。
    # vi conf.sh
    
  4. unsetup.shおよびuninstall.shを実行します。
    # ./unsetup.sh
    Uninstall Database
    # ./uninstall.sh
    Uninstall Objects
    
    手動でも削除できます。 その場合は、<インストールファイル>をすべて削除してください。
    # rm -fr /var/lib/DoqueDB
    
  5. リブート時用の設定を削除します。 リブート時、自動的にDoqueDBデーモンが起動するように設定した場合は、 その設定ファイルをすべて削除します。
    # rm /etc/rc3.d/S99doquedb
    # rm /etc/rc4.d/S99doquedb
    # rm /etc/rc5.d/S99doquedb
    # rm /etc/rc6.d/K01doquedb
    # rm /etc/rc2.d/K01doquedb
    # rm /etc/rc1.d/K01doquedb
    # rm /etc/rc0.d/K01doquedb
    

3章 サーバ管理

DoqueDBのサーバ管理方法を説明します。

3.1 サービスの起動と停止

サービスを起動あるいは停止したり、 サービスの状態を確認するにはdoquedbコマンドを使用します。
doquedbの実行にはroot権限が必要です。

$ sudo su -
#

コマンドの書式を以下に示します。

doquedb { start | stop | restart | status | reload | clean_temporary }

オプションの意味は以下のとおりです。

start
サービスを起動します。実行結果は以下のようになります。
# /var/lib/DoqueDB/bin/doquedb start
SydServer starting (<実行ユーザー>) ... done.  (サービスが起動した)
  または
SydServer (pid <プロセスID>) is already running.  (サービスはすでに実行中)
stop
サービスを停止します。
# /var/lib/DoqueDB/bin/doquedb stop
SydServer stopping (<実行ユーザー>) .... done.  (サービスが停止した)
  または
SydServer is not started.  (サービスは実行中でない)
restart
サービスを再起動します。
# /var/lib/DoqueDB/bin/doquedb restart
SydServer stopping (<実行ユーザー>) .... done.  (サービスが停止した)
SydServer starting (<実行ユーザー>) ... done.  (サービスが起動した)
  または
SydServer is not started.  (サービスは実行中でない)
SydServer starting (<実行ユーザー>) ... done.  (サービスが起動した)
status
サービスの起動状況を表示します。
# /var/lib/DoqueDB/bin/doquedb status
SydServer (pid <プロセスID>) is running.  (サービスは実行中)
  または
SydServer is not started.  (サービスは実行中でない)
  または
SydServer dead, but <PIDファイル> exists.  (サービスは起動していないがPIDファイルがある)
reload
パラメーターの変更を起動中のサービスに反映します。
# /var/lib/DoqueDB/bin/doquedb reload
SydServer reload (pid <プロセスID>)  (サービスのリロードを実行した)
  または
SydServer is not started.  (サービスは実行中でない)
clean_temporary
サービスが起動していないにも関わらず残っている DoqueDBデーモンのプロセスIDファイルを削除します。
# /var/lib/DoqueDB/bin/doquedb clean_temporary
SydServer (pid <プロセスID>) is running.  (サービスは実行中)
  または
SydServer is not started.  (サービスは実行中でない)
  または
SydServer dead, but <PIDファイル> exists.  (PIDファイルを削除した)

3.2 バージョン

DoqueDBのサーバのバージョンを確認する方法について説明します。

確認方法は以下のとおりです。

ログ
サーバ起動時にログに出力されます。

クライアントについては4章 クライアントインターフェースバージョンを参照してください。

なお、上記方法で確認できるバージョン番号と、 2章 インストールパッケージ等で使われるバージョン番号の採番方法は異なります。

3.3 パラメーター

DoqueDBで指定できるパラメーターについて説明します。

3.3.1 パラメーターの格納場所

パラメーターの格納場所は以下のとおりです。

<インストールディレクトリ>/etc/default.conf

3.3.2 パラメーターの変更

パラメーターの変更は、サービスを再起動後に反映されます。 ただし、以下のパラメーターはサービス再起動しても反映されない場合があります。

詳細については、B+木索引定義を参照してください。

3.3.3 デフォルトで設定されているパラメーター

インストール時にすでに設定されているパラメーターについて説明します。

パラメーター名 説明
Schema_DefaultAreaPath 文字列 データベースを格納するデフォルトのパス
Schema_SystemAreaPath 文字列 データベースのスキーマ情報を格納するデフォルトのパス
Trans_TimeStampPath 文字列 DoqueDBのタイムスタンプファイルのパス
Common_UnaResource_1 文字列 異表記正規化に使用する辞書のパス
Inverted_TermResource_0 文字列 質問処理に使用する辞書のパス
Inverted_TermResource_1 文字列 質問処理に使用する辞書のパス
Common_MessageOutputError 文字列 エラーレベルのログの出力先
Common_MessageOutputInfo 文字列 情報レベルのログの出力先
Communication_PortNumber 数値 DoqueDBのポート番号
Server_PasswordFilePath 文字列 ユーザーのパスワードを保管するファイルのパス

異表記正規化辞書、質問処理辞書の詳細については、 附録異表記正規化辞書質問処理辞書を参照してください。

3.3.4 チューニング用パラメーター

チューニング用のパラメーターについて説明します。

パラメーター名 デフォルト値 単位 説明
Buffer_NormalPoolSize 文字列 1G byte 通常のデータベースに使用するバッファサイズを指定
Buffer_ReadOnlyPoolSize 文字列 64M byte 読み出し専用データベースに使用するバッファサイズを指定
Buffer_TemporaryPoolSize 文字列 64M byte 一時表に使用するバッファサイズを指定
Inverted_BatchSizeMax 文字列 512M byte 全文索引再構成時に一時的に使用するメモリーのサイズを指定
Checkpoint_Period 数値 1800000 ミリ秒 チェックポイントの間隔を指定

DoqueDBのプロセスは、 Buffer_NormalPoolSizeで指定したサイズ+40~100MB程度のメモリを消費します。 DoqueDB専用マシンでは、Buffer_NormalPoolSizeを 空き実メモリーの1/2程度に設定してください。 なお、256MBより小さい値を設定することはできません。

Buffer_NormalPoolSizeは、挿入データのサイズに制限を与えます。 この値より1レコードのサイズが大きいデータは挿入できません。 ただしLOB型は既存のデータに新しいデータを追加することができるので、 この値より大きいサイズのデータを格納できます。 詳細については、附録LOB型の使い方を参照してください。 また、ビットマップ索引で異なりデータ数が多いデータも挿入できません。 詳細については、附録ビットマップ索引の使い方を参照してください。

Buffer_TemporaryPoolSizeは、一時表のデータサイズに制限を与えます。 一時的に保持されるレコードの合計サイズがこの値より大きい一時表は作成できません。

デフォルトのチェックポイント間隔は30分です。 しかし、DoqueDBはデータ更新サイズに応じてチェックポイントの間隔を可変にしていますので、 データ更新が多い場合は、それよりも早くチェックポイントが発生します。

チェックポイントの間隔を制御するのは Checkpoint_Period ですが、 チェックポイントの間隔を固定にすることはできません。

3.3.5 検索用パラメーター

検索用のパラメーターについて説明します。

パラメーター名 デフォルト値 説明
Execution_LikeNormalizedString 数値 (下記参照) 索引を使用しないlike演算処理の正規化方法と、B+木索引の正規化方法を指定する。
0
正規化しない
1
大文字/小文字の同一視、半角カタカナ/全角カタカナの同一視、ひらがな/カタカナの濁点/半濁点の合字処理、半角記号/全角記号の同一視(ASCII範囲の記号のみ)をする
2
(未サポート)
3
上記1に加え、半角全角スペースと、ひらがな/カタカナの同一視をする

Execution_LikeNormalizedStringのデフォルト値は、 正規化の適用対象により異なります。 索引を使用しないLIKE演算処理の正規化方法のデフォルト値は、「0」です。 B+木索引の正規化方法のデフォルト値は、「1」です。

B+木索引の正規化は、B+木索引定義時に<ヒント句>を設定する必要があります。

3.3.6 ログ用パラメーター

ログ用のパラメーターについて説明します。

パラメーター名 デフォルト値 説明
Plan_TraceOptimizationOutput 文字列 0 アクセスプランの出力先ファイル名
0
出力しない
Plan_TraceExecutionOutput 文字列 0 実行トレースの出力先ファイル名。実行トレースは主にデータベースを構成するファイルへの入出力操作のログ。
0
出力しない
Plan_TraceLevel 数値 0 どの程度の詳しさで出力するかをコントロールする数値を指定。数値が大きいほど詳細になる。通常は 2 を指定する。
Statement_KeepSQLStatement 文字列 false サーバーが受け取ったSQL文の文字列をパーズ後も保持し続けることを指示
true
保持
false
パーズ後に破棄
Server_PrintSQLStatement 文字列 0 受け取ったSQL文の文字列の出力先ファイル名
0
出力しない
Server_PrintParameter 文字列 0 「?」を使ったSQL文やPreparedStatementに対して渡されたパラメーターの出力先ファイル名
0
出力しない
Server_PrintTime 文字列 0 SQL文1つごとの実行時間の出力先ファイル名
0
出力しない
出力内容は、以下の3つにより構成される。
  • Optimizer Time (最適化にかかった時間)
  • Executor Time (実行にかかった時間)
  • Worker Time (トータルの時間)
Server_PrintSessionID 文字列 0 セッションIDの出力先ファイル名
0
出力しない

3.4 組込みデータベースと組込み表

DoqueDBには組込みデータベースと組込み表が用意されています。 これらを用いて、SQL文でスキーマ情報を取得することができます。

3.4.1 組込みデータベース

組込みデータベースとして、以下のものが用意されています。

データベース名 説明
$$SYSTEMDB ユーザー定義のデータベースを管理する、読み取り専用のメタデータベースです。
組込み表SYSTEM_DATABASEはこのデータベースからのみ参照できます。
DefaultDB デフォルトで用意されている、内容が空のデータベースです。
任意の目的に利用できますが、削除しないでください。

3.4.2 組込み表

組込み表として、以下のものが用意されています。 SYSTEM_DATABASE, SYSTEM_USER, SYSTEM_SESSIONはシステム全体で共有する情報を保持する表です。 それ以外は個々のデータベースに割り当てられた情報を保持します。

表名 保持する情報 どのデータベースから参照可能か?
$$SYSTEMDB DefaultDB
ユーザー定義のDB
SYSTEM_DATABASE システム内のデータベース ×
SYSTEM_USER システム内のユーザー
SYSTEM_SESSION システムで実行中のセッション
SYSTEM_PRIVILEGE データベースに対するロール ×
SYSTEM_TABLE データベース内の表 ×
SYSTEM_COLUMN データベース内の列 ×
SYSTEM_INDEX データベース内の索引 ×
SYSTEM_FILE データベースの構成ファイル ×

それぞれの組込み表は以下に示す列を持っています。 列名の [ ] はその列が配列であることを示します。

SYSTEM_DATABASE:システム内のデータベース
列名 説明
ROWID データベースのID
Name データベースの名称
Flag データベースの属性
Paths [3] データベースのファイルのパス
  • データ
  • スキーマ
  • 論理ログ
MasterURL 非同期レプリケーション構成時のマスターデータベースのURL
SYSTEM_USER:システム内のユーザー
列名 説明
UserID ユーザーのID
Name ユーザー名
Type ユーザー種別 (0:スーパーユーザー, 1:一般ユーザー)
SYSTEM_SESSION:システムで実行中のセッション
列名 説明
ClientID クライアントのID (データソースごとに決められる)
HostName クライアントのホスト名称
ConnectedTime 最初に接続した日時
ProtocolVersion プロトコルバージョン
CryptMode 暗号化方式の名称
※OSS版では暗号化通信は無効化されています。
SessionID セッションのID
DatabaseName データベースの名称
UserName ユーザーの名称
SessionStartTime セッション開始日時
StatementType 実行中のSQL文の種別
TransactionState トランザクションの状態 (NotInProgress:未実行, ReadWrite:更新中, ReadOnly:参照中, VersionUse:版使用中)
TransactionStartTime トランザクション開始日時
SqlStatement 実行中のSQL文
SYSTEM_PRIVILEGE:データベースに対するロール
列名 説明
UserID ユーザーのID
Privilege 割り当てられているロール名
ObjectType ロールの対象となるオブジェクト種別 (現状は常にnull)
ObjectID ロールの対象となるオブジェクトの名称 (現状は常にnull)
SYSTEM_TABLE:データベース内の表
列名 説明
ROWID 表のID
Name 表の名称
AreaID [7] エリアのID
  • [0]:デフォルト
  • [1]~[3]:未使用
  • [4]:HEAPファイル
  • [5]:INDEXファイル (通常の索引ファイル)
  • [6]:FULLTEXTファイル (全文検索用の索引ファイル)
SYSTEM_COLUMNデータベース内の列
列名 説明
ROWID 列のID
ParentID 列が属する表のID
Name 列の名称
Type 列の種別 (1:ROWID, 2:通常列, 3:定数列, 4:関数列)
Position 表の中での列の定義順
FieldID 列に対応するFIELDオブジェクトのROWID (通常、クライアントは使わない)
Default 列のデータのデフォルト値 (列定義に<DEFAULT句>があった場合)
Flag 列の属性 (0:制限なし, 奇数:NOT NULL, 6か7:無制限可変長, 8か9:FIXED, 10か11:VARIABLE)
MetaData 文字列配列形式にしたJavaのColumnMetaData
SYSTEM_INDEX:データベース内の索引
列名 説明
ROWID 索引のID
ParentID 索引が属する表のID
Name 索引の名称
Type 索引の種別 (1:B+木索引, 2:全文索引, 3:ビットマップ索引, 4:配列索引)
Flag 索引の属性 (0:何もなし, 1:Unique)
FileID 索引の情報を格納するファイルのID
AreaID [7] エリアのID (索引を構成するファイルの置き場所)
HintString 索引のヒント情報
SYSTEM_FILE:データベースの構成ファイル
列名 説明
ROWID ファイルのID
ParentID ファイルが属する表のID
Name ファイルの名称
Type ファイルの種別 (1:レコードファイル, 2:B+木ファイル, 3:全文ファイル, 4:ベクターファイル,
5:LOBファイル, 6:ビットマップファイル, 7:配列ファイル)
FileID ファイルの生成情報を保持するバイナリデータ (通常、クライアントは使わない)
AreaID [7] エリアのID
  • [0]:ファイルの置き場所
  • [1]~[6]:未使用
FileSize データ取得時のファイルサイズ

$$SYSTEMDBおよび「使ってみよう」 のサンプルデータベースに接続して組込み表を表示した例を示します。 (見やすくするため、適宜空行を挿入してあります。)

$ sqli -remote localhost 54321 -user root -password <rootのパスワード> -database '$$SYSTEMDB'

SQL> select * from system_database;
{Name,Flag,Paths,MasterURL}
{DefaultDB,2,(null),(null)}
{sampleSqli,2,(null),(null)}

SQL> select * from system_user;
{UserID,Name,Type}
{0,root,0}
{100,dbadmin,1}
{200,dbuser,1}
{201,abc,1}

SQL> select * from system_session;
{ClientID,HostName,ConnectedTime,ProtocolVersion,CryptMode,SessionID,DatabaseName,UserName, SessionStartTime,StatementType,TransactionState,TransactioStartTime,SqlStatement}
{131,<ホスト名>,2023-06-26 15:27:50.443,4,(null),145,$$SYSTEMDB,root,2023-06-26 15:27:50.444,QueryExpression,VersionUse,2023-06-26 15:28:19.276,select * from system_session}

SQL> exit;

$ sqli -remote localhost 54321 -user root -password <rootのパスワード> -database sampleSqli

SQL> select * from system_privilege;
{UserID,Privilege,ObjectType,ObjectID}
{0,{system_operations,database_operations,data_operations,reference_operations},(null),(null)}
{100,{database_operations,data_operations,reference_operations},(null),(null)}
{200,{data_operations,reference_operations},(null),(null)}

SQL> select * from system_table;
{Name,AreaID}
{AozoraBunko,{4294967295,4294967295,4294967295,4294967295,4294967295,4294967295,4294967295}}

SQL> select * from system_column;
{ParentID,Name,Type,Position,FieldID,Default,Flag,MetaData}
{2,ROWID,1,0,12,size=8,8,{12,int,4,0,0,(null),(null)}}
{2,docId,2,1,16,size=8,9,{12,int,10,0,0,(null),(null)}}
{2,title,2,2,17,size=8,10,{4,nvarchar,256,0,0,(null),(null)}}
{2,lastName,2,3,18,size=8,10,{4,nvarchar,128,0,0,(null),(null)}}
{2,firstName,2,4,19,size=8,10,{4,nvarchar,128,0,0,(null),(null)}}
{2,url,2,5,20,size=8,10,{2,varchar,128,0,0,(null),(null)}}
{2,content,2,6,21,size=8,10,{4,nvarchar,-1,0,0,(null),(null)}}

SQL> select * from system_index;
{ParentID,Name,Type,Flag,FileID,AreaID,HintString}
{2,AozoraBunko_$$PrimaryKey,1,5,25,(null),(null)}
{2,INDEX1,2,0,31,(null),'kwic, delayed, inverted=(normalized=(stemming=false, deletespace=false), indexing=dual, tokenizer=DUAL:JAP:ALL:1 @NORMRSCID:1 @UNARSCID:1)'}

SQL> select * from system_file;
{ParentID,Name,Type,FileID,AreaID,FileSize}
{2,BTR_AozoraBunko_$$PrimaryKey,2,size=259,(null),16384}
{2,RCD_AozoraBunko,1,size=459,(null),24264704}
{2,VCT_AozoraBunko_$$Conversion,4,size=180,(null),32768}
{2,FTS_INDEX1,3,size=1299,(null),19423232}

SQL> exit;

3.5 ユーザー

DoqueDBのユーザーの取扱いについて説明します。

3.5.1 ユーザー認証

DoqueDBに接続する際は、ユーザー名とパスワードを指定する必要があります。 指定方法は4章 クライアントインターフェースを参照してください。

3.5.2 ユーザー管理

インストール時は、固定のスーパーユーザー(root)だけが登録されており、 そのパスワードには初期値(doqadmin)が設定されています。 パスワードの変更やユーザーの追加削除は、次節以降で説明するコマンドにより行います。 パスワードは、デフォルトで設定されているパラメーターのServer_PasswordFilePathが 示すファイルに保管されます。

rootは以下の操作を実行できます。

root以外の一般ユーザーは以下の操作を実行できます。

新規に作成するユーザー名には以下の制限があります。

3.5.3 パスワード変更

パスワードを変更するにはuserpasswordコマンドを使用します。
コマンドの書式は以下のとおりです。

userpassword -remote <ホスト名> <ポート番号> [-user <ユーザー名> -password <パスワード>] [オプション]

一般ユーザーは自身のパスワードを変更できます。 スーパーユーザー(root)は任意のユーザーのパスワードを変更できます。 パスワードは対話的に2回の入力が求められます。
引数の書式と説明は以下のとおりです。

-remote <ホスト名> <ポート番号>
接続するDoqueDBサーバーのホスト名とポート番号を指定します。
-user <ユーザー名> -password <パスワード>
スーパーユーザーとして実行する場合、 スーパーユーザーのユーザー名(root)とパスワードを指定します。
-chusername <ユーザー名>
スーパーユーザーとして実行する場合、パスワードを変更するユーザー名を指定します。 省略すると起動後に入力を促すプロンプトが表示されます。
-help
コマンドの使用方法が表示されます。

一般ユーザーが自身のパスワードを変更する例を以下に示します。

$ userpassword -remote localhost 54321
User: <ユーザー名>
Password: <現在のパスワード>
New password: <新しいパスワード>
Retype new password: <パスワード再入力>
Changed a password.

スーパーユーザーが別ユーザーのパスワードを変更する例を以下に示します。

$ userpassword -remote localhost 54321 -user root -password <rootのパスワード>
user name to change a password: <パスワードを変更するユーザー名>
New password: <パスワード>
Retype new password: <パスワード再入力>
Changed a password.

3.5.4 新規ユーザー作成

新規ユーザーを作成するにはuseraddコマンドを使用します。 useraddコマンドを実行できるのはスーパーユーザーだけです。
コマンドの書式は以下のとおりです。

useradd -remote <ホスト名> <ポート番号> -user <ユーザー名> -password <パスワード> [オプション]

引数の書式と説明は以下のとおりです。

-remote <ホスト名> <ポート番号>
接続するDoqueDBサーバーのホスト名とポート番号を指定します。
-user <ユーザー名> -password <パスワード>
スーパーユーザーのユーザー名(root)とパスワードを指定します。
-username <ユーザー名>
新規作成するユーザー名を指定します。 省略すると起動後に入力を促すプロンプトが表示されます。
-userid <ユーザーID>
新規作成するユーザーのユーザーIDを指定します。 省略すると起動後に入力を促すプロンプトが表示されます。 何も入力せずに「Enter」を押すと、ユーザーIDが自動的に割り振られます。
-help
コマンドの使用方法が表示されます。

新規作成されたユーザーにはパスワードとロールが設定されていません。 userpasswordコマンドでパスワードを設定してください。 ロールは、あるデータベースに対してそのユーザーがもつ操作権限を示します。 ロールの設定については3.5.6 ユーザー権限管理を参照してください。
新規ユーザーの作成とパスワードの設定、またロールの設定を行う例を以下に示します。

$ useradd -remote localhost 54321 -user root -password <rootのパスワード>
add user: newuser
user id: <Enter>
Create a user.
$ userpassword -remote localhost 54321 -user root -password <rootのパスワード>
user name to change a password: newuser
New password: <パスワード>
Retype new password: <パスワード再入力>
Changed a password.
$ sqli -remote localhost 54321 -user root -password <rootのパスワード> -database <データベース名>
SQL> grant data_operations,reference_operations to newuser;
SQL> exit;

3.5.5 ユーザー削除

ユーザーを削除するにはuserdelコマンドを使用します。 userdelコマンドを実行できるのはスーパーユーザーだけです。
コマンドの書式は以下のとおりです。

userdel -remote <ホスト名> <ポート番号> -user <ユーザー名> -password <パスワード> [オプション]

引数の書式と説明は以下のとおりです。

-remote <ホスト名> <ポート番号>
接続するDoqueDBサーバーのホスト名とポート番号を指定します。
-user <ユーザー名> -password <パスワード>
スーパーユーザーのユーザー名(root)とパスワードを指定します。
-username <ユーザー名>
削除するユーザー名を指定します。 省略すると起動後に入力を促すプロンプトが表示されます。
-revoke
削除ユーザーのすべてのデータベースに対する権限を削除します。 省略すると起動後に入力を促すプロンプトが表示されます。
-help
コマンドの使用方法が表示されます。

実行例を以下に示します。

$ userdel -remote localhost 54321 -user root -password <rootのパスワード>
delete user: <削除するユーザー名>
The authority of all DB is deleted automatically.
OK? [y/n]: y
Delete a user.

3.5.6 ユーザー権限管理

各データベースには以下のロールが定義されています。

これらのロールを一般ユーザーに割り当てることで、 一般ユーザーが実行できるSQL文を制御します。 SQL文と権限の関係は以下のとおりです。

SQL文 スーパーユーザー 一般ユーザー
system_
operations
database_
operations
data_
operations
reference_
operations
ロールなし
CREATE DATABASE          
MOUNT          
DISCONNECT          
DROP DATABASE        
ALTER DATABASE        
UNMOUNT        
START BACKUP        
END BACKUP        
GRANT        
REVOKE        
CREATE TABLE        
DROP TABLE        
ALTER TABLE        
ALTER INDEX        
CREATE AREA        
DROP AREA        
ALTER AREA        
VERIFY        
CREATE CASCADE        
ALTER CASCADE        
DROP CASCADE        
CREATE PARTITION        
ALTER PARTITION        
DELETE        
INSERT        
UPDATE        
CREATE INDEX        
DROP INDEX        
CREATE FUNCTION        
DROP FUNCTION        
SELECT        
CREATE TABLE(一時表に対して)        
DROP TABLE(一時表に対して)        
DELETE(一時表に対して)        
INSERT(一時表に対して)        
UPDATE(一時表に対して)        
SELECT(データベース一覧に対して)
START TRANSACTION
COMMIT
ROLLBACK
SYNC
CHECKPOINT

以下の点に注意してください。

一般ユーザに対するロールの付与と削除は、 rootやsystem_operationsのロールを持つユーザーであれば、 SQLのGRANT文で行うことができます。 詳細については権限管理を参照してください。
以下の点に注意してください。

3.6 多言語対応

DoqueDBのデータベース名などには、マルチバイト文字が使えます。 また、NCHAR、NVARCHARなどの国際文字列型の列には、多国語のデータを格納できます。

しかし、DoqueDBが検索においてもサポートしている言語、 すなわち異表記正規化辞書をもつのは、 日本語と英語の2言語に限られます。

全文索引作成時にどの言語の異表記正規化辞書を使うかは、 索引作成時の言語指定や異表記正規化辞書の明示的な指定によって決まります。 ここで、たとえば言語指定と索引を作成する列データの言語が合わないと、 単語への切り出しや異表記正規化のルールも合わないことになります。 しかし、索引の作成でエラーにはなりません。 合わないなりに何らかの切り出しが行われ、索引が作成されます。 この場合は、検索するとき、 言語指定や使用する異表記正規化辞書を索引作成時と同じにすると、 ヒットする可能性が高くなります。 なお、全文索引作成時や検索で、言語指定などがされないときは、 <ヒント句>の<UNAリソース指定>で指定された辞書のデフォルト言語が使用されます。

また、全文索引の自然文検索は英語と日本語のみのサポートです。

3.7 データベース構成ファイル

DoqueDBのデータベースを構成するファイルについて説明します。

3.7.1 データベースパス

DoqueDBのデータベースを構成するファイルは、 デフォルトで設定されているパラメーターの Schema_DefaultAreaPath、Schema_SystemAreaPath、Trans_TimeStampPath が指定するパスに作成されます。

個々のデータベースのパスを指定したい場合は、データベース定義を参照してください。 個々のデータベースのパスを変更したい場合は、 データベース定義変更を参照してください。

個々の表や索引のパスを指定したい場合は、エリアを使います。 エリア定義表定義索引定義を参照してください。 個々の表や索引のパスを変更したい場合は、 エリア定義変更表定義変更索引定義変更を参照してください。

3.7.2 ファイル数

データベースを構成するファイル数は、スキーマに依存します。 格納データ数には依存しません。

3.8 バックアップ

DoqueDBのバックアップは、以下の二種類の操作が可能です。

バックアップ方法 説明
オンラインバックアップ データベースへのアクセスを許したままのバックアップ。特徴は以下のとおりです。
  • サービスの24時間運転が可能になる
  • バックアップにかかる時間が長くなる
  • バックアップ中のデータベースに対する操作が遅くなる
  • コピーを行うバックアップツールがファイルを排他的にオープンするようなタイプの場合、データベースに対する操作がエラーになる可能性がある
オフラインバックアップ データベースへのアクセスを停止してのバックアップ。特徴は以下のとおりです。
  • 比較的簡単にバックアップの実行ができる
  • バックアップ中のデータベース操作ができない。

本節では、オンラインおよびオフラインによるバックアップ手順と、 バックアップしたデータベースを通常の方法でリストアする手順、 また正常ではない手順で取得されたバックアップファイルを 強制的にリストアする手順を説明します。

3.8.1 オンラインバックアップ

オンラインバックアップは以下の手順で実施します。

  1. トランザクションの開始。
    ロールフォワードリカバリを行うためには、discard snapshotオプションをつけて 実行する必要があり、そのためには read write トランザクションを実行する 必要があります。
    SQL> start transaction read write;
    
  2. start backup文の実行。
    上記1.で開始したトランザクション内で実行します。
    SQL> start backup discard snapshot;
    
    start backup文の返り値として、 コピーすべきディレクトリのパス名一覧が取得できます。
  3. 外部ツールによるコピー。
    上記1.で開始したトランザクションが継続している状態で、 外部ツールによりデータベースを構成するファイルをコピーします (3.8.5 データベースファイルのコピー)。
  4. end backup文の実行。 コピーが完了したら1.で開始したトランザクション内で実行します。
    SQL> end backup;
    
  5. トランザクションの終了。
    SQL> commit;
    

3.8.2 オフラインバックアップ

データベース「DB」をオフラインバックアップする手順を以下に示します。

  1. データベースのoffline化。
    対象となるデータベースをロックしているトランザクションが存在する場合にはエラーになります。
    SQL> alter database DB offline;
    
  2. 外部ツールによるコピー。
    データベースを構成するファイルをコピーします (3.8.5 データベースファイルのコピー)。
  3. データベースのonline化。
    SQL> alter database DB online;
    

オンライン、オフラインにかかわらず、 ファイルのコピーには外部ツールを用いる必要があります。

3.8.3 オフラインバックアップ(2)

データベース「DB」をアンマウントしてオフラインバックアップすることもできます。

  1. unmount文の実行。
    SQL> unmount DB;
    
    unmount文の返り値として、コピーすべきディレクトリーのパス名一覧が取得できます。
  2. 外部ツールによるコピー。
    データベースを構成するファイルをコピーします (3.8.5 データベースファイルのコピー)。
  3. mount文の実行。
    コピーが完了したら以下を実行します。
    SQL> mount DB path '/{インストールディレクトリ}/db/data/DB'
            logicallog '/{インストールディレクトリ}/db/data/DB'
            system '/{インストールディレクトリ}/db/system/DB';
    
    データベースの作成時と異なり、mountに渡すパスはデータパス、論理ログパス、システムパスのすべてを指定する必要があります。 データパス、システムパスが誤っていてもエラーになりません。 データがまったく登録されていない、あるいは表がまったく定義されていないものと解釈されます。

3.8.4 リストア手順

DoqueDBではバックアップファイルに対して以下の2種類の操作が可能です。

リストア
運用中のデータベースの内容を破棄してバックアップした時点に戻す操作
マウント
運用中のデータベースの内容を保持したまま、 バックアップした時点のデータベースを新たなデータベースとして別途登録する操作

また、オンラインバックアップとオフラインバックアップの どちらのバックアップ操作で得られたバックアップファイルに対しても 同様の操作でリストアまたはマウントが可能です。

データベース「DB」をリストアする手順を以下に示します。

  1. リストア対象のデータベースを破棄します。
    drop database文により破棄した場合、 これ以降のリストア処理が失敗するとDBの内容は完全に失われます。
    SQL> drop database DB;
    
    それを避けたい場合は、drop database文の代わりに unmount文を実行してからデータベースを構成するファイルを退避してください。
    SQL> unmount DB;
    
  2. バックアップしたデータベースのコピー。
    外部ツールによりバックアップファイルをデータベースパスの位置に戻します (3.8.5 データベースファイルのコピー)。
  3. mount文の実行。
    SQL> mount DB path '/{インストールディレクトリ}/db/data/DB'
            logicallog '/{インストールディレクトリ}/db/data/DB'
            system '/{インストールディレクトリ}/db/system/DB';
    

マウントは以下の手順で実施します。

  1. バックアップファイルをコピーします。
    外部ツールにより、バックアップファイルをバックアップ時とは異なる場所 (たとえばnewDBフォルダ)にコピーします (3.8.5 データベースファイルのコピー)。
  2. mount文の実行。 新しいデータベース名「newDB」を用いて実行します。
    SQL> mount newDB path '/{インストールディレクトリ}/db/data/newDB'
            logicallog '/{インストールディレクトリ}/db/data/newDB'
            system '/{インストールディレクトリ}/db/system/newDB';
    

これらの手順は、オンラインバックアップにて 正常な手順で作成されたバックアップファイルに対する手順です。 正常な手順で作成されていないバックアップファイルに対しては、 次節に示すように、強制的にリストアする方法があります。

3.8.5 データベースファイルのコピー

データベースファイルをバックアップあるいはリストアする際に必要なのは、 データベースパス以下のファイルをまるごと任意のディレクトリにコピーし、 あるいはその逆を行うことです。 パッケージにはそのためのスクリプトdump.sh、restore.shが含まれています。

dump.shはデータベースパスにあるすべてのファイルを、 インストールディレクトリの指定したサブディレクトリ(省略時はsave)にコピーします。 dump.shはインストールディレクトリやデータベースパスを取得するために、 パッケージディレクトリのconf.shを参照します。

$ ./dump.sh
(データベースパス以下のファイルを<インストールディレクトリ>/saveにコピーします。)

$ ./dump.sh backup
(データベースパス以下のファイルを<インストールディレクトリ>/backupにコピーします。)

restore.shはインストールディレクトリの指定したサブディレクトリ (省略時はsave)にあるすべてのファイルを、データベースパスにコピーします。 restore.shはインストールディレクトリやデータベースパスを取得するために、 パッケージディレクトリのconf.shを参照します。

$ ./restore.sh
(<インストールディレクトリ>/save以下のファイルをデータベースパスにコピーします。)

$ ./restore.sh backup
(<インストールディレクトリ>/backup以下のファイルをデータベースパスにコピーします。)

インストールディレクトリ以外の場所にデータベースファイルをコピーしたり、 あるいは書き戻したりしたい場合は、dump.shやrestore.shの内容を見て、 同様の処理を行ってください。

3.8.6 強制リストア手順

正常な手順で得られたバックアップファイルでないデータベースファイルを用いて、 強制的にリストアすることができます。 動作は保証できませんが、たとえば、何らかの原因により データベース一覧を管理するメタデータベースが異常な状態になったが、 個別のデータベースは救いたい、といったケースでは有用です。

以下の手順で実施します。

  1. バックアップファイルをコピーします。
    外部ツールにより、正常な手順で得られていないバックアップファイルを 取得時とは異なる場所(たとえばnewDBフォルダ)にコピーします (3.8.5 データベースファイルのコピー)。
  2. mount文の実行。 新しいデータベース名「newDB」を用いて with recoveryオプション付きで実行します。
    SQL> mount newDB path '/{インストールディレクトリ}/db/data/newDB'
            logicallog '/{インストールディレクトリ}/db/data/newDB'
            system '/{インストールディレクトリ}/db/system/newDB' with recovery;
    

3.9 自動復旧

本節では障害発生後の再起動で実施する自動復旧処理について記述します。 DoqueDBは、プロセスが異常終了した後のプロセス再起動時に、 自動的にデータベースを使用可能な状態にします。 管理者の作業は必要ありません。 以下では自動復旧処理が必要になる具体的なケースと、 自動復旧処理について説明します。

3.9.1 Not available

DoqueDBではプロセスが致命的な異常状態になったときに、 データベースが壊れるような状態にならないように、 発生以後のデータベース操作を一切行わなくなります。 致命的な異常状態になるのは以下のようなケースがあります。

この状態になるとデータベース操作を行おうとしても 「Database is not available」または「Server is not available」という例外が 発生して操作できません。 この状態になっていることは、ログをチェックすることで確認できます。

Not availableな状態は正常に動作している状態ではないので、 このプロセスの終了は異常終了であり、 終了後の再起動で自動復旧が行われることになります。

3.9.2 終了処理なしのプロセスの終了

DoqueDBプロセスが正常終了した場合、終了処理の中で論理ログにその旨記録します。 終了処理が行われないでプロセスが終了した場合、 次のプロセスの起動時に前回異常終了したと判断され、自動復旧が行われます。 終了処理が行われないのは以下のようなケースがあります。

3.9.3 自動復旧処理

自動復旧処理は以下のような手順で行われます。

  1. サービスの起動。
  2. 論理ログのチェック。 最後尾に正常終了したことを示す記録がなければ、 以降の復旧処理を開始する。
  3. 論理ログのスキャン。 論理ログを最後からスキャンし、 整合性の取れたデータがファイルにフラッシュされている時点 (最後から2つ目のチェックポイント処理)を求める。
  4. データベースイメージの復旧。 物理ログを使用して、3.で求めた時点に戻す。
  5. UNDO処理。 論理ログをスキャンして、3.で求めた時点に実行中のトランザクションで、 異常終了時までにコミットされなかったものの中で実行された更新操作を取り消す。
  6. REDO処理。 論理ログをスキャンして、3.で求めた時点に実行中のトランザクションで 異常終了時までにコミットされたものの中で実行された更新操作を再実行する。

上記手順の結果、異常終了時までにコミットされていたトランザクションが 実行された状態に回復します。 自動復旧が正常に実行されたかどうかは ログにDatabase recoveredと出力されたことで確認できます。

3.10 ロールフォワードリカバリ

ロールフォワードリカバリは、バックアップとロールフォワードリカバリログから データベースを最新の状態に復旧するための機能です。 ロールフォワードリカバリはデータベース単位でON/OFFすることができます。 本節ではロールフォワードリカバリの使用方法について説明します。

3.10.1 データベース属性の変更

データベースはデフォルトの状態では、ロールフォワードリカバリ機能が OFFになっています。ロールフォワードリカバリ機能をONにするには、 データベースのリカバリ属性を FULL に変更する必要があります。

SQL> alter database TEST recovery full;

データベース作成時に指定することも可能です。

SQL> create database TEST recovery full;

データベースを一度 unmount すると、リカバリ属性指定は失われます。 mount 時にリカバリ属性を指定する必要があります。

SQL> mount database TEST path '...' logicallog '...' system '...' recovery full;

3.10.2 ロールフォワードリカバリログ

データベースのロールフォワードリカバリログは、論理ログと兼用されます。 よって、データベース作成時の論理ログ格納パス指定で指定したパスにある LOGICALLOG.SYD および LOGICALLOGDIR フォルダー内のファイルがそれにあたります。

<論理ログ格納パス>
 ├ LOGICALLOG.SYD
 └ LOGICALLOGDIR/
     ├ LOGFILE1.SYD
     ├ LOGFILE2.SYD
     │  ・
     │  ・
     │  ・
     └ LOGFILEM.SYD

3.10.3 ロールフォワードリカバリのためのバックアップ

ロールフォワードリカバリでサポートされるバックアップ手段は、以下のものです。

バックアップが成功した場合、それまでのロールフォワードリカバリは 不要になりますので、古いロールフォワードリカバリログを削除します。

3.10.4 ロールフォワードリカバリの実行

適切な手段でバックアップしたデータベースと、別途保存されている ロールフォワードリカバリログからロールフォワードリカバリを行う方法を説明します。

  1. バックアップしたデータベースをコピー 適切な手段でバックアップしたデータベースをコピーします。
  2. ロールフォワードリカバリログのコピー バックアップ時のロールフォワードリカバリログをいったん削除し、 最新のログで上書きしてください。
  3. ロールフォワードリカバリの実行 ロールフォワードリカバリの実行は mount コマンドで行います。
    SQL> mount TEST_R path '...' logicallog '...' system '..' recovery full with recovery;
    

3.11 ログ

何らかの障害が発生したとき、 DoqueDBが出力するログを見ることは原因究明に役立ちます。 本節では、アクセスプランやSQL文のトレースを出力する方法を説明します。

DoqueDBが出力するログの格納場所およびファイル名については、 インストールファイルを参照してください。

3.11.1 ログ出力設定

ログ用パラメーターを設定することで、ログに出力する内容を変更することができます。

たとえば、どのセッションが実行したSQL文かを区別したい場合は、 以下のパラメーターを設定します。

これらの設定によるパフォーマンスの低下はわずかですので、 設定されることをおすすめします。

また、アクセスプランを確認したい場合は、以下のパラメーターを設定します。

ただし、アクセスプランの出力は、 パフォーマンスを大きく低下させることに注意してください。

3.11.2 アクセスプラン

以下では、アクセスプランの見かたを説明します。

たとえば以下のように定義されたスキーマがあるとします。

SQL>create table t (f int );
SQL>create index i on t(f);

これに対して普通のselect文を実行すると以下のように出力されます。

SQL>select * from t;
(Output[collection: STREAM]
    (Projection[t.f[retrieve]]
        t
                [ScanPlan
                    (ScanFile(RCD_t))]))

木構造がインデントによって表された形で出ます。 最後の「ScanPlan」がスキャンアクセスのプランになったことを示し、 「ScanFile(RCD_t)」がレコードファイルからスキャンしていることを示します。

order by が付いている場合は以下のようになります。

SQL>select f from t order by f;
(Output[collection: SORTED [1:0]]
    t
            [ScanPlan
                (ScanFile(RCD_t))])
(Output[collection: STREAM]
    (Projection[t.f[retrieve]]
        Input[collection: SORTED [1:0]]))

ソートするために索引を使えないので、 RCD_tからスキャンしていったん溜めるプランと、 ソートしたものから取得してクライアントに返すプランの2つがあります。 「collection: SORTED」は、 メモリ上でソートするためにいったん貯めていることを意味します。 「collection: STREAM」は、クライアントに返すことを意味します。

order by と同時に f に対する条件がついていると以下のようになります。

SQL>select f from t where f > 0 order by f;
(Output[collection: STREAM]
    (Projection[t.f[retrieve]]
        t[order by:(t.f[retrieve])]
                [SearchPlan
                    (SearchFile[cond][sorted](BTR_i)
                           {(GreaterThan
                                t.f
                                0)})]))

今度はソートするために索引を使えるので、 BTR_i から直に取得するプランだけになります。 「SearchFile[cond][sorted](BTR_i)」が、 BTR_i に対して条件が指定され([cond])、ソート順も指定され([sorted])、 取得されることを示します。

3.11.3 ログメッセージ

ここでは主なログメッセージを説明します。 ログには[INFO]と[ERR]の二種類があります。 以下に主な[INFO]のログメッセージをあげます。

[INFO] Server initialized
サーバーが処理を受け付ける状態になったことを示します。
[INFO] Server terminated
正常終了したことを示します。
[INFO] Checkpoint occurred
チェックポイント処理が行われたことを示します。
[INFO] Database recovered
自動復旧処理が行われ、成功したことを示します。

以下に主な[ERR]のログメッセージをあげます。

[ERR] Recovering database ‘<データベース名>’ failed.
データベースの自動復旧に失敗したことを示します。 このログが出ていても、他のデータベースの復旧に成功した場合は Database recoveredのログがこの後に出力されます。 この場合、復旧に失敗したデータベースは使用できませんが、 他のデータベースは使用できます。
[ERR] Database ‘<データベース名>' is not available
[ERR] Server is not available
前述のように、これらの出力があったら 一切の問い合わせを受け付けない状態になっているため、 サービスの停止および再開が必要です。
[ERR] Database '<データベース名>' may be corrupted
データベースを構成するファイルに整合性がなくなっていることを示します。 データベースが壊れている可能性が高いです。 自動復旧を試みた後に再度この出力が出たら壊れていると判断すべきです。
[ERR] Data in bad page <整数値> of file <パス名>
データベースを構成するファイルのうち <パス名>の位置に示されるものの中身が不正な状態を示します。 データベースが壊れている可能性が高いです。 自動復旧を試みた後に再度この出力が出たら壊れていると判断すべきです。
[ERR] Not enough space on the disk
ディスク容量の不足を示します。
[ERR] Can’t allocate memory
メモリ確保に失敗したことを示します。
[ERR] Unexpected exception
予期せぬ例外が発生したことを意味します。プログラムの不具合の可能性が高いです。 多くの場合データベースは壊れておらず、自動復旧で回復します。

4章 クライアントインターフェース

ここでは、DoqueDBが提供するクライアントインターフェースについて説明します。

4.1 バージョン

DoqueDBのクライアントのバージョンを確認する方法について説明します。

MANIFEST.MF
JDBCのバージョンはdoquedb.jar内のMANIFEST.MFに記載されています。

サーバについては3章 サーバ管理バージョンを参照してください。

なお、上記方法で確認できるバージョン番号と、 2章 インストールパッケージ等で使われるバージョン番号の採番方法は異なります。

4.2 sqli

sqliとは、SQL文を実行するDoqueDBのクライアントコマンドです。 sqliシェルスクリプトが実行ファイルです。

sqliの実行方法は以下の3通りあります。

また、sqliは複数のクライアントを立ち上げて、 サーバに同時アクセスすることができます。

4.2.1 sqliの引数

以下ではsqliの引数を説明します。 コマンドの書式は以下のとおりです。

sqli [オプション] [ファイル名]

引数の書式と説明は以下のとおりです。

-remote <ホスト名> <ポート番号>
接続するDoqueDBサーバーのホスト名とポート番号を指定します。
-database <データベース名>
接続するデータベース名を指定します。 省略した場合には、組込みデータベースであるDefaultDBに接続します。 1つのsqliは、1つのデータベースにしかアクセスできません。
-user <ユーザー名>
接続するユーザー名を指定します。 省略すると起動後に入力を促すプロンプトが表示されます。
-password <パスワード>
ユーザー認証のためのパスワードを指定します。 省略すると起動後に入力を促すプロンプトが表示されます。
-sql <SQL文>
コマンドラインに与えられた、SQL文を実行します。
-code utf-8
入出力の文字コードにUTF-8を指定します。 省略するとEUCが使われます。
-time
1文ごとにその実行時間が出力されます。 出力される実行時間の分解能はOSに依存します。 出力される時間は、SQL文をサーバに送信してから、 すべての結果を取得するまでの時間です。
ファイル名
SQL文およびsqliのコマンドが記述されたファイルを指定します。 ファイル名と-sqlオプションのどちらも指定されなかった場合は、 対話的に実行されます。

4.2.2 sqliのコマンド

sqliは、DoqueDBで使用できるすべてのSQL文を実行可能です。 SQL文の区切りには、<セミコロン>を使用します。

SQL> SELECT * FROM T;

sqliの組込みコマンドとして、exitがあります。 以下のように入力することによって、sqliを終了できます。

SQL> EXIT;

また、Ctrl+Dでも終了できます。

4.3 JDBC

DoqueDBのJDBCドライバーについて説明します。 JDBCドライバーは、DoqueDBサーバーに対して、 JavaクライアントがJDBCによるアクセスを行うのに必要なドライバーです。 詳細については、DoqueDB JDBC Driverを参照してください。

4.3.1 JDBCのユーザー認証

DoqueDBのユーザー認証は以下のメソッドを使います。

java.sql.Driver.connect(url_, info_)

<ユーザー名>および<パスワード>はinfo_のプロパティとして設定します。

4.3.2 JDBCのURL

DoqueDBのJDBCのURLは、以下のとおりです。

jdbc:ricoh:doquedb://<ホスト名>:<ポート番号>/<データベース名>

<データベース名>には接続先のデータベース名を指定します。 create databaseを実行するときは、組み込みデータベースDefaultDBに接続してください。 <データベース名>を省略するとDefaultDBを指定したことになります。

4.3.3 JDBCのサンプルプログラム

JDBCのサンプルプログラムです。

Class.forName("jp.co.ricoh.doquedb.jdbc.Driver");
String url = "jdbc:ricoh:doquedb://localhost:54321/DefaultDB";
String user = "user1";
String password = "";
Connection conn = DriverManager.getConnection(url, user, password);
Statement state = conn.createStatement();
ResultSet resultSet = state.executeQuery("SELECT * FROM T");
int count = 0;
while (resultSet.next() == true)
    count++;
resultSet.close();
state.close();
conn.close();
System.out.println("count = " + count);

5章 ロード/アンロードコマンド

JDBC経由でデータをロード/アンロードするコマンドが用意されています。 これらのコマンドを使うためにはJava実行環境が必要です。

5.1 ロードコマンド

ロードコマンドはデータをテーブルにロードします。 ロードコマンドを実行するには、 ロードスクリプトファイルとロードするレコードデータファイルが必要です。

5.1.1 実行コマンド

ロードコマンドには引数として、 レコードデータファイルを記述したスクリプトファイルとデータベース接続情報を指定します。

ロードコマンドは<インストールディレクトリ>/binにあります。
使い方は以下のとおりです。

dqload <スクリプトファイル名> <ユーザー名> <パスワード>

5.1.2 スクリプトファイルの作成

スクリプトファイルには、ロードに必要な情報を記述します。

指定できるキーと値は以下のとおりです。

キー名 内容 デフォルト値 備考
HOSTNAME 接続先のホスト名 大文字小文字を区別します。
PORT 接続先のポート番号 数字以外を記述した場合、例外の処理はJDBCに任せます。
DATABASE ロード先のデータベース名 大文字小文字を区別します。
FORMAT ロードファイル形式 TEXT TEXTと記述するとテキスト形式でロードファイルを読み込みます。
XMLと記述するとXML形式のロードファイルを読み込みます。
大文字小文字は区別しません。
FORMATにより読み込む拡張子が異なります。
TEXTのときは拡張子「.dat」が対象です。
XMLのときは拡張子「.xml」が対象です。
DIRECTORY ロードファイルがある場所 カレントディレクトリ フルパスで正確に指定してください。
存在しない場合はエラーになります。
LOAD_CODE ロードする文字コード UTF-8 以下のいずれかを指定してください。
  • UTF-8
  • EUC-JP
  • Shift_JIS
このキーワードはFORMATがTEXTのときのみ有効です。
FORMATがXMLの場合、XML宣言で指定される文字コードが有効となり、 本キーワードは無視されます。
FILES ロードするファイル名 DIRECTORYのすべてのファイル ロードするファイル名を記述します。 FILES=以降にあるすべての行のファイル名が対象になります。
  例)FILES=table1.xml table2.xml table3.xml
  例)FILES=
        table1.xml
        table2.xml
        table3.xml
ファイル名を指定しない場合、 DIRECTORYで指定したディレクトリにあるすべてのファイルを処理します。
注意)FILESは最後のキーとして指定してください。
注意)対象ファイル名はキーワードFORMATの仕様に従ってください。
備考)DIRECTORYを基準とした相対パスが指定可能ですが、上位パスはサポートしていません。 たとえば../../table.xmlは対象外です。/data/table.xmlはサポートします。

ロードスクリプトの記述例を以下に示します。

#************************************
#* database information
#************************************
HOSTNAME=localhost
PORT=54321
DATABASE=Cabinet1

#************************************
#* FORMAT: load file format
#* text: text file (.dat)
#* xml: xml file (.xml)
#* default: text
#************************************
FORMAT=TEXT

#************************************
#* DIRECTORY: load directory
#* default: current directory
#************************************
DIRECTORY=/work/load

#************************************
#* LOAD_CODE: load file encoding
#* default: system code
#************************************
LOAD_CODE=UTF-8

#************************************
#* FILES: load file
#************************************
FILES=
table1-text.dat
table2-text.dat

5.1.3 ロードファイルの用意

5.3 ロードファイル仕様を参照し、ロードファイルを作成してください。

5.1.4 ロードの実行

実行コマンドを入力します。以下に実行例を示します。

$ dqload load_script.txt root <rootのパスワード>

実行結果が表示されます。 エラーが出力された場合は、表示された内容またはロードのログを参考に、 スクリプトファイルまたはロードファイルを修正してください。

5.1.5 ロードのログ

ロードのログは、load.log.0という名前でカレントディレクトリに保存されます。 ~.0から~.9の最大10個のファイルをローテーションして使い、 ひとつのファイルは上限の1MBに達するまで続けて書き込まれます。 ~.9まで使い切ったときは、~.0を上書きします。

5.2 アンロードコマンド

アンロードコマンドはテーブル内のデータをファイルに書き出します。 アンロードコマンドを実行するには、アンロードスクリプトファイルが必要です。

5.2.1 実行コマンド

アンロードコマンドには引数として、 出力するテーブルなどを記述したスクリプトファイルとデータベース接続情報を指定します。

アンロードコマンドは<インストールディレクトリ>/binにあります。
使い方は以下のとおりです。

dqunload <スクリプトファイル名> <ユーザー名> <パスワード>

5.2.2 スクリプトファイルの作成

スクリプトファイルには、アンロードに必要な情報を記述します。

指定できるキーと値は以下のとおりです。

キー名 内容 デフォルト値 備考
HOSTNAME 接続先のホスト名 大文字小文字を区別します。
PORT 接続先のポート番号 数字以外を記述した場合、例外の処理はJDBCに任せます。
DATABASE アンロード元のデータベース名 大文字小文字を区別します。
FORMAT アンロード形式 TEXT TEXTと記述するとテキスト形式でアンロードファイルを作成します。
XMLと記述するとXML形式でアンロードファイルを作成します。
大文字小文字は区別しません。
DIRECTORY アンロードファイルの出力先 カレントディレクトリ フルパスで正確に指定してください。
ディレクトリが存在しない場合は作成します。
作成できない場合のみエラーなります。
UNLOAD_CODE アンロードする文字コード UTF-8 以下のいずれかが指定できます。
  • UTF-8
  • EUC-JP
  • Shift_JIS
このキーワードはFORMATがTEXTのときのみ有効です。
FORMATがXMLの場合、XML宣言で指定される文字コードが有効となり、 本キーワードは無視されます。
TABLE アンロードするテーブル名 アンロードするテーブル名を記述します。 TABLE=以降にあるすべての行のテーブル名が対象になります。
  例)TABLE=table1 table2 table3
  例)TABLE=
        table1
        table2
        table3
バイナリデータなど巨大なデータを別ファイルとしてアンロードすることができます。 その場合、テーブル名に括弧を付けて括弧内に「列名:拡張子」を記述します。 たとえばtable1の列cと列eを別ファイルにアンロードするには以下のようにします。
  例)TABLE=table1(c:doc,e:bmp) table2 table3
このとき、メインのアンロードデータは以下のようになります。
  a,b,/work/table1.1.c.1.doc,d,/work/table1.1.e.1.bmp,f......
  a,b,/work/table1.1.c.2.doc,d,/work/table1.1.e.2.bmp,f......
注意)TABLEは最後のキーとして指定してください。
備考)別ファイルのパス名は「DIRECTORYで指定されたディレクトリ/テーブル名.アンロード回数.列名.レコード番号.指定拡張子」となります。

アンロードスクリプトの記述例を以下に示します。

#************************************
#* database information
#************************************
HOSTNAME=localhost
PORT=54321
DATABASE=Cabinet1

#************************************
#* FORMAT: unload file format
#* text: text file (.dat)
#* xml: xml file (.xml)
#* default: text
#************************************
FORMAT=XML

#************************************
#* DIRECTORY: unload directory
#* default: current directory
#************************************
DIRECTORY=/work/unload

#************************************
#* UNLOAD_CODE: unload file encoding
#* default: system code
#************************************
UNLOAD_CODE=UTF-8

#************************************
#* TABLE: table to unload
#************************************
TABLE=
table1(col2:jpg,col3:jpg)
table2

5.2.3 アンロードの実行

実行コマンドを入力します。以下に実行例を示します。

$ dqunload unload_script.txt root <rootのパスワード>

実行結果が表示されます。 また、指定ディレクトリ/workの下にアンロードされたファイルが出力されます。 エラーが出力された場合は、表示された内容またはアンロードのログを参考に、 スクリプトファイルを修正してください。

5.2.4 アンロードのログ

アンロードのログは、unload.log.0という名前でカレントディレクトリに保存されます。 ~.0から~.9の最大10個のファイルをローテーションして使い、 ひとつのファイルは上限の1MBに達するまで続けて書き込まれます。 ~.9まで使い切ったときは、~.0を上書きします。

5.3 ロードファイル仕様

5章 ロード/アンロードコマンド で用いるロードファイルの仕様について説明します。

5.3.1 テキスト形式のロードファイル

ロードファイルはヘッダー部とデータ部に分けて記述します。 拡張子は「.dat」である必要があります。 全体像は以下のとおりです。

<header>
  <ヘッダー部>
</header>
<データ部>
ヘッダー部
ヘッダー部は、<header>~</header>の間に記述します。 ヘッダー部には、データ挿入先のテーブル名、 データ部の記述に外部ファイルを使用するか、などを指定します。 指定する項目は次のとおりです。
項目名 必須 デフォルト値 内容
table なし データ挿入先のテーブル名を指定します。
column_separator なし 挿入するデータの区切り文字を指定します。
arrayelement_separator × なし 挿入する配列要素の区切り文字を指定します。
record_separator × \n 挿入するレコードの区切り文字を指定します。
separated_file × false データ部を記述する際に外部ファイルを使用するかどうかを指定します。
  • true:外部ファイルを使用します。
  • false:外部ファイルを使用しません。
extern × なし 他のファイルに格納されているデータを挿入する列名を指定します。
複数の列がある場合は、カンマで区切って記述してください。
データ部
データ部には、挿入するデータやデータ格納先のファイル名を区切り文字で区切って記述します。
データA <区切り文字> データB <区切り文字> データC <区切り文字> ...
配列の場合は、配列型の列内のデータを区切り文字で区切ります。 以下はB列が配列型のデータ列であり、配列要素区切り文字がカンマの場合です。
データA <区切り文字> データB1,データB2,データB3 <区切り文字> データC <区切り文字> ...

挿入先のテーブルに列a、b(配列型)、cがあるとき、 上の例では列aにデータA、列bにデータB1~B3、列cにデータCが挿入されます。

次の例では、 列cにディレクトリ/work/load/imageにあるファイルsample1.jpgのデータが挿入されます。

データA <区切り文字> データB <区切り文字> /work/load/image/sample1.jpg

ファイル名は絶対パスで指定します。 このように、他のファイルに格納されたデータを挿入する列は、 ヘッダー部のexternキーに列名を指定しておきます。 この場合は「extern=c」となります。

ヘッダー部に「separated_file=true」を指定した場合は、外部ファイルを作成し、 ロードファイルのデータ部には外部ファイル名を絶対パスで指定します。 外部ファイル/work/load/insertdata.datを作成し、 列a、b、cにデータA、データB、データCを挿入するときは、次のようにします。

ロードファイルのデータ部:

/work/load/insertdata.dat

外部ファイルinsertdata.dat:

データA <区切り文字> データB <区切り文字> データC

記述例

テキスト形式のロードファイルの記述例を示します。 挿入先のテーブルは以下のようなものです。

table1 (
    col1 nvarchar(128),
    col2 image,
    col3 image
)
table2 (
    col1 int,
    col2 int array[4],
    col3 int
)

外部ファイルを使用せずにtable1にロードする場合 (table1-text.datに相当):

<header>
table=table1
column_separator=<タブ文字>
separated_file=false
extern=col2,col3
</header>
'A100'  /work/load/image/sample1.jpg    /work/load/image/sample2.jpg
'A200'  /work/load/image/sample2.jpg    /work/load/image/sample1.jpg

外部ファイルを使用してtable1にロードする場合 (table1-text.datに相当):

<header>
table=table1
column_separator=<タブ文字>
separated_file=true
extern=col2,col3
</header>
/work/load/data1.dat

外部ファイル(/work/load/data1.dat)の内容:

'A100'  /work/load/image/sample1.jpg    /work/load/image/sample2.jpg
'A200'  /work/load/image/sample2.jpg    /work/load/image/sample1.jpg

配列データをtable2にロードする場合 (table2-text.datに相当):

<header>
table=table2
column_separator=<タブ文字>
arrayelement_separator=,
</header>
10    1,2,3,4    1000
20    101,102,null,null    2000

5.3.2 XML形式のロードファイル

ロードファイルはXML宣言で開始し、<sydney>タグと</sydney>タグで囲んだ部分に ヘッダー部とデータ部を記述します。 拡張子は「.xml」である必要があります。 全体像は以下のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<sydney>
  <header>
    <ヘッダー部>
  </header>
  <データ部>(<record>~</record>の並び)
</sydney>
ヘッダー部
ヘッダー部は、<header>~</header>の間に記述します。 ヘッダー部には、データ挿入先のテーブル名、 データ部の記述に外部ファイルを使用するか、などを指定します。 指定する要素は次のとおりです。
要素名 必須 デフォルト値 内容
<table> なし データ挿入先のテーブル名を指定します。
<separated_file> × false データ部を記述する際に外部ファイルを使用するかどうかを指定します。
  • true:外部ファイルを使用します。
  • false:外部ファイルを使用しません。
<extern> × なし 他のファイルに格納されているデータを挿入する列名を指定します。
複数の列があるときは、<extern>タグと</extern>タグで1つずつ囲みます。
データ部

データ部には、挿入するデータやデータ格納先のファイル名を、 1レコードごとに<record>タグと</record>タグで囲んで記述します。 各データは任意のタグで囲みます。

<record>
  <a>データA</a>
  <b>データB</b>
  <c>データC</c>
</record>

配列の場合は、データ全体を<arrayvalue>タグと</arrayvalue>タグで囲み、 列内の各データを<element>タグと</element>タグで囲みます。 以下はB列を配列データ列とした場合です。

<record>
  <a>データA</a>
  <arrayvalue>
    <element>データB1</element>
    <element>データB2</element>
    <element>データB3</element>
  </arrayvalue>
  <c>データC</c>
</record>

挿入先のテーブルに列a、b(配列型)、cがあるとき、 上の例では列aにデータA、列bにデータB1~B3、列cにデータCが挿入されます。

次の例では、 列cにディレクトリ/work/load/imageにあるファイルsample1.jpgのデータが挿入されます。

<record>
  <a>データA</a>
  <b>データB</b>
  <c>/work/load/image/sample1.jpg</c>
</record>

ファイル名は絶対パスで指定します。 このように、他のファイルに格納されたデータを挿入する列があれば、 ロードファイルのヘッダー部に<extern>タグをつけて列名を指定しておきます。 この場合は<extern>c</extern>となります。

ヘッダー部に<separated_file>true</separated_file>を指定した場合は、 外部ファイルを作成し、ロードファイルのデータ部には 外部ファイル名を<record>タグをつけて絶対パスで指定します。 外部ファイル/work/load/insertdata.xmlを作成し、 列a、b、cにデータA、データB、データCを挿入するときは、次のようにします。

ロードファイルのデータ部:

<record>/work/load/insertdata.xml</record>

外部ファイル:

<?xml version="1.0" encoding="UTF-8"?>
<example> ← ①
  <item> ← ②
    <a>データA</a> ← ③
    <b>データB</b> ← ③
    <c>データC</c> ← ③
  </item>
</example>

記述例

XML形式のロードファイルの記述例を示します。 挿入先のテーブルはテキスト形式と同じとします。

外部ファイルを使用せずにtable1にロードする場合:

<?xml version="1.0" encoding="UTF-8"?>
<sydney>
  <header>
    <table>table1</table>
    <separated_file>false</separated_file>
    <extern>col2</extern>
    <extern>col3</extern>
  </header>
  <record>
    <a>A100</a>
    <b>/work/load/image/sample1.jpg</b>
    <c>/work/load/image/sample2.jpg</c>
  </record>
  <record>
    <a>A200</a>
    <b>/work/load/image/sample2.jpg</b>
    <c>/work/load/image/sample1.jpg</c>
  </record>
</sydney>

外部ファイルを使用してtable1にロードする場合:

<?xml version="1.0" encoding="UTF-8"?>
<sydney>
  <header>
    <table>table1</table>
    <separated_file>true</separated_file>
    <extern>col2</extern>
    <extern>col3</extern>
  </header>
  <record>/work/load/data1.xml</record>
</sydney>

外部ファイル(/work/load/data1.xml)の内容:

<?xml version="1.0" encoding="UTF-8"?>
<example>
  <item>
    <a>A100</a>
    <b>/work/load/image/sample1.jpg</b>
    <c>/work/load/image/sample2.jpg</c>
  </item>
  <item2>
    <a>A200</a>
    <b>/work/load/image/sample2.jpg</b>
    <c>/work/load/image/sample1.jpg</c>
  </item2>
</example>

配列データをtable2にロードする場合:

<?xml version="1.0" encoding="UTF-8"?>
<sydney>
  <header>
    <table>table2</table>
  </header>
  <record>
    <a>10</a>
    <arrayvalue>
      <element>1</element>
      <element>2</element>
      <element>3</element>
      <element>4</element>
    </arrayvalue>
    <c>1000</c>
  </record>
  <record>
    <a>20</a>
    <arrayvalue>
      <element>101</element>
      <element>102</element>
      <element>null</element>
      <element>null</element>
    </arrayvalue>
    <c>2000</c>
  </record>
</sydney>

6章 SQL言語

ここでは、DoqueDBがサポートするSQLについて説明します。 DoqueDBのSQLはSQL99規格にほぼ準拠するとともに、 DoqueDBで拡張された機能をもっています。

6.1 定数および識別子

定数および識別子について説明します。

6.1.1 定数

NULLでない値を指定します。

<定数> ::=
<符号付き数定数>
| <一般定数>
<符号なし定数> ::=
<符号なし数定数>
| <一般定数>
<一般定数> ::=
<文字列定数>
| <日時定数>
<文字列定数> ::=
<引用符> [<文字表現>... ] <引用符>
<文字表現> ::=
<非引用文字>
| <引用表現>
<非引用文字> ::=
<引用符>以外の任意の文字
<引用表現> ::=
<引用符> <引用符>
<符号付き数定数> ::=
[ <符号> ] <符号なし数定数>
<符号なし数定数> ::=
<真数定数>
| <概数定数>
<真数定数> ::=
<符号なし整数> [ <ピリオド> [ <符号なし整数> ] ]
| <ピリオド> <符号なし整数>
<符号> ::=
<正符号>
| <負符号>
<概数定数> ::=
<仮数> E <指数>
<仮数> ::=
<真数定数>
<指数> ::=
<符号付き整数>
<符号付き整数> ::=
[ <符号> ] <符号なし整数>
<符号なし整数> ::=
<数字>...
<日時定数> ::=
<日付定数>
| <時刻印定数>
<日付定数> ::=
DATE <日付データ列>
<時刻印定数> ::=
TIMESTAMP <時刻印データ列>
<日付データ列> ::=
<引用符> <日付値> <引用符>
<時刻印データ列> ::=
<引用符> <日付値> <スペース> <時刻値> <引用符>
<日付値> ::=
<年> <負符号> <月> <負符号> <日>
<時刻値> ::=
<時> <コロン> <分> <コロン> <秒>
<年> ::=
<日時値>
<月> ::=
<日時値>
<日> ::=
<日時値>
<時> ::=
<日時値>
<分> ::=
<日時値>
<秒> ::=
<整数秒> [ <ピリオド> [ <小数秒> ] ]
<整数秒> ::=
<符号なし整数>
<小数秒> ::=
<符号なし整数>
<日時値> ::=
<符号なし整数>

6.1.2 識別子

種々の名前を指定します。DoqueDBで拡張された要素には、*がついています。

<識別子> ::=
<識別子開始> [ { <下線文字> | <識別子部分> } ... ]
<識別子開始> ::=
<単一ラテン文字>
| <UCS2で0x80以上の文字>
| <シャープ記号>*
<識別子部分> ::=
<識別子開始>
| <数字>

6.1.3 キーワード

DoqueDBで使用できるキーワードを示します。 DoqueDBでは、SQL99規格のキーワードの一部と、 DoqueDBで拡張したキーワードをサポートしています。 *の付いた語は、DoqueDBで拡張されたキーワードです。

<キーワード> ::=
<予約語>
<予約語> ::=
ABS | ALL | ALTER | AND | APPROXIMATEWORD* | AREA* | ARRAY | AS | ASC | ASYMMETRIC | AVERAGE* | AVG
| BACKUP* | BETWEEN | BIGINT | BINARY | BLOB | BY
| CALCULATOR* | CASCADE | CATEGORY* | CHAR | CHAR_LENGTH | CLUSTERED* | COLUMN | COMBINER* | COMMIT | COMMITTED | CONSTRAINT | CONSTRAINS | CONTINUE | CORRECT* | CORRESPONDING | CONST* | CONSTANT* | COUNT | CREATE | CROSS | CURRENT_PATH | CURRENT_USER
| DATE | DATABASE* | DATETIME* | DEFAULT | DELETE | DESC | DF* | DISCARD* | DISTINCT | DROP
| END | ESCAPE | EQUALS | EXACTWORD* | EXCEPT | EXISTS | EXPAND* | EXPAND_SYNONYM* | EXTRACTOR*
| FILE* | FLOAT | FOR | FREETEXT* | FROM | FULL | FULLTEXT*
| GLOBAL | GROUP | GO
| HAVING | HEAD* | HEAP* | HINT*
| IMAGE* | IN | INDEX* | INNER | INSERT | INT | INTERSECT | INTO | IS | ISOLATION
| JOIN
| KEY
| LANGUAGE | LEFT | LENGTH | LEVEL | LIKE | LIMIT* | LOCAL | LOGICALLOG* | LOWER
| MASTER* | MAX | MIN | MODIFY* | MOUNT*
| NATURAL | NCHAR | NCLOB | NO | NONCLUSTERED* | NOT | NTEXT* | NULL | NVARCHAR*
| OCTET_LENGTH | OFFLINE* | OFFSET* | ON | ONLINE* | ONLY | OR | ORDER | OUTER | OVERLAY
| PATH | PLACING* | PRIMARY | PHYSICALLOG*
| READ | RECOVERY* | REPEATABLE* | RIGHT | ROLLBACK | ROW
| SCALE | SCORE* | SECTIONIZED* | SELECT | SERIALIZABLE | SESSION_USER | SET | SIMPLEWORD* | SLAVE* | SNAPSHOT* | START | STOP* | SUBSTRING | SUM | SYSTEM | SYMMETRIC | SYNONYM*
| TABLE | TAIL* | TEMPORARY | TIME | TIMESTAMP | TO | TRANSACTION | TRIGGER
| UNCOMMITTED | UNION | UNIQUE | UNIQUEIDENTIFIER* | UPDATABLE* | UPDATE | UPPER | USER | USING | UNMOUNT*
| VALUES | VARCHAR | VERIFY*
| WEIGHT* | WHERE | WITH | WITHIN* | WORD* | WORDLIST* | WORK | WRITE

6.1.4 デリミタ

DoqueDBで使用できる、デリミタを示します。

<デリミタ付き識別子> ::=
<二重引用符> <デリミタ付き識別子部分>... <二重引用符>
<デリミタ付き識別子部分> ::=
<二重引用符以外の文字>
| <二重引用符指定子>
<連結演算子> ::=
||
<セパレータ-> ::=
{ <コメント> | <空白スペース> }...
<コメント> ::=
<コメント開始文字> [ <任意の文字>... ] <改行>
<コメント開始文字> ::=
<負符号><負符号>[<負符号>...]

6.2 スカラ式

DoqueDBがサポートするスカラ式について説明します。 DoqueDBで拡張された要素には、*がついています。

6.2.1 データ型

データ型を指定します。

<データ型> ::=
<組込みデータ型>
| <コレクション型>
| <バイナリ型>*
| <言語型>*
<組込みデータ型> ::=
<文字列型>
| <国際文字列型>
| <BLOB型>
| <数型>
| <日時型>
| <一意識別子型>
<文字列型> ::=
CHAR <左括弧> <長さ> <右括弧>
| VARCHAR <左括弧> <長さ | NO LIMIT*> <右括弧>
<国際文字列型> ::=
NCHAR <左括弧> <長さ> <右括弧>
| NVARCHAR* <左括弧> <長さ | NO LIMIT*> <右括弧>
| NCLOB
| NTEXT*
| FULLTEXT*
<BLOB型> ::=
BLOB
<数型> ::=
<真数型>
| <概数型>
<真数型> ::=
INT
| BIGINT*
| DECIMAL [ <左括弧> <精度> [ <カンマ> <位取り> ] <右括弧> ]
| DEC [ <左括弧> <精度> [ <カンマ> <位取り> ] <右括弧> ]
| NUMERIC [ <左括弧> <精度> [ <カンマ> <位取り> ] <右括弧> ]
<概数型> ::=
FLOAT
<日時型> ::=
DATETIME*
<一意識別子型> ::=
UNIQUEIDENTIFIER
<コレクション型> ::=
<データ型> <配列指定>
<配列指定> ::=
ARRAY <左角括弧> <長さ | NO LIMIT*> <右角括弧>
<長さ> ::=
<符号なし整数>
<バイナリ型>* ::=
BINARY <左括弧> <長さ | NO LIMIT > <右括弧>
| IMAGE
<言語型>* ::=
LANGUAGE

以下に、DoqueDBで使用できるデータ型を一覧にまとめました。

書式 説明 制限
CHAR(n) n文字(バイト)の固定長文字列型。
  • UTF-8でファイルに格納されます。
  • ASCII文字のみ格納できます。
nは1以上400以下
VARCHAR(n) 最大n文字(バイト)の可変長文字列型。
  • UTF-8でファイルに格納されます。
  • ASCII文字のみ格納できます。
  • nにNO LIMITを指定した場合は、無制限可変長になります。
nは1以上2GB(2の31乗-1)以下
NCHAR(n) n文字の固定長国際文字列型。
  • UCS2でファイルに格納されます。
  • マルチバイト文字を格納できます。
nは1以上400以下
NVARCHAR(n) 最大n文字の可変長国際文字列型。DoqueDBで拡張されたデータ型です。
  • UCS2でファイルに格納されます。
  • マルチバイト文字を格納できます。
  • nにNO LIMITを指定した場合は、無制限可変長になります。
nは1以上2GB(2の31乗-1)以下
INT 32ビット整数型。  
BIGINT 64ビット整数型。  
FLOAT 倍精度浮動小数点数型。  
BINARY(n) 固定長バイト列型。 nは1以上400以下
IMAGE 無制限可変長バイト列型。  
DATETIME 日時型。  
LANGUAGE 言語型。DoqueDBで拡張されたデータ型です。  
BLOB 最大2GBのバイナリラージオブジェクト型。  
NCLOB 最大2GBのキャラクターラージオブジェクト型。  
NTEXT / FULLTEXT 無制限可変長国際文字列型。共に、DoqueDBで拡張されたデータ型です。
  • NVARCHAR(NO LIMIT)と同義です。
 
UNIQUEIDENTIFIER 36文字の固定長文字列型。
  • CHAR(36)と同義です。
 

6.2.2 値指定

1つ以上の値、またはパラメーターを指定します。 DoqueDBで拡張された要素には、*がついています。

<値指定> ::=
<定数>
| <プレースホルダー>*
<プレースホルダー>* ::=
<疑問符>

6.2.3 データベース名

データベース名を指定します。DoqueDBで拡張された要素には、*がついています。

<データベース名> ::=
<組込みデータベース名>*
| <ユーザー定義データベース名>
<組込みデータベース名>* ::=
$$SYSTEMDB

6.2.4 表参照

表を参照します。DoqueDBで拡張された要素には、*がついています。

<表参照> ::=
<表一次子>
| <結合表>
<表一次子> ::=
<表名> [ AS <識別子> ]
| <導出表> [ AS ] <識別子> [ <左括弧> <導出列リスト> <右括弧> ]
<導出表> ::=
<副問合せ>
<導出列リスト> ::=
<列名> [ { <カンマ> <列名> } ... ]
<表名> ::=
<組込み表名>*
| <ユーザー定義表名>
<組込み表名>* ::=
SYSTEM_DATABASE
| SYSTEM_USER
| SYSTEM_SESSION
| SYSTEM_PRIVILEGE
| SYSTEM_TABLE
| SYSTEM_COLUMN
| SYSTEM_INDEX
| SYSTEM_FILE
<列名> ::=
<組込み列名>*
| <ユーザー定義列名>
<組込み列名>* ::=
ROWID

6.2.5 列参照

列を参照します。

<列参照> ::=
[ <表名> <ピリオド> ] <列名>

6.2.6 全文検索結果参照

全文検索結果を参照します。これらは、DoqueDBで拡張された式です。

<全文検索結果参照>* ::=
SCORE <左括弧> <列参照> <右括弧>
| WORD <左括弧> <列参照> <右括弧> [ <ピリオド> { DF | SCALE } ]
| TF <左括弧> <列参照> <右括弧>

6.2.7 集合関数

引数への関数の適用によって導出される値を指定します。

<集合関数> ::=
COUNT <左括弧> <アスタリスク> <右括弧>
| <一般集合関数>
<一般集合関数> ::=
<集合関数型> <左括弧> <値式> <右括弧>
<集合関数型> ::=
AVG
| MAX
| MIN
| SUM
| COUNT

6.2.8 数値関数

数型の値をとる関数を指定します。

<数値関数> ::=
<LENGTH式>
| <ABS式>
<LENGTH式> ::=
<CHARACTER LENGTH式>
| <WORD COUNT式>*
| <FULLTEXT LENGTH式>*
<CHARACTER LENGTH式> ::=
CHAR_LENGTH <左括弧> <文字列式> <右括弧>
<WORD COUNT式>* ::=
WORD_COUNT <左括弧> <文字列式> <右括弧>
<FULLTEXT LENGTH式>* ::=
FULLTEXT_LENGTH <左括弧> <文字列式> <右括弧>
<ABS式> ::=
ABS <左括弧> <数値式> <右括弧>

6.2.9 データ列値関数

文字列型または国際文字列型またはビット列型の値をとる関数を指定します。 DoqueDBで拡張された要素には、*がついています。

<データ列値関数> ::=
<文字列関数>
| <BLOB関数>
<文字列関数> ::=
<SUBSTRING関数>
| <OVERLAY関数>
| <NORMALIZE関数>*
| <KWIC関数>*
| <EXPAND_SYNONYM関数>*
<SUBSTRING関数> ::=
SUBSTRING <左括弧> <文字列式> FROM <開始位置> [ FOR <データ列長> ] <右括弧>
<OVERLAY関数> ::=
OVERLAY <左括弧> <文字列式> PLACING <文字列式> FROM <開始位置> <右括弧>
<NORMALIZE関数>* ::=
NORMALIZE <左括弧> <文字列式> USING <正規化仕様指定> <右括弧>
<EXPAND_SYNONYM関数>* ::=
EXPAND_SYNONYM <左括弧> <文字列式> USING <正規化仕様指定> <右括弧>
<正規化仕様指定> ::=
<文字列式>
<KWIC関数>* ::=
KWIC <左括弧> <列参照> FOR <KWIC長> [ ENCLOSE WITH <開始タグ> [ AND <終了タグ> ] ] [ ESCAPE <エスケープ指定> ] [ ELLIPSIS <省略記号> ] <右括弧>
<KWIC長>* ::=
<数値式>
<開始タグ>* ::=
<文字列式>
<終了タグ>* ::=
<文字列式>
<エスケープ指定>* ::=
<文字列式>
<省略記号>* ::=
<文字列式>
<BLOB関数> ::=
<BLOB SUBSTRING関数>
| <BLOB TRIM関数>
| <BLOB OVERLAY関数>
<BLOB SUBSTRING関数> ::=
SUBSTRING <左括弧> <BLOB式> FROM <開始位置> [ FOR <データ列長> ] <右括弧>
<BLOB OVERLAY関数> ::=
OVERLAY <左括弧> <BLOB式> PLACING <BLOB式> FROM <開始位置> [ FOR <データ列長> ] <右括弧>
<BLOB式> ::=
<BLOB連結>
| <BLOB因子>
<BLOB因子> ::=
<BLOB一次子>
<BLOB一次子> ::=
<値式一次子>
| <BLOB関数>
<BLOB連結> ::=
<BLOB式> || <BLOB一次子>
<開始位置> ::=
<数値式>
<データ列長> ::=
<数値式>

6.2.10 日時値関数

日時型の値をとる関数を指定します。

<日時値関数> ::=
CURRENT_TIMESTAMP

6.2.11 値式

値を指定します。DoqueDBで拡張された要素には、*がついています。

<値式> ::=
<数値式>
| <データ列値式>
| <ブール値式>
| <値式一次子>
<値式一次子> ::=
<符号なし値指定>
| <列参照>
| <集合関数>
| <全文検索結果参照>*
| <左括弧> <値式> <右括弧>
<配列値式> ::=
ARRAY <左角括弧> <値式> [ { <カンマ> <値式> } ... ] <右角括弧>

6.2.12 数値式

数値を指定します。

<数値式> ::=
<項>
| <数値式> <正符号> <項>
| <数値式> <負符号> <項>
<項> ::=
<因子>
| <項> <アスタリスク> <因子>
| <項> <斜線> <因子>
<因子> ::=
[ <符号> ] <数一次子>
<数一次子> ::=
<値式一次子>
| <数値関数>

6.2.13 データ列値式

文字列値またはビット列を指定します。

<データ列値式> ::=
<文字列式>
<文字列式> ::=
<連結>
| <文字因子>
<連結> ::=
<文字列式> || <文字因子>
<文字因子> ::=
<文字一次子>
<文字一次子> ::=
<値式一次子>
| <文字列関数>

6.2.14 ブール値式

真理値(「真」、「偽」および「不定」)を指定します。

<ブール値式> ::=
<ブール項> [ { OR <ブール項> } ... ]
<ブール項> ::=
<ブール因子> [ { AND <ブール因子> } ... ]
<ブール因子> ::=
[ NOT ] <ブールテスト>
<ブールテスト> ::=
<ブール一次子>
<ブール一次子> ::=
<述語>
| <左括弧> <ブール値式> <右括弧>

6.3 問合せ式

DoqueDBがサポートする問合せ式について説明します。

6.3.1 行値構成子

行または部分行を構成する、順序付けられた値の集合を指定します。 DoqueDBで拡張された要素には、*がついています。

<行値構成子> ::=
<行値構成子要素>
| <左括弧> <行値構成子要素リスト> <右括弧>
<行値構成子要素リスト> ::=
<行値構成子要素> [ { <カンマ> <行値構成子要素> } ... ]
<行値構成子要素> ::=
<値式>
| <NULL指定>
<NULL指定> ::=
NULL
<行値式> ::=
<特殊行値>
| <行値構成子>
<特殊行値> ::=
<符号なし値指定>
| <列参照>
| <集合関数>
| <全文検索結果参照>*

6.3.2 表値構成子

表を構成する<行値構成子>の集合を指定します。

<表値構成子> ::=
VALUES <表値構成子リスト>
<表値構成子リスト> ::=
<行値構成子> [ { <カンマ> <行値構成子> } ... ]

6.3.3 表式

表またはグループ表を指定します。

<表式> ::=
<FROM句> [ <WHERE句> ] [ <GROUP BY句> ] [ <HAVING句> ]
<FROM句> ::=
FROM <表参照> [ { <カンマ> <表参照> } ]
<WHERE句> ::=
WHERE <探索条件>
<GROUP BY句> ::=
GROUP BY <グループ化要素リスト>
<グループ化要素リスト> ::=
<グループ化要素> [ { <カンマ> <グループ化要素> } ... ]
<グループ化要素> ::=
<通常グループ化セット>
<通常グループ化セット> ::=
<グループ化列参照>
| <左括弧> <グループ化列参照リスト> <右括弧>
<グループ化列参照リスト> ::=
<グループ化列参照> [ { <カンマ> <グループ化列参照> } ... ]
<グループ化列参照> ::=
<列参照>
<HAVING句> ::=
HAVING <探索条件>
<探索条件> ::=
<ブール値式>

6.3.4 結合表

直積、内結合、外結合、または和結合から導出される列表を指定します。

<結合表> ::=
<交差結合>
| <修飾付き結合>
| <自然結合>
<交差結合> ::=
<表参照> CROSS JOIN <表一次子>
<修飾付き結合> ::=
<表参照> [ <結合型> ] JOIN <表参照> [ <結合指定> ]
<自然結合> ::=
<表参照> NATURAL [ <結合型> ] JOIN <表一次子>
<結合指定> ::=
<結合条件>
| <名前付き列結合>
<結合条件> ::=
ON <探索条件>
<名前付き列結合> ::=
USING <左括弧> <結合列リスト> <右括弧>
<結合型> ::=
INNER
| <外結合型> [ OUTER ]
<外結合型> ::=
LEFT
| RIGHT
<結合列リスト> ::=
<列名リスト>

6.3.5 問合せ式本体

表を指定します。DoqueDBで拡張された要素には、*がついています。

<問合せ式> ::=
<問合せ式本体> [ <ORDER BY句> ] [ <LIMIT句>* ]
<問合せ式本体> ::=
<非結合問合せ式>
| <結合表>
<非結合問合せ式> ::=
<非結合問合せ項>
<非結合問合せ項> ::=
<非結合問合せ一次子>
<非結合問合せ一次子> ::=
<単純表>
<単純表> ::=
<問合せ指定>
| <表値構成子>
<ORDER BY句> ::=
ORDER BY <ソート指定リスト>
<ソート指定リスト> ::=
<ソート指定> [ { <カンマ> <ソート指定> } ... ]
<ソート指定> ::=
<ソートキー> [ <順序付け指定> ]
<ソートキー> ::=
<値式>
<順序付け指定> ::=
ASC
| DESC
<LIMIT句>* ::=
<LIMIT指定> [ <OFFSET指定> ]
<LIMIT指定>* ::=
LIMIT <数値式>
<OFFSET指定>* ::=
OFFSET <数値式>

6.3.6 副問合せ

<問合せ式>から導出される表を指定します。

<副問合せ> ::=
<左括弧> <問合せ式> <右括弧>

6.4 述語

「真」、「偽」、または「不定」の真理値を与えるために評価できる条件を指定します。 サポートしている述語は、以下のとおりです。 DoqueDBで拡張されたものには、*がついています。

<述語> ::=
<比較述語>
| <BETWEEN述語>
| <IN述語>
| <LIKE述語>
| <NULL述語>
| <EXISTS述語>
| <CONTAINS述語>*

6.4.1 比較述語

2つの行値の比較を指定します。

<比較述語> ::=
<述語対象式> <比較演算子> <行値式>
<述語対象式> ::=
<行値式>
| <配列任意要素指定式>*
<配列任意要素指定式> ::=
<列参照> <左角括弧> <右角括弧>
<比較演算子> ::=
<等号演算子>
| <不等号演算子>
| <小なり演算子>
| <大なり演算子>
| <以下演算子>
| <以上演算子>
<等号演算子> ::=
=
<不等号演算子> ::=
<>
| !=*
<小なり演算子> ::=
<
<大なり演算子> ::=
>
<以下演算子> ::=
<=
<以上演算子> ::=
>=

6.4.2 BETWEEN述語

指定した範囲に含まれるかどうかをテストします。

<BETWEEN述語> ::=
<行値式> [ NOT ] BETWEEN <行値式> AND <行値式>

6.4.3 IN述語

行値または副問合わせ内のメンバーシップをテストします。

<IN述語> ::=
<述語対象式> [ NOT ] IN <IN述語値>
<IN述語値> ::=
<副問合わせ>
| <左括弧> <行値式> { <カンマ> <行値式> }... <右括弧>

6.4.4 LIKE述語

パターンによる文字列照合を指定します。DoqueDBで拡張された要素には、*がついています。

<LIKE述語> ::=
<述語対象式> [ NOT ] LIKE <パターン> [ ESCAPE <エスケープ文字> ] [ LANGUAGE* <言語値>* ]
<述語対象式> ::=
<文字列式>
<パターン> ::=
<文字列式>
<エスケープ文字> ::=
<文字列式>
<言語値>* ::=
<値指定>

6.4.5 NULL述語

NULL値のテストを指定します。

<NULL述語> ::=
<述語対象式> IS [ NOT ] NULL

6.4.6 EXISTS述語

空でない集合のテストを指定します。

<EXISTS述語> ::=
EXISTS <副問合せ>

6.4.7 CONTAINS述語

パターンを包含する行のテストを指定します。 これらは、DoqueDBで拡張された式です。

<CONTAINS述語>* ::=
<述語対象式> CONTAINS <CONTAINSオペランド> [ <スコア計算器指定> ] [ <スコア調整器指定> ] [ <平均文書長指定> ] [ <文書頻度指定> ] [ <拡張指定> ] [ <抽出指定> ] [ <複合索引スコア合成指定> ]
<述語対象式> ::=
<列参照>
<左括弧> <列参照> [ { <カンマ> <列参照> } ... ] <右括弧>
<スコア計算器指定>* ::=
CALCULATOR <スコア計算器>
<スコア計算器>* ::=
<文字列式>
<スコア調整器指定>* ::=
SCORE FUNCTION <スコア調整器>
<スコア調整器>* ::=
<文字列式>
<平均文書長指定>* ::=
AVERAGE LENGTH ( <数値式> | <文字列式> )
<文書頻度指定>* ::=
DF ( <数値式> | <文字列式> )
<拡張指定>* ::=
EXPAND <左括弧> FROM <副問合せ> [ <ORDER BY句> ] [ <LIMIT句> ] <右括弧>
<抽出指定>* ::=
EXTRACTOR <文字列式>
<複合索引スコア合成指定>* ::=
SCORE COMBINER <文字列式>

6.4.8 CONTAINSオペランド

包含行テストのCONTAINSオペランドを指定します。これらは、DoqueDBで拡張された式です。

<CONTAINSオペランド>* ::=
<CONTAINSオペランドリスト> [ <スコア合成器指定> ]
| <単語リスト>
| <自然文指定>
<CONTAINSオペランドリスト>* ::=
<CONTAINSオペランド一次子> [ { <CONTAINS演算子> <CONTAINSオペランド一次子> } ... ]
<CONTAINSオペランド一次子リスト>* ::=
<CONTAINSオペランド一次子> [ <CONTAINSオペランド一次子> ... ]
<CONTAINSオペランド一次子>* ::=
<CONTAINSオペランド小詞>
| <左括弧> <CONTAINSオペランドリスト> <右括弧>
| WEIGHT <左括弧> <CONTAINSオペランドリスト> <スケール> <右括弧>
<CONTAINSオペランド小詞リスト>* ::=
<CONTAINSオペランド小詞> [ <CONTAINSオペランド小詞> ... ]
<CONTAINSオペランド小詞>* ::=
<CONTAINSワード>
| SYNONYM <左括弧> <CONTAINSオペランドワードリスト> <右括弧>
| EXPAND_SYNONYM <左括弧> <CONTAINSオペランドワード> <右括弧>
| WITHIN <左括弧> <CONTAINSオペランド小詞リスト> [ <出現順序指定> ] [ <下限指定> ] <上限指定> <右括弧>
| HEAD <左括弧> <CONTAINSオペランド小詞> <右括弧>
| TAIL <左括弧> <CONTAINSオペランド小詞> <右括弧>
<CONTAINSオペランドワードリスト>* ::=
<CONTAINSオペランドワード> [ <CONAINSオペランドワード> ... ]
<CONTAINSオペランドワード>* ::=
<CONTAINSオペランドパターン>
| STRING <左括弧> <CONTAINSオペランドパターン> <右括弧>
| EXACTWORD <左括弧> <CONTAINSオペランドパターン> <右括弧>
| SIMPLEWORD <左括弧> <CONTAINSオペランドパターン> <右括弧>
| WORDHEAD <左括弧> <CONTAINSオペランドパターン> <右括弧>
| WORDTAIL <左括弧> <CONTAINSオペランドパターン> <右括弧>
<出現順序指定> ::=
SYMMETRIC
| ASYMMETRIC
<CONTAINSオペランドパターンリスト>* ::=
<CONTAINSオペランドパターン> [ <CONTAINSオペランドパターン> ... ]
<CONTAINSオペランドパターン>* ::=
<単語式> [ LANGUAGE <言語値> ]
<単語式>* ::=
<文字列式>
| STRING <左括弧> <文字列式> <右括弧>
| EXACTWORD <左括弧> <文字列式> <右括弧>
| SIMPLEWORD <左括弧> <文字列式> <右括弧>
| WORDHEAD <左括弧> <文字列式> <右括弧>
| WORDTAIL <左括弧> <文字列式> <右括弧>
<CONTAINS演算子>* ::=
<アンパーサンド>
| <縦棒>
| <負符号>
<スコア合成器指定>* ::=
COMBINER <スコア合成器>
<スコア合成器>* ::=
<文字列式>
<下限指定>* ::=
LOWER <値指定>
<上限指定>* ::=
UPPER <値指定>
<スケール>* ::=
SCALE <値指定>
<単語リスト>* ::=
WORDLIST <左括弧> <単語要素リスト> <右括弧>
<単語要素リスト>* ::=
<単語要素> [ { <カンマ> <単語要素> } ... ]
<単語要素>* ::=
<単語式>
| CATEGORY <単語カテゴリー>
| SCALE <数値式>
| LANGUAGE <言語値>
| DF <数値式>
<単語カテゴリー>* ::=
<文字列式>
<自然文指定>* ::=
FREETEXT <左括弧> <文字列式> [ LANGUAGE <言語値>] <右括弧>

6.5 スキーマ定義

DoqueDBがサポートするスキーマ定義および操作について説明します。 スキーマ定義および操作は、SQLトランザクション中には実行できません。

<データベース名>、<エリア名>、<表名>、<列名>、<子サーバー名> に共通する仕様は以下のとおりです。

6.5.1 データベース定義

データベースを定義します。これらは、DoqueDBで拡張された式です。 データベースとは、表、索引などの集合を管理するためのものです。 また、データベースはセッションがアクセスする単位ともなります。 セッションは、1つのデータベースにしかアクセスできません。

<データベース定義>* ::=
CREATE DATABASE <データベース名> [ <データベース属性指定>... ]
<データベース属性指定>* ::=
<パス指定>
| <書き込み属性>
| <オンライン属性>
| <リカバリ属性>
<パス指定>* ::=
PATH <パス指定要素> [<パス指定要素>...]
<パス指定要素>* ::=
<データ格納パス指定>
| <論理ログ格納パス指定>
| <システム表格納パス指定>
<データ格納パス指定>* ::=
<文字列定数>
<論理ログ格納パス指定>* ::=
LOGICALLOG <文字列定数>
<システム表格納パス指定>* ::=
SYSTEM <文字列定数>

6.5.2 エリア定義

エリアを定義します。これらは、DoqueDBで拡張された式です。 エリアとは、データベースファイルを格納するパスを指定するためのオブジェクトです。

<エリア定義>* ::=
CREATE AREA <エリア名> <エリアパス>
<エリアパス>* ::=
<エリアパス要素>
| <エリアパス配列>
<エリアパス配列>* ::=
ARRAY <左角括弧> <エリアパス配列要素リスト> <右角括弧>
<エリアパス配列要素リスト>* ::=
<エリアパス要素> [ { <カンマ> <エリアパス要素> } ... ]
<エリアパス要素>* ::=
<文字列定数>

6.5.3 表定義

表を定義します。DoqueDBで拡張された要素には、*がついています。

<表定義文> ::=
CREATE TABLE <表名> <表要素リスト> [ <表エリア句> ]
<表要素リスト>* ::=
<左括弧> <表要素> [ { <カンマ> <表要素> } ... ] <右括弧>
<表要素> ::=
<列定義>
| <表制約定義>
<表制約定義> ::=
<表制約>
<表制約> ::=
<一意性制約定義>
| <参照制約定義>
<一意性制約定義> ::=
<一意性指定> <左括弧> <一意列リスト> <右括弧>
<一意性指定> ::=
UNIQUE
| PRIMARY KEY
<一意列リスト> ::=
<列名リスト>
<列名リスト> ::=
<列名> [ { <カンマ> <列名> } ... ]
<参照制約定義> ::=
FOREIGN KEY <左括弧> <参照列> <右括弧> <被参照表指定>
<被参照表指定> ::=
REFERENCES <被参照表> [ <左括弧> <被参照列> <右括弧> ]
<参照列> ::=
<列名リスト>
<非参照列> ::=
<表名>
<被参照列> ::=
<列名リスト>
<表エリア句> ::=
AREA <表エリア指定>
<表エリア指定> ::=
<エリア名> [ HEAP <エリア名> ] [ INDEX <エリア名> ] [ FULLTEXT <エリア名> ]

6.5.4 列定義

列を定義します。DoqueDBで拡張された要素には、*がついています。

<列定義> ::=
<列名> <データ型> [ <DEFAULT句> ] [ <IDENTITY列指定> ] [ <列制約定義> ... ] [ <ヒント句>* ]
<DEFAULT句> ::=
DEFAULT <既定値オプション>
<既定値オプション> ::=
<定数>
| <日時値関数> [ USING ON UPDATE*]
| NULL
<IDENTITY列指定> ::=
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ <左括弧> <シーケンス生成器オプション> ... <右括弧> ]
<シーケンス生成器オプション> ::=
START WITH <数値式>
| INCREMENT BY <数値式>
| { MAXVALUE <数値式> | NO MAXVALUE }
| { MINVALUE <数値式> | NO MINVALUE }
| [ NO ] CYCLE
| GET MAX*
<列制約定義> ::=
<列制約>
<列制約> ::=
NOT NULL

6.5.5 ヒント句

ヒントを指定します。これらは、DoqueDBで拡張された式です。

<ヒント句>* ::=
HINT [ HEAP ] [NONTRUNCATE] [ <ヒントオプション> ]
<ヒントオプション>* ::=
<引用符> <ヒントリスト> <引用符>
<ヒントリスト>* ::=
<ヒント> [ { <カンマ> <ヒント> } ... ]
<ヒント>* ::=
<正規化ヒント>
| COMPRESSED
| DELAYED
| FIXED
| INVERTED = <左括弧> <転置ヒントリスト> <右括弧>
| KWIC
<正規化ヒント>* ::=
NORMALIZED [ <等号演算子> <正規化指定> ]
<正規化指定>* ::=
{ TRUE | FALSE }
<転置ヒントリスト>* ::=
<転置ヒント> [ <カンマ> <転置ヒント> ]
<転置ヒント>* ::=
<転置正規化ヒント>
| <索引タイプ指定>
| <言語指定>
| <トークナイズ指定>
| <圧縮器指定>
| <ヒント抽出指定>
<転置正規化ヒント>* ::=
NORMALIZED <等号演算子> <正規化指定>
<転置正規化指定>* ::=
{ TRUE | FALSE }
| <左括弧> <転置正規化要素リスト> <右括弧>
<転置正規化要素リスト>* ::=
<転置正規化要素> [ <カンマ> <転置正規化要素> ]
<転置正規化要素>* ::=
<ステミング指定>
| <スペース削除指定>
<ステミング指定>* ::=
STEMMING = { TRUE | FALSE }
<スペース削除指定>* ::=
DELETESPACE = { TRUE | FALSE }
<索引タイプ指定>* ::=
INDEXING = <索引タイプ>
<索引タイプ>* ::=
DUAL
| NGRAM
| WORD
<言語指定>* ::=
LANGUAGE = <言語値>
<トークナイズ指定>* ::=
TOKENIZER = <トークナイズパラメーター> <UNAリソースリスト>
<トークナイズパラメーター>* ::=
<NGRパラメーター>
| <BNGパラメーター>
| <DUALパラメーター>
<NGRパラメーター>* ::=
NGR [ :<最小値指定> [ :<最大値指定> ] ]
<最小値指定>* ::=
<符号なし整数>
<最大値指定>* ::=
<符号なし整数>
<BNGパラメーター>* ::=
BNG:JAP:ALL:<符号なし整数> [ <文字種別パラメーターリスト> ]
<DUALパラメーター>* ::=
DUAL:JAP:ALL:<符号なし整数> [<文字種別パラメーターリスト> ]
| DUAL:JAP
<文字種別パラメーターリスト>* ::=
<文字種別パラメーター> [ { <スペース> <文字種別パラメーター> } ... ]
<文字種別パラメーター>* ::=
<文字種別切り出しパラメーター>
| <文字種間結合パラメーター>
<文字種別切り出しパラメーター>* ::=
<文字種>:<符号なし整数>
<文字種間結合パラメーター>* ::=
<文字種>:<文字種>
<文字種>* ::=
ALP
| DIG
| SYM
| ASC
| HIR
| KAT
| KAN
| GRK
| RUS
| KEI
| HAN
| GAI
| OTH
<UNAリソースリスト>* ::=
<UNAリソース指定> [ { <スペース> <UNAリソース指定> } ... ]
<UNAリソース指定>* ::=
@UNARSCID:<符号なし整数>
| @NORMRSCID:<符号なし整数>
<圧縮器指定>* ::=
CODER = <左括弧> <圧縮器パラメーターリスト> <右括弧>
<圧縮器パラメーターリスト>* ::=
<圧縮器パラメーター> [ { <カンマ> <圧縮器パラメーター> } ... ]
<圧縮器パラメーター>* ::=
<圧縮器適用種別> = <圧縮器>
<圧縮器適用種別>* ::=
ID
| FREQUENCY
| LENGTH
| LOCATION
| WORDID
| WORDFREQUENCY
| WORDLENGTH
| WORDLOCATION
<圧縮器>* ::=
PEG:<符号なし整数>
| UNA
<ヒント抽出指定>* ::=
EXTRACTOR <左括弧> <抽出パラメーターリスト> <右括弧>
<抽出パラメーターリスト>* ::=
<抽出パラメーター> [ { <スペース> <抽出パラメーター> } ... ]
<抽出パラメーター>* ::=
<抽出リソース指定>
| ESTIMATEDF
<抽出リソース指定>* ::=
@TERMRSCID:<符号なし整数>

6.5.6 データベース定義変更

データベースの定義を変更します。これらは、DoqueDBで拡張された式です。

<データベース定義変更>* ::=
ALTER DATABASE <データベース名> <データベース変更指定>
<データベース変更指定>* ::=
<データベースパス設定> <データベースパス削除> <データベース属性変更>
<データベースパス設定>* ::=
SET <パス指定>
<データベースパス削除>* ::=
DROP <パス指定>
<データベース属性変更>* ::=
<データベース属性リスト>
<データベース属性リスト>* ::=
<データベース属性> [ { <スペース> <データベース属性> } ... ]
<データベース属性>* ::=
<読み書き属性>
| <オンライン属性>
| <リカバリ属性>
| <ユーザーモード属性>
<読み書き属性>* ::=
READ WRITE
| READ ONLY
<オンライン属性>* ::=
ONLINE
| ONLINE WITH DISCARD LOGICALLOG
| OFFLINE
<リカバリ属性>* ::=
RECOVERY FULL
| RECOVERY CHECKPOINT
<ユーザーモード属性>* ::=
USER SYSTEM
| USER ALL

6.5.7 エリア定義変更

エリア定義を変更します。これらは、DoqueDBで拡張された式です。

<エリア定義変更>* ::=
ALTER AREA <エリア名> MODIFY <エリア変更指定>
<エリア変更指定>* ::=
<エリアパス要素>
| <エリアパス配列>
| <左角括弧> <符号なし定数> <右角括弧> <エリアパス要素>

6.5.8 表定義変更

表定義を変更します。DoqueDBで拡張された要素には、*がついています。

<表定義変更> ::=
ALTER TABLE <表名> <表変更指定>
<表変更指定> ::=
<表エリア設定>*
| <表エリア削除>*
<表エリア設定>* ::=
SET <表エリア句>
<表エリア削除>* ::=
DROP <表エリア句>

6.5.9 データベース削除

データベースを削除します。これは、DoqueDBで拡張された式です。

<データベース削除> ::=
DROP DATABASE <データベース名>

6.5.10 エリア削除

エリアを削除します。これは、DoqueDBで拡張された式です。

<エリア削除> ::=
DROP AREA <エリア名>

6.5.11 表削除

表を削除します。

<表削除> ::=
DROP TABLE <表名>

6.5.12 データベースマウント

データベースをマウントします。 DoqueDBでは、ファイルシステムをマウントするように データベースをマウントすることが可能です。 バックアップしたデータベースを再利用する際にも、このマウントを使用します。 これらは、DoqueDBで拡張された式です。

<データベースマウント>* ::=
MOUNT <データベース名> <パス指定> [ <エリアオプション> ] [ <データベース属性指定> ] [ <回復指定> ]
<エリアオプション>* ::=
<エリア変更リスト> ...
| DROP ALL AREA
<エリア変更リスト>* ::=
<エリア定義変更>
| <エリア定義削除>
<回復指定>* ::=
USING SNAPSHOT WITH RECOVERY
| USING SNAPSHOT
| WITH RECOVERY
| WITH DISCARD LOGICALLOG

6.5.13 データベースアンマウント

データベースをアンマウントします。 DoqueDBでは、ファイルシステムをアンマウントするように データベースをアンマウントすることが可能です。 アンマウントしたデータベースを、再びマウントして利用することもできます。 また、他のDoqueDBでマウントすることも可能です。 これは、DoqueDBで拡張された式です。

<データベースアンマウント>* ::=
UNMOUNT <データベース名>

6.6 索引定義

DoqueDBでサポートしている索引は、 B+木索引、全文索引、ビットマップ索引、配列索引です。

各索引定義の<索引名>の共通する制限は以下のとおりです。

<索引名>のその他の制限は、<データベース名>等と同様です。 詳細については、スキーマ定義を参照してください。

6.6.1 B+木索引定義

B+木索引を定義します。これらは、DoqueDBで拡張された式です。

<B+木索引定義>* ::=
CREATE [ALL ROWS] INDEX <索引名> ON <表名> <索引要素リスト> [ <ヒント句> ] [ <索引エリア句> ]
<索引要素リスト>* ::=
<左括弧> <索引要素> [ { <カンマ> <索引要素> } ... ] <右括弧>
<索引要素>* ::=
<列名>
<索引エリア句>* ::=
AREA <索引エリア指定>
<索引エリア指定>* ::=
<エリア名 | DEFAULT> [ <索引エリアヒント> ]
<索引エリアヒント>* ::=
HINT AREA <文字列定数>

6.6.2 全文索引定義

全文索引を定義します。これらは、DoqueDBで拡張された式です。

<全文索引定義>* ::=
CREATE FULLTEXT INDEX <索引名> ON <表名> <索引要素リスト> [ <言語列指定> ] [ <スコア調整列指定> ] [ <ヒント句> ] [ <索引エリア句> ]
<言語列指定>* ::=
LANGUAGE COLUMN <列名>
<スコア調整列指定>* ::=
SCORE COLUMN <列名>

6.6.3 ビットマップ索引定義

ビットマップ索引を定義します。これらは、DoqueDBで拡張された式です。

<ビットマップ索引定義>* ::=
CREATE BITMAP INDEX <索引名> ON <表名> <索引要素> [ <ヒント句> ] [ <索引エリア句> ]
<索引要素>* ::=
<列名>
<索引エリア句>* ::=
AREA <索引エリア指定>
<索引エリア指定>* ::=
<エリア名 | DEFAULT> [ <索引エリアヒント> ]
<索引エリアヒント>* ::=
HINT AREA <文字列定数>

6.6.4 配列索引定義

配列索引を定義します。これらは、DoqueDBで拡張された式です。

<配列索引定義>* ::=
CREATE ARRAY INDEX <索引名> ON <表名> <索引要素> [ <索引エリア句> ]
<索引要素>* ::=
<列名>
<索引エリア句>* ::=
AREA <索引エリア指定>
<索引エリア指定>* ::=
<エリア名 | DEFAULT> [ <索引エリアヒント> ]
<索引エリアヒント>* ::=
HINT AREA <文字列定数>

6.6.5 索引定義変更

索引定義を変更します。これらは、DoqueDBで拡張された式です。

<索引定義変更>* ::=
ALTER INDEX <索引名> <索引変更指定>
<索引変更指定>* ::=
<索引エリア設定>
| <索引エリア削除>
<索引エリア設定>* ::=
SET <索引エリア句>
<索引エリア削除>* ::=
DROP <索引エリア句>

6.6.6 索引削除

索引を削除します。これは、DoqueDBで拡張された式です。

<索引削除> ::=
DROP INDEX <索引名>

6.7 権限管理

ユーザーのロールを管理します。

6.7.1 GRANT文

ユーザーにロールを追加します。

<GRANT文> ::=
GRANT <ロール名> [ { <カンマ> <ロール名> } ... ] TO <ユーザー名>

6.7.2 REVOKE文

ユーザーからロールを削除します。

<REVOKE文> ::=
REVOKE <ロール名> [ { <カンマ> <ロール名> } ... ] FROM <ユーザー名>

6.8 セッション管理

6.8.1 DISCONNECT文

有効なセッションを切断します。

<DISCONNECT文> ::=
DISCONNECT [ SESSION <SessionID> OF ] CONNCECTION <ClientID>

6.8.2 シングルユーザーモード

シングルユーザーモードはスーパーユーザーのみがトランザクションを実行可能なモードです。 データベース属性を変更することで、シングルユーザーモードに移行します。 シングルユーザーモードに移行した場合、該当するデータベースで実行中の他のすべてのトランザクション(スーパーユーザーが実行中のトランザクション)はキャンセルされ、例外(CanceledBySuperUser)が発生します。

alter database <データベース名> user system
alter database <データベース名> user all

6.9 トランザクション

DoqueDBがサポートするSQLトランザクション管理について説明します。

6.9.1 SET TRANSACTION文

SQLトランザクションの属性を設定します。 DoqueDBで拡張された要素には、*がついています。

<SET TRANSACTION 文> ::=
SET TRANSACTION <トランザクションモード> [ { <カンマ> <トランザクションモード> } ... ]
<トランザクションモード> ::=
<トランザクションアクセスモード>
| <隔離性水準指定>
| <スナップショット指定>*
<トランザクションアクセスモード> ::=
READ ONLY
| READ WRITE
<隔離性水準指定> ::=
ISOLATION LEVEL <隔離性水準>
<隔離性水準> ::=
READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SERIALIZABLE
<スナップショット指定>* ::=
USING SNAPSHOT

6.9.2 START TRANSACTION文

SQLトランザクションの開始を宣言します。

<START TRANSACTION 文> ::=
START TRANSACTION <トランザクションモード> [ { <カンマ> <トランザクションモード> } ... ]

6.9.3 COMMIT文

SQLトランザクションを確定します。

<COMMIT 文> ::=
COMMIT [ WORK ]

6.9.4 ROLLBACK文

SQLトランザクションを破棄し、 SQLトランザクションを開始する直前の状態にデータベースをロールバックします。

<ROLLBACK 文> ::=
ROLLBACK [ WORK ]

6.10 データ操作

DoqueDBがサポートするデータ操作について説明します。

6.10.1 バックアップ開始

データベースをオンラインバックアップする場合、 対象のデータベースに対してバックアップ開始を宣言します。 データベースのバックアップはDoqueDBを介さず、サードパーティーのツール等で、 データベースファイルが保存されているファイルを直接コピーして行います。 バックアップが終了したら、<バックアップ終了>を実行してください。 これらは、DoqueDBで拡張された式です。

<バックアップ開始>* ::=
START BACKUP [ <バックアップ方式> ] [ <版指定> ]
<バックアップ方式>* ::=
FULL
<版指定>* ::=
DISCARD SNAPSHOT

6.10.2 バックアップ終了

バックアップ終了を宣言します。これは、DoqueDBで拡張された式です。

<バックアップ終了>* ::=
END BACKUP [ WITH DISCARD LOGICALLOG ]

6.10.3 整合性検査

データベースの整合性を検査します。これらは、DoqueDBで拡張された式です。

<整合性検査>* ::=
VERIFY <検査対象> <識別子> [<整合性検査方法> ...]
<検査対象>* ::=
DATABASE
| TABLE
| INDEX
<整合性検査方法>* ::=
CORRECT
| CONTINUE
| CASCADE
| VALUE
| VERBOSE

6.10.4 INSERT文

表中に新しい行を作成します。

<INSERT文> ::=
INSERT INTO <表名> <挿入列および挿入元>
<挿入列および挿入元> ::=
[ <左括弧> <挿入列リスト> <右括弧> ] <問合せ式>
| [ <左括弧> <挿入列リスト> <右括弧> ] <表値構成子>
| DEFAULT VALUES
| [ <左括弧> <挿入列リスト> <右括弧> ] <一括登録指定>
<挿入列リスト> ::=
<列名リスト>

6.10.5 UPDATE文

表の複数の行を更新します。

<UPDATE文> ::=
UPDATE <表名> SET <設定句リスト> [ WHERE <探索条件> ]
<設定句リスト> ::=
<設定句> [ { <カンマ> <設定句> } ... ]
<設定句> ::=
<対象列> <等号演算子> <更新元>
<更新元> ::=
<値式>
| <NULL指定>
<対象列> ::=
<列名>

6.10.6 DELETE文

表から複数の行を削除します。

<DELETE文> ::=
DELETE FROM <表名> [ WHERE <探索条件> ]

6.10.7 一括登録

表に一括してデータを登録します。 INSERT文の挿入元に<一括登録指定>を用いると、特定のフォーマットで記述されたCSVファイルやテキストファイルを解析して一括登録を行います。

<一括登録指定> ::=
INPUT FROM <データファイルパス指定>
| [ <スペックファイルパス指定> ]
| [ <一括登録ヒント句> ]
<データファイルパス指定> ::=
PATH <文字列定数>
<スペックファイルパス指定> ::=
WITH PATH <文字列定数>
<一括登録ヒント句> ::=
<引用符> { <一括登録ヒント要素> … } <引用符>
<一括登録ヒント要素> ::=
<データ区切り文字列指定>
| <日時型区切り文字指定>
| <文字コード指定>
| <範囲指定>
| <エラーファイル指定>
| <特殊文字無視指定>
<データ区切り文字列指定> ::=
FieldSeparator <等号演算子> <一括登録ヒント内文字列>
| RecordSeparator <等号演算子> <一括登録ヒント内文字列>
| ElementSeparator <等号演算子> <一括登録ヒント内文字列>
<一括登録ヒント内文字列> ::=
<二重引用符> [ <非引用文字> … ] <二重引用符>
<日時型区切り文字指定> ::=
DateDelimiter <等号演算子> <一括登録ヒント内文字列>
| DateTrailer <等号演算子> <一括登録ヒント内文字列>
| TimeDelimiter <等号演算子> <一括登録ヒント内文字列>
| MsecDelimiter <等号演算子> <一括登録ヒント内文字列>
<文字コード指定> ::=
Code <等号演算子> <一括登録ヒント内文字列>
<範囲指定> ::=
InputField <等号演算子> <範囲指定数値列>
| InputRecord <等号演算子> <範囲指定数値列>
<範囲指定数値列> ::=
<左括弧> <範囲要素> [ { <カンマ> <範囲要素> } … ] <右括弧>
<範囲要素> ::=
<符号なし整数>
| <符号なし整数> <負符号> [ <符号なし整数> ]
| <負符号> <符号なし整数>
InputField=(1,3,5-11) ... 1番目、3番目、5番目から11番目の列データを使用します。
InputRecord=(-10)     ... 先頭の10個のレコードデータのみ使用します。
<エラーファイル指定> ::=
ErrorData <等号演算子> <一括登録ヒント内文字列>
<特殊文字無視指定> ::=
NoExtern
| NoElementNull
| NoDoubleQuote

6.11 問合せ

DoqueDBがサポートする問合せを説明します。

6.11.1 問合せ指定

<表式>の結果から導入される表を指定します。

<問合せ指定> ::=
SELECT [ DISTINCT | ALL ] <選択リスト> <表式>
<選択リスト> ::=
<アスタリスク>
| <選択副リスト> [ { <カンマ> <選択副リスト> } ... ]
<選択副リスト> ::=
<導出列>
| <表名> <ピリオド> <アスタリスク>
<導出列> ::=
<値式> [ <AS句> ]
<AS句> ::=
[ AS ] <列名>

6.12 分散マネージャー

分散マネージャーは、1つの表を複数のデータベースに水平分割して扱う機能です。 分散マネージャーを使用することで、1つのDoqueDBでは扱うことができない大量のデータを高速に処理することができるようになります。 分散マネージャーによる分散機能を利用する場合、2つ以上の子サーバーとそれをまとめる分散マネジャーの計3つ以上のDoqueDBが必要となります。

分散マネージャーには以下の制約があります。

また、複数のデータベースを同期更新するレプリケーション機能も提供します。

6.12.1 子サーバーの定義

以下の構文で、分散マネージャーに子サーバーを定義(追加、変更、削除)します。 子サーバーとして使用するDoqueDBはユーザー管理をしない設定で運用してください。

<子サーバーの追加> ::=
CREATE CASCADE <子サーバー名> ON <シングルクォート><ホスト名><シングルクォート> <ポート番号> [<データベース名>]
<子サーバーの変更> ::=
ALTER CASCADE <子サーバー名> ON <シングルクォート><ホスト名><シングルクォート> <ポート番号> [<データベース名>]
<子サーバーの削除> ::=
DROP CASCADE <子サーバー名>

データベース名を省略した場合、SQL文を発行するセッションに関連付けられたデータベース名になります。 また、データベースはあらかじめ分散マネージャーおよび、それぞれの子サーバーに作成しておく必要があります。 子サーバーを定義後に分散マネージャーで作成した表は、子サーバーにも作成されます。

6.12.2 分散ルールの定義

下の構文で定義した分散ルールに従って、子サーバーにデータが格納されます。 子サーバーが定義されているデータベース内の表で、分散ルールが定義されていない表はすべての子サーバーに同じデータが格納されます(レプリケーション)。

<ルールの定義> ::=
CREATE PARTITION ON <表名> BY <関数名> [<列名リスト>]
<列名リスト> ::=
<列名> [ { <カンマ> <列名> } ... ]
<ルールの変更> ::=
ALTER PARTITION ON <表名> BY <関数名> [<列名リスト>]

6.12.3 関数の定義

<関数の定義> ::=
CREATE FUNCTION <関数名> <左括弧> [引数リスト] <右括弧> RETURNS <戻り値型> RETURN <関数記述> <引数リスト> ::= <引数定義> [ {<カンマ> <引数定義> } ... ] <引数定義> ::= <引数名> <データ型>
create function function (x int)
    returns nvarchar(100)
    return
        case
        when mod(x,4) = 0 then 'child1'
        when mod(x,4) = 1 then 'child2'
        else 'child2'
        end;
<関数の削除> ::=
DROP FUNCTION <関数名>

削除対象の関数が分散ルールとして使用されている場合は、例外が発生します。

6.12 非同期レプリケーション

非同期レプリケーションとは、データベースの更新内容を他のデータベースに複製する機能です。

DoqueDBの非同期レプリケーションの単位はデータベースになります。 レプリケーション方式はマスター・スレーブ方式で、 マスターデータベースへの更新内容をスレーブデータベースに転送する、 単方向のレプリケーションになります。 スレーブを複数指定することも可能です。 ただし、スレーブデータベースをマスターデータベースとしたスレーブデータベースは定義できません。

レプリケーションされる操作は以下のものになります。

マスターデータベース
レプリケーション元のデータベースで、通常の手段で定義されたデータベースです。 マスターデータベースに対しては、すべての操作が可能です。
スレーブデータベース
レプリケーション先のデータベースで、後述する手段で定義されたデータベースです。 スレーブデータベースに対しては、以下の操作のみが可能です。 更新トランザクションは実行できません。

非同期レプリケーションに関して、以下のパラメーターが追加されています。

パラメーター名 説明
LogicalLog_RotateThreshold 数値 マスターデータベースの論理ログを保持する最小サイズ
(デフォルト:100Mバイト)

6.13.1 スレーブデータベースの定義

スレーブデータベースの定義は、以下の構文で行います。

<スレーブデータベース定義> ::=
MOUNT <データベース名> <パス指定> AS SLAVE FROM MASTER <引用符><マスターURL><引用符>
<マスターURL> ::=
<スキーム名>://[ <ユーザー名>:<パスワード>@ ]<ホスト名>:<ポート番号>/<データベース名>
<スキーム名> ::=
doquedb

6.13.2 一時停止と再開

スレーブデータベースは、以下の構文で一時停止あるいは再開できます。

<一時停止> ::=
ALTER DATABASE <データベース名> STOP SLAVE
<再開> ::=
ALTER DATABASE <データベース名> START SLAVE

6.13.3 マスターへの昇格

スレーブデータベースをマスターに昇格させるには、以下の構文を使用します。

<マスター昇格> ::=
ALTER DATABASE <データベース名> SET TO MASTER

6.13.4 データベース構成

データベース構成として、以下のような構成が考えられます。

バックアップ型
スレーブデータベースをバックアップの代わりに利用することができます。 マスターデータベースに障害が発生した場合、スレーブデータベースをマスターに昇格させます。 これまでのバックアップよりダウンタイムを減少させることが可能となります。

検索負荷分散型
更新頻度が比較的少なく検索負荷の高いアプリケーションは、 スレーブデータベースを利用した検索負荷分散型の構成を利用することができます。 ひとつのマスターデータベースに複数のスレーブデータベースを定義しておき、 更新処理はマスターデータベースに対してのみ行い、 検索は各スレーブデータベースに負荷分散します。

冗長型
オンライントランザクション重視のアプリケーションは、 分散マネージャーとスレーブデータベースを利用した冗長構成を利用することができます。

マスターAおよびBは、分散マネージャーを介して操作される、 同期型のレプリケーションデータベースです。 それぞれのマスターデータベースにスレーブデータベースを定義し、 万一、マスターデータベースに障害が発生した場合でも、 短期間で復旧することが可能となります。 また、データの損失も発生しません。

マスターBに障害が発生した場合、分散マネージャーからマスターBを切り離します。 スレーブAがマスターAと完全に同期されてから、スレーブAをマスターデータベースに昇格させ、 スレーブAから昇格したマスターBを分散マネージャーの配下に組み込みます。 その後、それぞれのマスターデータベースのスレーブを新しく定義します。

6.13.5 制限事項

非同期レプリケーションには以下の制限があります。

スレーブデータベース
スレーブデータベースに対しては、以下の制限があります。
マスターデータベース
マスターデータベースに対しては、以下の制限があります。
レプリケーション再開の失敗
レプリケーションは、マスターデータベースからスレーブデータベースに 論理ログを転送することにより実現しています。 しかし、マスターデータベースは、スレーブデータベースが 論理ログをどこまでレプリケートしたのかは管理していません。 そのため、マスターデータベースは、スレーブデータベースが必要としている 論理ログを削除してしまう場合があります。 このような場合、スレーブ側のレプリケートはエラーとなります。 復旧する場合には、スレーブ側のデータベースを削除し、 レプリケーション定義からやり直す必要があります。
分散データベース
分散マネージャーの分散データベースはレプリケートすることはできません。
権限管理
データベースに対する権限はレプリケートされますが、 ユーザ情報自体はレプリケートされません。 スレーブデータベースを保持するDoqueDBにも、 利用者の責任で同じユーザを定義する必要があります。

附録

A. N-gram索引

N-gram索引とは、全文データをN文字ごとに切り出したものを索引単位とする転置索引です。 ただし、文字の切り出し方は常にN文字に固定されているとは限りません。文字種や文字種の切り替わりによって切り出し方法を変えることもあります。 たとえば、文字列「OAのリコー」を 2-gram で切り出すと以下のようになります。

「OA」「A」「の」「リコ」「コー」「ー」

日本語のようにスペースで単語区切りが明確になっていない文書の検索に利用すると、 検索漏れを少なくすることができます。

B. ヒント句の使い方

DoqueDBの性能を引き出すためには、 適切な<ヒント句>を設定する必要があります。

まず、DoqueDBのファイル構成を説明します。

表を構成する列値は原則としてレコードファイルに格納されます。 (BLOBとNCLOBは別のLobファイルに格納されます。) レコードファイルは固定長用のファイルと可変長用のファイルから構成されます。 固定長のファイルには、固定長型(ROWID, int, bigint, float, datetime)の列値と 可変長ファイルに格納される可変長オブジェクトへのポインターが格納されます。 hint heapつきの列やLOBがあるときは、そのオブジェクトへのポインターも格納されます。 また、hint 'fixed' が指定されている列も固定長のファイルに格納されます。 可変長のファイルには、可変長型(char, varchar, nchar, nvarchar, binary)の列値を ひとまとまりにした可変長オブジェクトが格納されます。

以下、具体例を示しながら<ヒント句>の使い方を説明します。

create table TBL (
 id int,
 title nvarchar(100),
 contents nvarchar(no limit)
);

このとき、固定長ファイルには以下のデータが格納されます。

ROWID                (4byte)
id                   (4byte)
可変長へのポインター (6byte)

また、可変長ファイルには以下のデータが格納されます。

title                (最大200byte)
contents             (無制限)

ここで、簡単な検索アプリを考えてみます。 idが指定した範囲にあるデータの一覧を得ることにします。 一覧なのでidとtitleがあればいいでしょう。

select id, title from TBL where id between ? and ?;

この処理をするためにはidとtitleの値があればいいのですが、 可変長オブジェクトにtitleとcontentsがまとめられているため、 不必要なcontentsのデータまで読み込むことになります。

このような場合、contentsをヒープにします。

create table TBL (
 id int,
 title nvarchar(100),
 contents nvarchar(no limit) hint heap
);

こうすると、固定長ファイルには以下のデータが格納されます。

ROWID                  (4byte)
id                     (4byte)
contentsへのポインター (6byte)
可変長へのポインター   (6byte)

可変長ファイルには以下のデータが格納されます。

title                  (最大200byte)

contentsの値は別のレコードファイルに格納されます。 ここで先ほどのSQL文を考えてみます。

select id, title from TBL where id between ? and ?;

今度は、titleだけが取得されるので無駄な読み込みがなくなり、速度が改善されます。 なお、titleとcontentsを同時に取得することが多いような場合には逆効果になります。 さらに、titleを固定長ファイルに格納してしまうこともできます。

create table TBL (
 id int,
 title nvarchar(100) hint 'fixed',
 contents nvarchar(no limit) hint heap
);

hint 'fixed'のほうは引用符で囲まれていることに注意してください。 こうすると、固定長ファイルには以下のデータが格納されます。

ROWID                  (4byte)
id                     (4byte)
title                  (200byte)
contentsへのポインター (6byte)

可変長ファイルは作られません。 titleに対応する部分は最大長の100文字分=200byteが領域として確保されます。 今度は固定長ファイルしか読まれないのでその分処理としては減ります。 ただし、固定長のデータサイズが著しく増加しています。(20⇒214) このことによりバッファリングの効果が薄れるので、 一度に大量のレコードを読み込むことがあるような場合は 逆効果になるおそれがあります。 しかし、一般には固定長データと同時に取得されることが分かっている 比較的短い可変長データはhint 'fixed'をつけたほうがいいと予想されます。

C. LOB型の使い方

LOB(ラージオブジェクト)型のうち、DoqueDBがサポートしているのは、 BLOB型とNCLOB型です。 BLOB、NCLOB型には、最大2GBまでのテキスト、静止画、動画などの 大きなデータを格納できます。

DoqueDBのLOB型には、次のような特徴があります。

特に、大きなデータの一部を取得、変更するような処理では、 すべてのデータを読み込まずに必要な部分だけを読み込むLOB型は、 NVARCHAR型等と比較して高速に処理できます。 (NVARCHAR型等は、ファイルからいったんすべてのデータを読み込み、 修正・変更したい部分をメモリー上で切り出して処理するので、時間がかかります。)

LOB列に対する操作例をあげます。

SUBSTRING(lob_column FROM 1000 FOR 100)

上記の例は、1000バイト目から100バイトだけ切り出して返すことができます。

update T set lob_column = lob_column || '追加' where ...

上記の例は、既存のデータの後ろに新しいデータを追加する更新です。 チューニング用パラメーターのBuffer_NormalPoolSizeを超える巨大なデータも この「データを追加する更新」を利用することで格納できます。

update T set lob_column = OVERLAY(lob_column PLACING '置き換え' FROM 1000) where ...

上記の例は、既存のデータの一部を新しいデータで置き換える更新です。

LOB型の列には長大なデータが入ることがあるため、 以下のSQL文でのLOB列の使用はおすすめしません。

D. IDENTITY列の使い方

DoqueDBではSQL規格のIDENTITY列をサポートしています。 int型の列定義に<IDENTITY列指定>を追加することでIDENTITY列を作成できます。 この節では、IDENTITY列のIDENTITY列の使い方を説明します。 構文と留意点については、列定義を参照してください。

以下ではIDENTITY列の使い方を説明します。

create table T (
 id int GENERATED BY DEFAULT AS IDENTITY,
 text nvarchar(1024)
);
insert T(text) values ('id is not specified');    -- idには0が入ります
insert T(id, text) values (30, 'id is 30');       -- idには30が入ります
insert T(text) values ('id is not specified');    -- idには1が入ります
insert T(id, text) values (10, 'id is 10');       -- idには10が入ります
insert T(text) values ('id is not specified');    -- idには2が入ります

上記の例では、 表TにINSERT文を実行するときに、idの値を指定すると指定した値になります。 idの値を指定せずにINSERTを行うと、 idには順に0、1、2 …のように1刻みの値が自動的に割り当てられます。

create table T (
 id int GENERATED BY DEFAULT AS IDENTITY (START WITH 0 INCREMENT BY 10),
 text nvarchar(1024)
);

上記は、INCREMENT BY を使った例です。 idの値を指定すると指定した値となるのは同様ですが、 idの値を指定せずにINSERTを行うと、 idには順に0、10、20…のように10刻みの値が自動的に割り当てられます。

create table T (
 id int GENERATED BY DEFAULT AS IDENTITY (GET MAX),
 text nvarchar(1024)
);
insert T(text) values ('id is not specified');    -- idには0が入ります
insert T(id, text) values (30, 'id is 30');       -- idには30が入ります
insert T(text) values ('id is not specified');    -- idには31が入ります
insert T(id, text) values (10, 'id is 10');       -- idには10が入ります
insert T(text) values ('id is not specified');    -- idには32が入ります

上記は、GET MAX を使った例です。 通常は、INSERT文やUPDATE文でIDENTITY列の値を指定しても、 次に生成される値には影響しません。 しかし、GET MAXが指定されたIDENTITY列に値を指定すると、 次の生成される値に影響を与えるようになります。 idの値を指定すると指定した値となるのは同様ですが、 idの値を指定しないでINSERTを行うと、 idにはその時点で最大のID+1が自動的に割り当てられます。

create table T (
 id int GENERATED ALWAYS AS IDENTITY (START WITH 0 INCREMENT BY 10),
 text nvarchar(1024)
);

上記は、GENERATED ALWAYSを使った例です。 idの値を指定したINSERT文を実行しようとするとエラーになります。

E. 異表記正規化辞書

DoqueDBでは、異表記正規化を行うことができます。

索引作成時には、<ヒント句>の <UNAリソース指定>で指定された辞書を用いて文字列の正規化を行います。 @UNARSCIDでは形態素解析に用いる辞書を指定し、 @NORMRSCIDでは文字単位の正規化に用いる辞書を指定します。 現在は、いずれもID:1の標準リソースのみ提供されています。

検索時には、<CONTAINS述語>の<抽出指定>で指定された 辞書を用いて、文字列の正規化に加えて文字列の表記の展開も行います。 @TERMRSCIDについては附録 F. 質問処理辞書を参照してください。

文字列の正規化について、正規化ルールの詳細を以下に示します。

変換ルール 対象文字種 説明
文字の同一視 全角⇔半角 英数字/記号 全角の英数字/記号を半角に正規化する。英字については同時に小文字への正規化も行なうため、全角大文字は半角小文字に正規化される。 「a」 → 「a」
「0」 → 「0」
「$」 → 「$」
スペース 全角スペースを半角スペース(0020:SPACE)に正規化する。 3000(IDEOGRAPHIC SPACE) → 0020(SPACE)
カタカナ 半角カタカナ(半角句読点、かぎ括弧も含む)を全角カタカナに正規化する。 「ァ」 → 「ァ」
「。」 → 「。」
大文字⇔小文字 Latin/Cyrillic/Greek ラテン文字/ギリシャ文字/キリル文字(ロシア語アルファベット)の大文字を小文字に正規化する。 「A」 → 「a」 (ラテン文字)
旧字⇔新字 カタカナ ひらがな/カタカナの旧字を新字に正規化する。 「ヱ」 → 「エ」
ひらがな 「ゐ」 → 「い」
音標付⇔音標無 Latin/Cyrillic/Greek ラテン文字/ギリシャ文字/キリル文字(ロシア語アルファベット)の音標付を音標無に正規化する。 「й」 → 「и」(キリル文字)
空白文字 (\t は制御文字) スペース(00A0:NO-BREAK SPACE、2002:EN SPACEなど)をUnicode 0020に正規化する。 00A0(NO-BREAK SPACE) → 0020(SPACE)
漢字異体字 漢字の異体字(旧字、略字など)を正規化する。 「劍」 → 「剣」
「仂」 → 「働」
文字の削除 制御文字 改行文字を含む タブ、改行などの制御文字を削除する。 0001(<control>)を削除
空白文字 ※1 (\t は制御文字) 空白文字を削除する。 0020(SPACE)を削除
結合文字 合字できなかったもの 仮名の合字や音標符号付き文字の正規化と整合をとるため、濁点/半濁点、音標符号を削除する。 「^」(CIRCUMFLEX ACCENT)、「`」(GRAVE ACCENT) を削除
合字 カタカナ ひらがな/カタカナの清音と濁点/半濁点の連続を、対応する濁音/半濁音に合成する。 「ハ」 + 「゜」 → 「パ」
ひらがな 「か」 + 「゛」 → 「が」
異表記正規化 カタカナ 「大文字+小文字」から大文字への変換、長音から大文字への変換などを行う。 「ヴァ」 → 「バ」
「ベー」 → 「ベイ」
メタ処理 ハイフン 長音「ー」がカタカナに後続しない場合、ハイフン「-」に変換する。 「CDーROM」 → 「cd-rom」(全角英字は半角に、大文字は小文字に正規化される)
長音 長音と紛らわしい文字「―」「-」「‐」「-」がカタカナに後続する場合、長音「ー」に変換する。 「チュ-イングガム」 → 「チューイングガム」
ステミング ※2 リコー製ステマーによる。屈折形(統語的機能を表す語形変化)を対象に単語語尾を正規化する。 「polymers」 → 「polymer」
「waked, woke」 → 「wake」
「angrier」 → 「angry」

※1 <ヒント句>の<スペース削除指定>で 「削除しない」から「削除する」への制御が可能です。
※2 <ヒント句>の<ステミング指定>で ステミングの制御が可能です。

F. 質問処理辞書

質問処理辞書は、質問文から名詞句を検索語として抽出するために使われます。 DoqueDBには以下の質問処理辞書があります。

ID リソース名 説明
0 term 日本語用辞書 (正規表現を使用した一般的なもの)
1 termrsc7 日本語特許用辞書 (termより3割程度高速)

CONTAINS述語の<抽出指定>では、 この処理に用いる辞書リソースのIDを@TERMRSCIDに指定します。

G. B+木索引の使い方

B+木索引は、列に対する等式または不等式を条件とする検索を速くする、 データベースシステムで一般的に使われている索引です。

G.1 カラムサイズ

B+木索引の<索引要素リスト>で指定された各列の合計サイズには上限があります。 索引のキーとなる各列のサイズと索引が内部的に保持するバリューのサイズ (4バイト)との合計は、1000バイトを超えてはいけません。

各データ型のデータの長さは、次の計算式で計算されます。 ただし、割り算の余りは常に切り捨てます。

データ型 計算式
CHAR(n)、VARCHAR(n) ((n+1)/4+1)*4
NCHAR(n)、NVARCHAR(n) (n/2+1)*4
UNIQUEIDENTIFIER 36
INT 4
BIGINT 8
DECIMAL 下記参照
FLOAT 8
DATETIME 8
LANGUAGE 16

DECIMALのサイズは、列定義時の<精度>と<位取り>によって決まります。 以下にサイズを求める式を示します。ただし、割り算の余りは常に切り捨てます。

H. 全文索引の使い方

全文索引は、テキストデータを文字列で高速に検索するための索引です。 この節では、1章 全文索引チュートリアルより詳しく使い方を説明します。

H.1 全文索引のスキーマ定義

全文索引の性能を引き出すためには、 <ヒント句>等のスキーマを適切に設定する必要があります。

以下では、全文索引のスキーマ定義の例を示します。

create table T (data nvarchar(no limit), l language);
create fulltext index F on T(data) language column l
 hint 'delayed, inverted=(
  normalized=(stemming=true, deletespace=false),
  indexing=dual,
  tokenizer=DUAL:JAP:ALL:2 ALP:3 ASC:3 KAT:3 KAN:HIR @NORMRSCID:1 @UNARSCID:1)';

上記の例では、列dataに対して、言語型列「l」を使用し、dual索引を定義しています。 列「l」には、索引作成対象のデータの言語が格納されます。 また、<ヒント句>にdelayedを指定し、遅延更新を採用しています。

create table T (data nvarchar(no limit));
create fulltext index F on T(data)
 hint 'delayed, inverted=(
  normalized=(stemming=true, deletespace=false),
  indexing=dual, language=ja,
  tokenizer=DUAL:JAP:ALL:2 ALP:3 ASC:3 KAT:3 KAN:HIR @NORMRSCID:1 @UNARSCID:1)';

上記の例では、<言語列指定>が省略されています。 この場合、データの言語は、 ヒント句の<言語指定>(この例では日本語)で指定された言語だとみなします。 言語指定も省略された場合は、日本語+英語とみなします。 言語対応の詳細については、多言語対応を参照してください。

以下では<トークナイズパラメーター>の例をあげます。

DUAL:JAP:ALL:2 ALP:3 ASC:3 KAT:3 KAN:HIR @NORMRSCID:1 @UNARSCID:1

上記の例は、索引タイプがNGRAMもしくはDUALで、日本語データを対象とし、 テキスト量が比較的多い(1GB以上)場合の例です。

DUAL:JAP:ALL:1 @NORMRSCID:1 @UNARSCID:1

上記の例は、索引タイプがNGRAMもしくはDUALで、日本語データを対象とし、 テキスト量が比較的少ない(1GB以下)場合の例です。

DUAL:JAP @NORMRSCID:1 @UNARSCID:1

上記の例は、索引タイプがWORDで日本語のデータを対象とした場合の例です。

H.2 全文索引の挿入

全文索引が付いた列やその言語型列に対する挿入も、通常の列への挿入と同様です。

create table T(data nvarchar(no limit), l language);
create fulltext index F on T(data) language column l;
insert into T values ('あいうえお', 'ja');

また、大量データの全文索引を一括で作成したいときは、 バッチインサートを利用することをおすすめします。 DoqueDBでは、データ挿入後に索引を定義することで、 バッチインサートを行えるようにしています。

create table T(data nvarchar(no limit), l language);
insert into T values ('あいうえお', 'ja');
insert into T values ('かきくけこ', 'ja');
...                                        -- 大量データの挿入
create fulltext index F on T(data) language column l;

バッチインサートを高速に行うためには、 一時的に使用するメモリーを大きくすると効果的です。 詳細については、チューニング用パラメーターを参照してください。

H.3 全文索引の問合せ

全文索引への問合せについて説明します。 単語単位や文字列単位のパターンに対して、 さまざまな演算をサポートしています。

論理演算の例を以下に示します。

select data from T where data contains 'データベース' & 'システム'

複数のパターンすべてを含むことを指定するには、 AND演算子(&)を使って連結します。

select data from T where data contains 'データベース' | 'システム'

複数のパターンのどれかを含むことを指定するには、 OR演算子(|)使って連結します。

select data from T where data contains 'データベース' - 'システム'

2つのパターンのうち、前のパターンを含み、 後ろのパターンを含まないことを指定するには、 ANDNOT演算子(-)を使って連結します。

近接演算の例を以下に示します。

select data from T where data contains within ('データベース' '検索' 'システム' upper 10);

近接検索のためのパターンを生成するには contains述語に within を指定します。 上記の例は、「データベース」「検索」「システム」の順番で現れ、 かつ「データベース」と「システム」が距離10以内のデータを検索します。

select data from T where data contains
 within ('データベース' '検索' 'システム' asymmetric lower 5 upper 10);

上記の例は、「データベース」「検索」「システム」が現れ、 かつ一番最初に現れたパターンと一番最後に現れたパターンが 距離5以上10以下のデータを検索します。

文字列単位検索の例を以下に示します。

select data from T where data contains data contains head('リレーショナル') & tail('システム')

上記の例は、先頭が文字列「リレーショナル」で、 末尾が文字列「システム」のデータを検索します。

単語単位検索の例を以下に示します。

select data from T where data contains exactword('データベース') & simpleword('システム')

上記の例は、単語「データベース」と単語「システム」を含むデータを検索します。

各演算の仕様の詳細については、CONTAINSオペランドを参照してください。

また、全文索引が付いた列に対して、以下の関数は高速に処理できます。

select count(data) from T where data contains 'データベース';

上記の例は、文字列「データベース」を含む文書数を取得します。

select avg(char_length(data)) from T;

上記の例は、data列のデータの平均文書長を取得します。

select avg(char_length(data)) from T where data contains 'データベース';
(不正なSQLの例)

ただし、上記の例のように条件が付き、 data列の一部のデータの平均文書長を取得する場合には、 高速に平均文書長を取得できません。

これら以外の、全文索引付き列だけで使え、かつ高速に処理できる関数があります。 詳細については、数値関数を参照してください。

H.4 全文索引のランキング検索

DoqueDBは、1章 全文検索チュートリアルランキング検索で説明したように、 検索条件との適合度であるスコアを計算することができます。 ここではスコアの計算方法の指定方法を説明します。

スコア計算器の指定方法の例を以下に示します。

select data from T where data contains 'システム' calculator 'TfIdf' order by score(data) desc

上記の例は、calculatorを使用して、スコア計算器を指定しています。

スコア合成器の指定方法の例を以下に示します。

select data from T where data contains ('リコー' & 'ソフトウエア' combiner 'Prod')
 order by score(data) desc

上記の例は、combinerをパターンの中で使用して、 個々のパターンのスコアから、パターン全体のスコアを合成する方法を指定しています。

スコア調整器の指定方法の例を以下に示します。

create fulltext index I on T(f) score column d;
select score(f) from T where f contains 'リコー' score function 'Sum';

上記の例は、転置索引で得られた個々のスコアを、 <スコア調整列指定>で指定された列から得られる個々の値と<スコア調整器>を使って、 調整します。 たとえば、転置索引から得られたあるタプルのスコアが0.5で、 スコア調整列から得られたそのタプルのスコア調整値が2.0で、 スコア調整器が「Sum」の場合、スコアは2.5に調整されます。 同様にスコア調整器が「Multiply」の場合、スコアは1.0に調整されます。

個々のパターンの重みの付け方の例を以下に示します。

select data from T where data contains 'システム' & weight('databse' scale 2.0)
 order by score(data) desc;

上記の例は、weightを使用して、個々のパターンの重要性を調整しています。

仕様の詳細については、全文索引定義CONTAINS述語CONTAINSオペランドを参照してください。

H.5 全文索引の自然文検索

DoqueDBは、1章 全文検索チュートリアル自然文検索で説明したように、 検索条件に自然文を利用することができます。

select rowid, score(data) from T where data contains freetext('リコーの環境保護への取り組み')
 extractor 'EstimateDF @TERMRSCID:1' order by score(data) desc;

上記の例は、extractorをcontains述語で使用して、 検索語抽出に使用するリソース(異表記正規化辞書や質問処理辞書)等を 明示的に指定しています。

create table T (data nvarchar(no limit), l language);
create fulltext index F on T(data) language column l
 hint 'delayed, inverted=(
  normalized=(stemming=true, deletespace=false),
  indexing=dual,
  tokenizer=DUAL:JAP:ALL:2 ALP:3 ASC:3 KAT:3 KAN:HIR @NORMRSCID:1 @UNARSCID:1,
  extractor=EstimateDF @TERMRSCID:0)';

select rowid, score(data) from T where data contains freetext('リコーの環境保護への取り組み')
 order by score(data) desc;

上記の例は、索引作成時にextractorを設定しています。 検索のたびに指定する必要がなくなります。

また、自然文検索で使用した検索語に関する情報を取得できます。

select word(data) from T where data contains freetext('リコーの環境保護への取り組み')
 order by word(data).scale desc limit 3;

上記の例は、自然文から検索において 重要度の高い検索語の上位3件を取得する例です。

検索語には、重要度の他には文書頻度を取得することができます。 詳細については、全文検索結果参照を参照してください。

select word(data) from T where data contains wordlist('リコー', '環境', '保護', '取り組み')
 order by word(data).scale desc limit 3;

上記の例は、自然文の代わりに単語リストを使っています。 検索語に関する情報は、単語リストを使っても取得できます。

select word(data),score(data) from T where data contains freetext('リコーの環境保護への取り組み')
 order by word(data).scale desc limit 3;
(不正なSQLの例)

上記の例はエラーになります。 検索語の取得と検索結果を返すものとは同時に使用できません。

H.6 全文索引の拡張検索

拡張検索とは、検索要求に関連する語を自動的に補い、検索する機能です。 拡張検索を行うには、contains述語に expand を指定します。

select rowid, score(data) from T where data contains freetext('リコーの環境保護への取り組み')
 expand (from (select data from T where data contains freetext('リコーの環境保護への取り組み')
  order by word(data).scale desc limit 5)
 order by score(data) desc limit 10);

上記の例は、文字列「リコーの環境保護への取り組み」を 自然文検索して得られた文字列集合を使って、関連語を自動的に補います。 関連語には重要度が付いているので、重要度が高い順に5個の単語が追加されます。 つまり、expand内の一度目の自然文検索で関連語を取得し、 問合せ式本体の2回目の自然文検索で関連語を補って検索結果を取得する仕組みです。

select rowid, score(data) from T where data contains freetext('リコーの環境保護への取り組み')
 expand (from (values
  '環境NPOや地元住民とのパートナーシップのもとに、「森林生態系保全プロジェクト」を展開しています。',
  '環境保全活動を推進すると同時に、実際の活動事例を積極的に社内外に情報発信しています。')
  order by word(data).scale desc limit 5)
 order by score(data) desc limit 10);

上記の例は、列挙した文字列から関連語を補う例です。 これは、あくまでも例なので、短い文字列を2つ列挙しただけですが、 実際は、もっと長い文字列をより多く列挙した方が、 適切な関連語を取得できる可能性が高くなります。

H.7 全文索引のストップワード

DoqueDBは、自然文から検索語を切り出すときにストップワードを無視しています。 ただし、索引作成時にはすべての単語を切り出して索引づけしています。

I. 全文索引の遅延更新

全文索引の更新は、データ量に応じて遅くなっていきます。 これは全文索引で使用している、転置ファイルの構造上の問題です。 しかし、小さな転置ファイルの更新は十分高速なので、 常に小さい転置ファイルに対して更新処理を行うようにすれば、 更新処理を高速なままに維持できます。

遅延更新は、以下のような仕組みになっています。

  1. 全文索引を定義すると、大小2種類の転置ファイルが作成されます。
  2. ユーザーからの更新要求は、すべて小転置に対して行います。
  3. 小転置がある程度の大きさになったら、索引単位ごとに大転置にマージします。 これをマージ処理といいます。
  4. マージ処理が終了したら、小転置を空にします。

全文索引では、マージ処理のときに 未使用領域の解放も同時に実行されますので、大転置のサイズの肥大化を抑制できます。 なお、マージ処理中も検索や更新は可能です。

J. ビットマップ索引の使い方

ビットマップ索引は、列に対する等式または不等式を条件とする検索を速くする、 データベースシステムで一般的に使われている索引です。 B+木索引と比較して、特に異なりデータ数が少ないデータに対して有効です。

J.1 異なりデータ数

ビットマップ索引は、 その列に挿入されるデータの異なりデータ数が少ないデータ、 たとえば性別や都道府県名など、に対して有効です。

異なりデータ数が多くてもビットマップ索引は使えますが、 チューニング用パラメーターのBuffer_NormalPoolSizeに依存する制限があります。

create table T(int C array[no limit]);
create bitmap index I on T(C);
insert T values (array[0,1,2, ... ,3000]);
(不正なSQLの例)

たとえば、デフォルト値の20Mだった場合、 上記のような約2500以上の異なりデータを要素に持つ配列の挿入は、 メモリの確保に失敗してしまいます。

create table T(int C array[no limit]);
create bitmap index I on T(C) hint 'compressed';
insert T values (array[0,1,2, ... ,3000]);

このように異なりデータ数が多い(100以上)ときは、 上記のようにヒント句にCOMPRESSEDを指定して索引再作成することをおすすめします。

(配列型でなければ、COMPRESSED指定をしなくてもメモリの確保には失敗しませんが、 配列型かどうかにかかわらず、異なりデータ数が多いときはCOMPRESSED指定することを おすすめします。)

スキーマを変更できない場合は、 Buffer_NormalPoolSizeを異なりデータ数に応じて増やしてください。

K. 複数インストール

1つのマシンにDoqueDBを複数導入することは可能です。 ただし、1つのDoqueDBに複数のデータベースを作成して運用するのと比較して、 メモリ効率は低下します。

基本的なインストール手順は2章 インストールの手順と同様です。 以下の点に注意してください。

install.sh、setup.shは、以下の例のようにして conf.shの代わりに読み込むファイル名を指定できます。 conf.shをコピーして修正したものを用意すると、複数インストールが効率的にできます。

  install.sh conf2.sh
  setup.sh conf2.sh

L. 用語定義

以下に用語定義を示します。

データベースが壊れる
データベースを構成するファイルの内容に異常があり、 バックアップから戻す以外に回復する手段がないことです。 自動復旧で回復できる場合は、ここでは壊れているとは呼びません。
正常終了
プロセスが、 正常に動作している状態から必要な終了処理を実行した終了です。
異常終了
正常終了以外のプロセスの終了です。
例外
プロセスが、実行中に何らかの異常を検知したときになる状態です。 以下に異常の例を示します。
予期せぬ例外
プログラムの中で発生を想定していない箇所で発生する例外です。 上記、例外の例の中では「不正なアドレス参照」が相当します。
チェックポイント
定期的に動作するデーモンスレッドにより、バッファ上のデータの一部が データベースを構成するファイルにフラッシュされる処理です。
DoqueDBはOracleやSQL Serverのようなページ単位のロックではなく、 MVCC(Multi Version Concurrency Control)とタプル単位のロックにより、 トランザクションごとに指定されるアイソレーションレベルを実現しています。 版とは、MVCCにより作られる、 ある時点におけるデータベースの仮想的なコピーのことです。 版はVERSIOM.SYDというファイルに格納され、 VERSIOM.SYDはデータベースを構成するファイルのそれぞれに対応して作成されます。
論理ログ
データベースに対する操作の内容を SQL文単位あるいは処理対象レコード単位に記録するファイルです。 OracleのREDOログファイル、 SQL Serverのトランザクションログと似たようなものです。
物理ログ
ある時点のデータベースイメージです。 版のうち特定の条件を満たすものを物理ログとして用います。

M. 参考文献

  1. 小川泰嗣,山本研策,真野博子,伊東秀夫, 「全文検索システムのための複数転置ファイルを用いた登録高速化とランキング検索」, 第13回データ工学ワークショップ(DEWS2002),2002
    http://www.ieice.org/iss/de/DEWS/proc/2002/papers/B2-1.pdf
  2. 「文書検索におけるランキング検索技術」 RICOH TECHNICAL REPORT No.29, 2003
    https://jp.ricoh.com/-/Media/Ricoh/Sites/jp_ricoh/technology/techreport/29/pdf/A2902.pdf
  3. 「高速で高機能な全文検索が可能なデータベースカーネル」 RICOH TECHNICAL REPORT No.30, 2004
    https://jp.ricoh.com/-/Media/Ricoh/Sites/jp_ricoh/technology/techreport/30/pdf/A3011.pdf
  4. Tetsuya Ikeda, Hiroko Mano, Hideo Itoh, Hiroshi Takegawa, Takuya Hiraoka, Shiroh Horibe, Yasushi Ogawa, "TRMeister: A DBMS with High-Performance Full-Text Search Functions," icde, pp. 958-967, 21st International Conference on Data Engineering (ICDE'05), 2005
    https://ieeexplore.ieee.org/document/1410207
  5. Standards for: Data Management and Interchange, ISO/IEC JTC1 SC32,
    http://www.jtc1sc32.org/

Copyright (c) 2023, 2024 Ricoh Company, Ltd. All rights reserved.