Sorry, I mentioned the wrong build. The correct build is the one having
SHA = b68d9d9c93c1dfe38f7afa23998b894772c195c0 (26/02/2014).

Nicola

Il 06/03/2014 10:21, Nicola Vitucci ha scritto:
> Hi all,
> 
> I am using Virtuoso build having SHA =
> b86c2a70106138325ed53c60690d7c8f79bc5446 and I found a weird behaviour
> in the queries making use of literals. Basically, the problem is that
> the query plan changes with no apparent reason depending on whether the
> same query is run immediately after starting the server or some time
> (and queries) later, and such change causes a difference in the
> execution time (the first time the query is faster).
> 
> The query has the following pattern:
> 
> SELECT *
> WHERE {
>   ?id <http://example.com#relation> "Some text" .
>   ?id <http://example.com#relation> "Some other text" .
> }
> 
> You can find the two different query plans in the bottom, the former
> being the "fast" one and the latter being the "slow" one. What's even
> more strange is that, if the literals are moved in a FILTER clause and
> "cast" using the STR() function, the query is always executed in "fast
> mode". In other words, if the query is written in this way, the plan
> does not change (last query plan in the bottom):
> 
> SELECT *
> WHERE {
>   ?id <http://example.com#relation> "Some text" .
>   ?id <http://example.com#relation> ?o . FILTER(STR(?o) = "Some other text")
> }
> 
> It looks like the main difference, besides the FILTER addition (the
> "After test" block), is the presence of the "inlined" keyword and the
> use of the RDF_QUAD index rather than the POGS index. Can you explain
> what's happening with the indices and what does the "inlined" keyword mean?
> 
> Thank you,
> 
> Nicola
> 
> -------------------------------------
> 
> First ("fast") query plan:
> 
> {
> time     0.038% fanout         1 input         1 rows
> time         1% fanout       902 input         1 rows
> 
> Precode:
>       0: __rdflit := Call __rdflit (rdflit6325)
>       5: __rdflit := Call __rdflit (rdflit1206)
>       10: BReturn 0
> RDF_QUAD_POGS     9e+02 rows(s_9_4_t0.S)
>  P =  ##relation  ,  O = rdflit6325
> time        99% fanout 0.00776053 input       902 rows
> RDF_QUAD      0.01 rows()
>  inlined  P =  ##relation  ,  S = s_9_4_t0.S ,  O = rdflit1206
> 
> After code:
>       0: id := Call __id2in (s_9_4_t0.S)
>       5: BReturn 0
> time     0.016% fanout         0 input         7 rows
> Select (id)
> }
> 
>  8 msec 40% cpu,       917 rnd      1810 seq         0% same seg
> 80.8279% same pg
> 513 disk reads, 508 read ahead,    29.745% wait
> Compilation: 13 msec 702 reads   25.6666% read 0 messages         0% clw
> 
> ------------
> 
> Second ("slow") query plan:
> 
> {
> time   4.6e-05% fanout         1 input         1 rows
> time     0.001% fanout       902 input         1 rows
> 
> Precode:
>       0: __rdflit := Call __rdflit (rdflit6325)
>       5: __rdflit := Call __rdflit (rdflit1206)
>       10: BReturn 0
> RDF_QUAD_POGS     0.065 rows(s_9_4_t0.S)
>  P =  ##relation  ,  O = rdflit6325
> time     1e+02% fanout 0.00776053 input       902 rows
> RDF_QUAD_POGS   4.6e-14 rows()
>  P =  ##relation  ,  O = rdflit1206 S = s_9_4_t0.S
> 
> After code:
>       0: id := Call __id2in (s_9_4_t0.S)
>       5: BReturn 0
> time     2e-05% fanout         0 input         7 rows
> Select (id)
> }
> 
>  5995 msec 99% cpu,       903 rnd 1.37377e+08 seq         0% same seg
>       0% same pg
> Compilation: 1 msec 0 reads         0% read 0 messages         0% clw
> 
> -------------
> 
> Plan with FILTER and STR():
> 
> {
> time      0.12% fanout         1 input         1 rows
> time       3.1% fanout       902 input         1 rows
> 
> Precode:
>       0: __rdflit := Call __rdflit (rdflit6325)
>       5: BReturn 0
> RDF_QUAD_POGS     0.065 rows(s_5_4_t0.S)
>  P =  ##relation  ,  O = rdflit6325
> time        47% fanout   1.01663 input       902 rows
> RDF_QUAD      0.46 rows(s_5_4_t1.O)
>  inlined  P =  ##relation  ,  S = s_5_4_t0.S
> time        50% fanout 0.00763359 input       917 rows
> END Node
> After test:
>       0: __rdf_strsqlval := Call __rdf_strsqlval (s_5_4_t1.O,  0 )
>       5: if (<c Some other text> = __rdf_strsqlval) then 9 else 10 unkn 10
>       9: BReturn 1
>       10: BReturn 0
> 
> After code:
>       0: id := Call __id2in (s_5_4_t0.S)
>       5: o := Call __ro2sq (s_5_4_t1.O)
>       10: BReturn 0
> time    0.0084% fanout         0 input         7 rows
> Select (id, o)
> }
> 
>  2 msec 67% cpu,      1827 rnd      2461 seq         0% same seg
> 40.5908% same pg
> Compilation: 1 msec 0 reads         0% read 0 messages         0% clw
> 

------------------------------------------------------------------------------
Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce.
With Perforce, you get hassle-free workflows. Merge that actually works. 
Faster operations. Version large binaries.  Built-in WAN optimization and the
freedom to use Git, Perforce or both. Make the move to Perforce.
http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk
_______________________________________________
Virtuoso-users mailing list
Virtuoso-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/virtuoso-users

Reply via email to