はじめに
今回は、MarkLogicのデータベースの基本設定について見ていきましょう。本稿では、特にドキュメントのロードや挿入に影響するパラメータを扱います。詳細はこちらもご参照ください。
データベース設定
管理者画面(ポート8001番)から、Configure→Databases→[対象のデータベース]→Configureタブを見るとディレクトリやドキュメントに対するプロパティの設定などに関わるパラメータが出てきます。これらについて特に断りが無ければ以下のように設定しましょう。(大部分はデフォルトで推奨値となっています。)
パラメータ | 推奨値 |
---|---|
directory creation | manual |
maintain last modified | false |
maintain directory last modified | false |
inherit permissions | false |
inherit collections | false |
inherit quality | false |
これらのパラメータは、オンにしておけばいくつかの有用な機能を提供します。しかし、ドキュメント挿入時にプロパティ情報を追加するなどひと手間加えてしまうため書き込み性能の低下を招くことになります。よって「基本的にはオフ」とすることをお奨めします。
以下は、よく議論になるパラメータについて触れます。
パラメータ「directory creation」
directory creation=automaticとすると、ドキュメント挿入時のURIに対してディレクトリが無かった場合は自動的にディレクトリを1個のフラグメントとして作成します。1ドキュメントごとに確認を行わなければならないので性能に影響を与えます。
試しに100万行のCSVをContent Pumpでロードしてみました。
directory creation | ロード時間[秒] | ロード成功数 |
---|---|---|
manual | 2,576 | 1,000,000 |
automatic | 3,908 | 999,281 |
なんとautomaticではロード時間が大幅にかかった上に、以下のようなエラーメッセージを出して、一部がロードされないという事態となりました。
・・・
WARN mapreduce.ContentWriter: Failed document /dataSize/load.csv-0-281719 in file:/C:/work/dataSize/load.csv at line 281720
ERROR mapreduce.ContentWriter: SVC-EXTIME: Time limit exceeded
WARN mapreduce.ContentWriter: Failed document /dataSize/load.csv-0-281720 in file:/C:/work/dataSize/load.csv at line 281721
ERROR mapreduce.ContentWriter: XDMP-NOTXN: No transaction with identifier 12425419326357809800
・・・
明らかにmanualとした方が良いですね。
一方でdirectory creation=manualとすることのデメリットは以下の通りです。
・WebDAVによって、DB内のファイルにアクセスすることができなくなる。
・cts:uri-match関数などURI検索関数でディレクトリを検索対象にできなくなる。
WebDAVの利用は、XQueryファイルのみを入れるモジュールDBだけにしましょう。大量のデータを入れるDBには避けるべきです。
cts:uri-match関数の利用については、そのような前提のデータベース設計・プログラム設計を避けるべきです。ディレクトリURIをcts:directory-queryのように完全一致条件に使うことは良いのですが、検索対象そのものにすることはたとえautomaticにしてもコストの大きなものになります。そういった情報は必ずドキュメント内に配置するようにしましょう。
パラメータ「inherit permission」
特定のディレクトリに対するアクセス権などを、その内部に挿入されたドキュメントすべてに遺伝させる設定です。これをtrueとしておけば、ドキュメント挿入時に権限付与をしなくても、事前に設定されたアクセス権がドキュメントに設定されます。逆に言えば、ドキュメント挿入時にディレクトリを辿って権限の確認を行い、ドキュメントのプロパティに反映しなければならなくなるため、書き込み性能の低下を招きます。
inherit permission=falseとした場合のアクセス権の対応方法は以下の2通りです。
・挿入ユーザ/ロールのdefault permissionにアクセスさせたいロールを設定しておく。
Configure→Security→UsersまたはRolesにdefault permissionがあります。
・MLCPやxdmp:document-insertなどの関数の引数に、付与する権限を記述する。
後者は、シェルやクエリなど修正が広範囲に及ぶかと思います。
おわりに
大量のデータを投じることを前提に考えると、これらの設定はオフにしたまま開発を進めることをお奨めします。オンにすると書き込み性能低下を招くことは必至です。性能試験段階でパフォーマンスを改善しようとオフに変更したとしても、資材の大幅な修正に直面することになります。
\def\textsmall#1{%
{\rm\scriptsize #1}
}
免責事項
$\textsmall{当ユーザ会は本文書及びその内容に関して、いかなる保証もするものではありません。}$
$\textsmall{万一、本文書の内容に誤りがあった場合でも当ユーザ会は一切責任を負いかねます。}$
$\textsmall{また、本文書に記載されている事項は予告なしに変更または削除されることがありますので、予めご了承ください。}$