BH12.12/SPARQLthon2/VirtuosoPerformance
提供:TogoWiki
目次 |
メモリ使用量の設定
インストール時のデフォルト設定では、非常に小さなメモリ使用量になっているため、
virtuoso.iniファイルの次の2項目を修正すること。
ロードやクエリ時に改善がみられる(実際には多少速くなるものの、大幅な改善はなかった)。
適切な数値についてはvirtuoso.iniのコメントでサーバのメモリ量に応じた推奨設定値が書かれている。
NumberOfBuffers
MaxDirtyBuffers
デッドロック
過去に身に覚えのない(更新系をかけていない時に)デッドロックが発生し、ロードやクエリの応答が著しく悪くなる現象に遭遇した。
更新系の操作を行った覚えはないが、Virtuosoのstatusを確認したらデッドロック状態に陥っていた。
この場合の対処は不明。一旦Virtuosoをリブートしてやり直した。
・DBのstatus確認方法
$ isql 1111 dba dba (ユーザやパスワードはデフォルト値。環境に合わせる)
SQL> status();
(略)
Lock Status: 1 deadlocks of which 0 2r1w, 86078 waits,
エンドポイントへの負荷の高いクエリ
不用意に時間のかかるクエリ文を打たれた場合、サーバリソースが占有され、全体的に応答が悪くなる。
よくないクエリ文をはじくようにと推奨されているが、判断は困難である。
ディスクアクセス
マニュアルによれば、ストライピングを行ってディスクアクセス速度を改善することが推奨されている。
クエリの実行速度
使用メモリの設定
上述
インデックスの設定(DBエンジニア向け)
Virtuosoはバックエンドにオブジェクト-リレーショナルDBが動いており、
トリプルストアとして使われるテーブルに対するインデックスチューニングが必要になる。
テーブル名:DB.DBA.RDF_QUAD
カラム名: G,S,O,Pの4列
通常SPARQLを叩く場合にはインデックを追加する必要はない。
ただし、G(graph名)で常にデータセットに絞り込むSPARQLを記述するケースが多い場合等には見直す価値がある。
クエリの実行順序
SPARQLのWHERE句に記載された順序でクエリが実行されるわけではない。
順序を指定したい場合にはSPARQLの冒頭に以下のオプションを記載する。
結果ワークセットが少なくなるように絞り込んでいけるかが、速度の鍵になる。
DEFINE sql:select-option "order"
(以下DBエンジニア向け)
Virutosoが最も最短でデータを出せると見積もってクエリ実行計画を立てる。
この際に、見積もりを誤ることがあり、大幅に応答が遅くなることがある。
トリプルストアは行数が大きいせいか、見積もりを間違えると速度への影響が大きい。
通常のRDBと同様EXPLAINで出力できるので、
インデックス不足や不用意にJoinや全テーブル走査が走っていないかチェックする。
グラフ名の指定
グラフ名を指定することで、クエリ対象のトリプル件数が絞り込めるので、極力指定する。
テキスト検索Virtuoso7ではデフォルトでインデックスが作成される
SPARQL仕様準拠の Filter regex構文は、データ量が多い場合には、応答が非常に悪く使えない。
そのため、Virtuoso専用のテキスト検索インデックスを貼って対処する。
Virtuoso独自のSPARQLになるのが難題。
・インデックスを貼るコマンド
$ isql 1111 dba dba (ユーザやパスワードはデフォルト値。環境に合わせる)
DB.DBA.RDF_OBJ_FT_RULE_ADD('http://your_graph_name', null, 'All'); DB.DBA.VT_INC_INDEX_DB_DBA_RDF_OBJ ();
・SPARQLでの利用方法
?text bif:contains '"Ecol_K12_MG1655"'