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 }
…(略)…
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 で設定したもの