SPARQLthon63/virtuoso v7.2
提供:TogoWiki
目次 |
概要
v7.2でCOUNT関数を使ったクエリの速度が落ち、大量のトリプルが入っているエンドポイントではタイムアウトが発生するようになったので調査。
現状
Virtuoso7.1では50億トリプルが入ったエンドポイントでもCOUNT関数は返ってきていたが、Virtuoso7.2では返ってこなくなった。
SELECT (COUNT(*) AS ?cnt) { ?s ?p ?o }
ただし、エンドポイントでは返ってこないものの、isqlから同じクエリを叩くと数秒で返ってくる。同じクエリだが実行内容が異なる様子。
SQL> SPARQL SELECT (COUNT(*) AS ?cnt) { ?s ?p ?o };
クエリ実行ログの取得設定
クエリ実行時のログを取得する機能があったので、設定して取得する。ロギングを設定するにはvirtuoso.iniに"QueryLog"追加して再起動する。 詳細
[Parameters] //パラメータセグメントに追記する QueryLog = /path/to/install/directory/var/lib/virtuoso/db/virtuoso.qrl
クエリ実行ログの取得
Virtuoso.iniで指定したログファイルはバイナリでそのままは見られないので(なんとなく見られる) 、isqlからSQLを叩いて検索する。
- 実行した時間からIDを取得する(ql_text=クエリテキスト)は選別用に出力
SQL> SELECT ql_id ,ql_text FROM sys_query_log WHERE qrl_start_dt = cast ('2017-12-14 17:01' as datetime); ql_id ql_text INTEGER LONG VARCHAR _______________________________________________________________________________ …(略)… 473 SPARQL SELECT (COUNT(*) AS ?cnt) { ?s ?p ?o } …(略)…
- IDからクエリログを取得する(各カラムの意味はVirtuosoのページを参照)
SQL> SELECT * FROM sys_query_log WHERE ql_id = 473;
- IDからクエリ実行計画を取得
SQL> SELECT ql_plan FROM sys_query_log WHERE ql_id = 473;
クエリ実行計画の違い
エンドポイントとisqlで同じクエリを打っても速度が全く違うため、クエリの実行計画の違いを調査。
エンドポイントだと"After test:"の部分で何か余分なことをしている?
結局内容が分からないので最新バージョンで確認したらフォーラムに質問投げる(イマココ)
- isqlからクエリを実行した際のクエリ実行計画
SQL> SELECT ql_plan FROM sys_query_log WHERE ql_id = 1129; ql_plan LONG VARCHAR _______________________________________________________________________________ { Node } { time 1e-05% fanout 1 input 1 rows time 7.1e-06% fanout 1 input 1 rows { fork time 1e+02% fanout 0 input 1 rows RDF_QUAD_POGS 8.1e+08 rows() After code: 0: sum cnt 1 set no set_ctr 5: BReturn 0 } time 1.5e-05% fanout 0 input 1 rows Select (cnt) }
- エンドポイントからクエリを実行した際のクエリ実行計画
SQL> SELECT ql_plan FROM sys_query_log WHERE ql_id = 1124; ql_plan LONG VARCHAR _______________________________________________________________________________ { Node } { time 6.9e-06% fanout 1 input 1 rows time 8.5e-06% fanout 0 input 1 rows { fork time 1.6% fanout 9.51803e+07 input 1 rows RDF_QUAD_POGS 8.1e+08 rows(s_4_2_t0.G) time 98% fanout 0 input 9.51803e+07 rows END Node After test: 0: __rgs_ack := Call __rgs_ack (s_4_2_t0.G, 107 , 1 ) 5: if ( 0 = __rgs_ack) then 10 else 9 unkn 10 9: BReturn 1 10: BReturn 0 After code: 0: sum cnt 1 set no set_ctr 5: BReturn 0 } time 0% fanout 0 input 0 rows Select (cnt) }
- v7.1のエンドポイントからクエリを実行した際のクエリ実行計画
SQL> SELECT ql_plan FROM sys_query_log WHERE ql_id = 275; ql_plan LONG VARCHAR _______________________________________________________________________________ { time 1.2e-06% fanout 1 input 1 rows time 2.4e-06% fanout 1 input 1 rows { fork time 1e+02% fanout 0 input 1 rows RDF_QUAD_POGS 1.2e+10 rows() After code: 0: sum cnt 1 set no set_ctr 5: BReturn 0 } time 2.7e-06% fanout 0 input 1 rows Select (cnt) }
環境構築
最新バージョンのVirtuosoをgitからダウンロードしてインストール
% git clone git://github.com/openlink/virtuoso-opensource.git % cd virtuoso-opensource % git checkout -b v7.2.4.2 refs/tags/v7.2.4.2 % sh autogen.sh % ./configure --prefix=/data/store/virtuoso7.2.4.2 --with-readline % make % make install % vi /path/to/install/directory/var/lib/virtuoso/db/virtuoso.ini % (cd /path/to/install/directory/var/lib/virtuoso/db; /path/to/install/directory/bin/virtuoso-t) % isql 1111 # ポート番号は virtuoso.ini で設定したもの