SPARQLthon63/virtuoso v7.2
提供:TogoWiki
(版間での差分)
(→クエリ実行計画の違い) |
|||
| 48行: | 48行: | ||
* <b>isql</b>からクエリを実行した際のクエリ実行計画 | * <b>isql</b>からクエリを実行した際のクエリ実行計画 | ||
<pre> | <pre> | ||
| - | SQL> SELECT ql_plan FROM sys_query_log WHERE ql_id = | + | SQL> SELECT ql_plan FROM sys_query_log WHERE ql_id = 1129; |
ql_plan | ql_plan | ||
LONG VARCHAR | LONG VARCHAR | ||
_______________________________________________________________________________ | _______________________________________________________________________________ | ||
| + | { | ||
| + | Node | ||
| + | } | ||
| + | |||
{ | { | ||
time 1e-05% fanout 1 input 1 rows | time 1e-05% fanout 1 input 1 rows | ||
| 71行: | 75行: | ||
* <b>エンドポイント</b>からクエリを実行した際のクエリ実行計画 | * <b>エンドポイント</b>からクエリを実行した際のクエリ実行計画 | ||
<pre> | <pre> | ||
| - | SQL> SELECT ql_plan FROM sys_query_log WHERE ql_id = | + | SQL> SELECT ql_plan FROM sys_query_log WHERE ql_id = 1124; |
ql_plan | ql_plan | ||
LONG VARCHAR | LONG VARCHAR | ||
_______________________________________________________________________________ | _______________________________________________________________________________ | ||
| + | { | ||
| + | Node | ||
| + | } | ||
| + | |||
{ | { | ||
time 6.9e-06% fanout 1 input 1 rows | time 6.9e-06% fanout 1 input 1 rows | ||
2017年12月16日 (土) 01:01時点における最新版
目次 |
概要
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 で設定したもの