Hi Nicola,

You observation does seem odd, as the first time a query is run and hence has 
to be compiled you would expect it to take time compile in addiiton to be 
executed, thus subsequent times it would typically take less time and the 
compilation does not have to be performed again.  This is the behaviour I see 
in the simple test case below:

SQL> SPARQL INSERT INTO <test> {<1> <http://example.com#relation> "Some text" . 
<1> <http://example.com#relation> "Some other text" };

Done. -- 4 msec.
SQL> SPARQL SELECT * WHERE {  ?id <http://example.com#relation> "Some text" .  
?id <http://example.com#relation> "Some other text" . };
id
VARCHAR
_______________________________________________________________________________

1

1 Rows. -- 9 msec.
SQL> SPARQL SELECT * WHERE {  ?id <http://example.com#relation> "Some text" .  
?id <http://example.com#relation> "Some other text" . };
id
VARCHAR
_______________________________________________________________________________

1

1 Rows. -- 1 msec.
SQL> SPARQL SELECT * WHERE {  ?id <http://example.com#relation> "Some text" .  
?id <http://example.com#relation> "Some other text" . };
id
VARCHAR
_______________________________________________________________________________

1

1 Rows. -- 1 msec.
SQL> SPARQL SELECT * WHERE {  ?id <http://example.com#relation> "Some text" .  
?id <http://example.com#relation> ?o . FILTER(STR(?o) = "Some other text") };
id                                                                              
  o
VARCHAR                                                                         
  VARCHAR
_______________________________________________________________________________

1                                                                               
  Some other text

1 Rows. -- 1 msec.
SQL> SPARQL SELECT * WHERE {  ?id <http://example.com#relation> "Some text" .  
?id <http://example.com#relation> ?o . FILTER(STR(?o) = "Some other text") };
id                                                                              
  o
VARCHAR                                                                         
  VARCHAR
_______________________________________________________________________________

1                                                                               
  Some other text

1 Rows. -- 0 msec.
SQL> 

In fact even in the sample profile output you provided you can see there 
compilation time for the first query is 13msec vs 1msec for the subsequent run, 
thus it would be interesting to see the complete compilation times of each 
query run which would also show the execution time ?

Best Regards
Hugh Williams
Professional Services
OpenLink Software, Inc.      //              http://www.openlinksw.com/
Weblog   -- http://www.openlinksw.com/blogs/
LinkedIn -- http://www.linkedin.com/company/openlink-software/
Twitter  -- http://twitter.com/OpenLink
Google+  -- http://plus.google.com/100570109519069333827/
Facebook -- http://www.facebook.com/OpenLinkSoftware
Universal Data Access, Integration, and Management Technology Providers

On 6 Mar 2014, at 11:04, Nicola Vitucci <nicola.vitu...@gmail.com> wrote:

> 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

------------------------------------------------------------------------------
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