[XQZone General] Performance of index (position) access and g etting to preceding nodes

McBeath, Darin W. (ELS) D.McBeath at elsevier.com
Fri Oct 22 10:06:19 PDT 2004


oops, ignore my previous comment ... didn't read far enough down your note.

You may want to try the item-at xpath function but I would have thought []
would have normalized to that. 

-----Original Message-----
From: general-bounces at xqzone.marklogic.com
To: general at xqzone.marklogic.com
Sent: 10/22/2004 7:53 AM
Subject: [XQZone General] Performance of index (position) access and getting
to preceding nodes



Hi Folks,

I'm just getting started with CIS after an enjoyable User Conference and
I
have a couple of related questions:

Is there an efficient way when processing a sequence to access other
nodes
in the sequence?  (especially preceding or next nodes).
I have tried to use indexed/positional access but this seems to be very
(very) slow.

For instance, using example queries to illustrate the thought -

XQuery 1:
for $item at $index in //items
return
        xdmp:path($item)

This iterates through, setting the context to each item in //items and
executes very quickly - as I expected, whereas the following,
illustrating
access to the preceding node.......

XQuery 2:
for $item at $index in //items
return
        if ($index> 1) then
                (xdmp:path($p),xdmp:path($items[$index - 1]))
        else
                xdmp:path($p)

... runs very very slowly even for small lists.   XQuery 1 is often
sub-second while XQuery 2 for 80 items takes about 8 seconds and for 600
items about a minute, bigger lists just take forever.

It appears to me that it is the access via index/position that is
slow.  Testing with the following obviously daft query

Query 3:
let $items := //items
for $item at $index in $items
return
        xdp:path($items[$index])

This takes the same length of time as XQuery 2.

It looks almost like the expressions are being fully re-evaluated, i.e.
//items[1] .. //items[n] rather than using a previously determined "in
memory" list. To test this I tried the even dafter XQuery:

XQuery 4:
let $items := //items
for $item at $index in $items
return
        xdp:path((//items)[$index])

and the timings matched XQuery3, reinforcing my "re-evaluation" thought.

I've tried some other approaches though XQuery scoping seems to stop me
simply saving a node for later use.

So.....  any thoughts or guidance on:

i) What is going on and why is this form of indexed access so slow?
ii) Is there an easier (i.e. much faster) way to access other nodes in a
given sequence while handling that sequence?
iii) What 'obvious' XQuery technique to this have I clearly yet to
discover?  :-)

Thanks in advance,

Andy

_______________________________________________
General mailing list
General at xqzone.marklogic.com
http://xqzone.com/mailman/listinfo/general



More information about the General mailing list