Hi, Basavaraj: I suspect some of the xdmp:value() call got lost along the way, given the string concatenation operator || with no strings.
It might speed things up to execute fn:subsequence(cts:search(...), $start, $end - $start + 1), specifying the sort order with cts:index-order() arguments to cts:search() instead of evaluating a for iteration. Erik Hennum ________________________________ From: [email protected] [[email protected]] on behalf of Basavaraj Kalloli [[email protected]] Sent: Monday, May 29, 2017 11:25 AM To: MarkLogic Developer Discussion Subject: Re: [MarkLogic Dev General] Optimising XQuery Timeouts Hi Erik, Here is the full extract of the xdmp:value() call: xdmp:value((for $i in cts:search(/record[.//npg:Article], $final-query, ('unfiltered' ), 0.0) order by || $o1 || $o2 || return $i)[$start to $end]) Looks like that query is bringing in everything from the database and then ordering. As I am typing I think it will be good for it to be ordered as part of the search query and return only that many results as from $start to $end. I will also look into the empty not-queries and post more details. The problem we have been having is that this is legacy code which is making it difficult to investigate. Thanks for the pointers, hope the above code can possibly be the reason the queries are running slow with concurrent requests? Cheers, Basavaraj On Fri, May 26, 2017 at 3:58 PM, Erik Hennum <[email protected]<mailto:[email protected]>> wrote: Hi, Basavaraj: Can you show the full xdmp:value() call? It looks like the FLWOR expression is ordering based on an XPath into each retrieved document. It would be more efficient to order within the cts:search() call based on range indexes. The $final-query reported by query trace has some odd subqueries of the form: cts:not-query(cts:or-query((), ()), 1) An empty cts:or-query() is always false, making the negation is always true, so these subqueries contribute no selectivity. You might look at expressing the searchable expression criteria as a subquery with the $final-query. Also, you could try to call cts:search() directly instead of evalling it with xdmp:value(). Finally, if you're retrieving a large number of documents, the best practice is to page over the result set. Hoping that helps, Erik Hennum ________________________________ From: [email protected]<mailto:[email protected]> [[email protected]<mailto:[email protected]>] on behalf of Basavaraj Kalloli [[email protected]<mailto:[email protected]>] Sent: Friday, May 26, 2017 4:13 AM To: MarkLogic Developer Discussion Subject: [MarkLogic Dev General] Optimising XQuery Timeouts Hi All, I have been trying to resolve a couple of our queries which time out every couple of hours. I believe this is down to the number of concurrent requests. Things evaluated/investigated: * I turned on the debug logs to see if there are any deadlocks * I couldn't find any traces of locks * Next I profiled my query and looks like there are 234 expressions and normally it returns under 0.00738 secs * Next I did try query-trace the output looks like: xdmp:value("(for $i in cts:search(/record[.//npg:Article], $final-query, ('u...") Analyzing path for search: fn:collection()/record[descendant::npg:Article] Step 1 is searchable: fn:collection() Step 2 is searchable: record[descendant::npg:Article] Path is fully searchable. Gathering constraints. Step 2 predicate 1 contributed 1 constraint: descendant::npg:Article Step 2 predicate 1 contributed 2 constraints: descendant::npg:Article Step 2 contributed 3 constraints: record[descendant::npg:Article] Comparison contributed string scatter value constraint: xdmp:collection = ("http://ns.nature.com/graphs/articles-labanimal", "lab_animal", "http://ns.nature.com/graphs/articles-nature", ...) Search query contributed 1 constraint: cts:and-query((cts:not-query(cts:or-query((), ()), 1), cts:collection-query(("http://ns.nature.com/graphs/articles-labanimal", "lab_animal", "http://ns.nature.com/graphs/articles-nature", "journals_nature", "http://ns.nature.com/graphs/articles-palgrave", "journals_palgrave")), cts:or-query(cts:field-value-query("doi", "10.1038/212441a0", ("lang=en"), 0), ()), cts:not-query(cts:or-query((), ()), 1), cts:not-query(cts:or-query((), ()), 1), cts:not-query(cts:or-query((), ()), 1)), ()) Order by clause contributed 1 range ordering constraint for $i: order by xs:date($i/descendant::prism:publicationDate) descending Ordering can be unfiltered. Executing search. Selected 1 fragment. I dont see anything unsual with the output - no traces of unsearchable expressions and lack of indexes. * I did try query-meters <qm:query-meters xsi:schemaLocation="http://marklogic.com/xdmp/query-meters query-meters.xsd" xmlns:qm="http://marklogic.com/xdmp/query-meters" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <qm:elapsed-time>PT0.003874S</qm:elapsed-time> <qm:requests>0</qm:requests> <qm:list-cache-hits>150</qm:list-cache-hits> <qm:list-cache-misses>0</qm:list-cache-misses> <qm:in-memory-list-hits>0</qm:in-memory-list-hits> <qm:triple-cache-hits>0</qm:triple-cache-hits> <qm:triple-cache-misses>0</qm:triple-cache-misses> <qm:triple-value-cache-hits>0</qm:triple-value-cache-hits> <qm:triple-value-cache-misses>0</qm:triple-value-cache-misses> <qm:expanded-tree-cache-hits>1</qm:expanded-tree-cache-hits> <qm:expanded-tree-cache-misses>0</qm:expanded-tree-cache-misses> <qm:compressed-tree-cache-hits>0</qm:compressed-tree-cache-hits> <qm:compressed-tree-cache-misses>0</qm:compressed-tree-cache-misses> <qm:in-memory-compressed-tree-hits>0</qm:in-memory-compressed-tree-hits> <qm:value-cache-hits>3</qm:value-cache-hits> <qm:value-cache-misses>35</qm:value-cache-misses> <qm:regexp-cache-hits>1</qm:regexp-cache-hits> <qm:regexp-cache-misses>1</qm:regexp-cache-misses> <qm:link-cache-hits>0</qm:link-cache-hits> <qm:link-cache-misses>0</qm:link-cache-misses> <qm:filter-hits>0</qm:filter-hits> <qm:filter-misses>0</qm:filter-misses> <qm:fragments-added>0</qm:fragments-added> <qm:fragments-deleted>0</qm:fragments-deleted> <qm:fs-program-cache-hits>0</qm:fs-program-cache-hits> <qm:fs-program-cache-misses>0</qm:fs-program-cache-misses> <qm:db-program-cache-hits>0</qm:db-program-cache-hits> <qm:db-program-cache-misses>0</qm:db-program-cache-misses> <qm:env-program-cache-hits>0</qm:env-program-cache-hits> <qm:env-program-cache-misses>0</qm:env-program-cache-misses> <qm:fs-main-module-sequence-cache-hits>0</qm:fs-main-module-sequence-cache-hits> <qm:fs-main-module-sequence-cache-misses>0</qm:fs-main-module-sequence-cache-misses> <qm:db-main-module-sequence-cache-hits>0</qm:db-main-module-sequence-cache-hits> <qm:db-main-module-sequence-cache-misses>0</qm:db-main-module-sequence-cache-misses> <qm:fs-library-module-cache-hits>0</qm:fs-library-module-cache-hits> <qm:fs-library-module-cache-misses>0</qm:fs-library-module-cache-misses> <qm:db-library-module-cache-hits>0</qm:db-library-module-cache-hits> <qm:db-library-module-cache-misses>0</qm:db-library-module-cache-misses> <qm:fragments> <qm:fragment> <qm:root xmlns="">record</qm:root> <qm:expanded-tree-cache-hits>1</qm:expanded-tree-cache-hits> <qm:expanded-tree-cache-misses>0</qm:expanded-tree-cache-misses> </qm:fragment> </qm:fragments> <qm:documents> <qm:document> <qm:uri>/n5061/xml/212441a0.xml</qm:uri> <qm:expanded-tree-cache-hits>1</qm:expanded-tree-cache-hits> <qm:expanded-tree-cache-misses>0</qm:expanded-tree-cache-misses> </qm:document> </qm:documents> <qm:hosts> <qm:host> <qm:host-name>#removed#</qm:host-name> <qm:round-trip-count>1</qm:round-trip-count> <qm:round-trip-time>PT0.000921S</qm:round-trip-time> </qm:host> <qm:host> <qm:host-name>#removed#</qm:host-name> <qm:round-trip-count>1</qm:round-trip-count> <qm:round-trip-time>PT0.000856S</qm:round-trip-time> </qm:host> </qm:hosts> </qm:query-meters> The only thing that strikes me is that there are value cache misses, I dont know if I can do anything for it or anything else I could try. I am running out of ideas so it would be great if anyone can share some thoughts/pointers. Thanks, Basavaraj Kalloli _______________________________________________ General mailing list [email protected]<mailto:[email protected]> Manage your subscription at: http://developer.marklogic.com/mailman/listinfo/general
_______________________________________________ General mailing list [email protected] Manage your subscription at: http://developer.marklogic.com/mailman/listinfo/general
