2018年9月18日火曜日

V10 の新機能に触れる#2 [Domino Query Language (DQL)]

前回はDomino V10 の新機能のひとつ New Relic 連携についてご紹介しました。

今回もベータ2を試用していて気になった新機能のひとつをご紹介します。 

それは Domino Query Language です。
略して DQL と呼ばれています。

DQL はデータベース内の文書を検索するためのクエリー言語です。

クエリーでは特定のサマリー・フィールド、またはビューの列と、それらの値など指定します。 

「サマリー・フィールド」というのは、ざっくり言えばリッチテキスト・フィールド以外のフィールドのことです。リッチテキストにある本文のテキストや添付の中のテキストは検索できません。

「クエリー」は次に示す様な文であり、個人的には理解しやすいと思っています。

ItemCode という名前のフィールドに入っている値が 00-123 の文書を探す
ItemCode = '00-123'

ItemCode という名前のフィールドに入っている値が 00-123 または 00-456 の文書を探す
ItemCode in ('00-123', '00-456')

TargetDate という名前のフィールドの日付値が 2008 年 3 月 4 日以後の文書を探す
TargetDate >= @dt('2008-03-04')

All Documents ビューの列 Level (=プログラム名)の値が Middle の文書を探す
'All Documents'.Level = 'Middle'

and / or を使って多少複雑なクエリーを指定することもできます
ItemCode in ('00-123', '00-456') and 'All Documents'.Level = 'Middle'


ベータ2では、このクエリーを発行する方法が Domino コンソールと OS のコマンドプロンプトといったように限定的ですが、製品版では LotusScript と Java から発行するためのデータベース・オブジェクトのメソッドが提供されるようです。
※OSのコマンドプロンプトは「管理者として実行」から実行します

HCL Technologies (V10 から Notes/Domino を開発している企業)が公開しているデモビデオ(youtube)では、JavaScript で DQL を使う様子を見ることができます。


前提作業(後述)を終えて早速試しました。

次の様に -q オプションでクエリーを指定して Domino コンソールから発行できました。
load domquery -f "DQLSample.nsf" -q "ItemCode in ('00-123', '00-456') and TargetDate >= @dt('2008-03-04')" -e

また、Domino のプログラムディレクトリに保存したテキストファイルにクエリー文を書くことで、次の様に -z オプションでファイル名を指定して発行できました。
load domquery -f "DQLSample.nsf" -z "dql_query.txt" -e

-e オプションを付けると、ツリー構造に分解されたクエリーのそれぞれに要した時間や検索コスト、ヒットした文書数などを知ることができます。

下はコマンドプロンプトから実行した例です。ビュー名と列のプログラム名を指定しています。
C:\IBM\Domino>domquery -f "DQLSample.nsf" -q "'All Documents'.ItemCode in ('00-123', '00-456')" -e
0. IN      (childct 2) (totals when complete:) Prep 0.0 msecs, Exec 153.672 msecs, ScannedDocs 0, Entries 36, FoundDocs 36
    1.'All Documents'.ItemCode = '00-123' View Column Search estimated cost = 5
[1A28:0002-1C58]      Prep 39.756 msecs, Exec 139.246 msecs, ScannedDocs 0, Entries 17, FoundDocs 17
    1.'All Documents'.ItemCode = '00-456' View Column Search estimated cost = 5
[1A28:0002-1C58]      Prep 0.109 msecs, Exec 14.411 msecs, ScannedDocs 0, Entries 19, FoundDocs 36

[1A28:0002-1C58] Total Documents found = 36
上の結果で"View Column Search" と表示されているとおり、検索にビューが使われたことがわかります。
比較のため、クエリーにフィールド名を指定した場合の結果を下に示します。
C:\IBM\Domino>domquery -f "DQLSample.nsf" -q "ItemCode in ('00-123', '00-456')" -e
0. IN      (childct 2) (totals when complete:) Prep 0.0 msecs, Exec 236.783 msecs, ScannedDocs 11654, Entries 0, FoundDocs 36
    1.ItemCode = '00-123' NSF document search estimated cost = 100
[247C:0002-20FC]        Prep 0.405 msecs, Exec 236.775 msecs, ScannedDocs 11654, Entries 0, FoundDocs 17
    1.ItemCode = '00-456' NSF document search estimated cost = 100
[247C:0002-20FC]        Prep 0.288 msecs, Exec 0.0 msecs, ScannedDocs 11637, Entries 0, FoundDocs 19

[247C:0002-20FC] Total Documents found = 36

今度は "NSF document search" と表示されています。

ビューを指定した時と比べると estimated cost (5:100)や Exec の時間(153.672:236.783)にずいぶんと差が現れました。

この結果からは、ビューを使ったほうがコストが低く、早く探すことができたようです。

ちなみに、私の環境では1回目と2回目以降では Exec の時間に差が見られ、2回目以降は1回目よりも早い結果となりました。


その後ビューをいろいろいじっていたところ、いつからかフィールド名を指定したにも関わらず、ビューを使って探すようになってしまいました。

下がその記録ですが、" View-based equality search" と表示され、 estimated cost が 100 から 5 へと減りました。
クエリーからよりコストの低い検索方法をDominoが判断した、ということでしょうか...?うーん...
C:\IBM\Domino>domquery -f "DQLSample.nsf" -q "ItemCode in ('00-123', '00-456')" -e
0. IN      (childct 2) (totals when complete:) Prep 0.0 msecs, Exec 3.329 msecs, ScannedDocs 0, Entries 36, FoundDocs 36
    1.ItemCode = '00-123' View-based equality search estimated cost = 5
[2268:0002-0484]        Prep 0.386 msecs, Exec 2.35 msecs, ScannedDocs 0, Entries 17, FoundDocs 17
    1.ItemCode = '00-456' View-based equality search estimated cost = 5
[2268:0002-0484]        Prep 0.240 msecs, Exec 1.289 msecs, ScannedDocs 0, Entries 19, FoundDocs 36

[2268:0002-0484] Total Documents found = 36

こんな場合に、どうしてもビューを使ってほしくなければ -j オプションで回避することができます。
C:\IBM\Domino>domquery -f "DQLSample.nsf" -q "ItemCode in ('00-123', '00-456')" -e -j
0. IN      (childct 2) (totals when complete:) Prep 0.0 msecs, Exec 126.455 msecs, ScannedDocs 11654, Entries 0, FoundDocs 36
    1.ItemCode = '00-123' NSF document search estimated cost = 100
[1A04:0002-1E90]        Prep 0.10 msecs, Exec 126.451 msecs, ScannedDocs 11654, Entries 0, FoundDocs 17
    1.ItemCode = '00-456' NSF document search estimated cost = 100
[1A04:0002-1E90]        Prep 0.4 msecs, Exec 0.0 msecs, ScannedDocs 11637, Entries 0, FoundDocs 19

[1A04:0002-1E90] Total Documents found = 36



さてさて、前提のお話が後回しになってしまいましたが、DQL を使えるようにするために 2つの準備を行いました。

ひとつは notes.ini へ UPDATE_DESIGN_CATALOG=1 を追加すること。

もうひとつは、検索するデータベースをビューで検索するために「デザインカタログ」(GQFDsgn.cat)へ追加することです。

デザインカタログ(GQFDsgn.cat)は Domino のデータディレクトリに自動で作成されます。

デザインカタログへの追加は -e オプションを指定して updall タスクを実行します。
load updall DQLSample.nsf -e

またビューを追加したり設計変更した場合は -d オプションを指定した updall タスクを実行してデザインカタログを更新しなければならないようです。
load updall DQLSample.nsf -d



以上、ベータ2で試した DQL についてまとめました。

製品版ではさらに検索にヒットした文書へアクセスする方法が提供されるのでしょうが、その方法はまだベータ2のドキュメントに記載されていません...

まだわからないこともありますが、DQL によってより高効率で検索可能な条件を探しやすくなりそうです。

0 件のコメント:

コメントを投稿