У меня есть база данных ML с несколькими десятками тысяч документов и запрос, который возвращает несколько простых вычисленных значений для всех или для подмножества этих документов. Количество документов выросло до такой степени, что опция «все документы» больше не работает надежно без тайм-аута и будет только ухудшаться по мере роста количества документов. Очевидным решением является использование клиентским приложением другой формы и разбивка результатов на страницы. Это автономный пакетный процесс, поэтому общая скорость не является проблемой - мы просто хотели бы, чтобы отдельные запросы были разумными.
Страничная версия запроса очень проста:
declare namespace ns = "http://some.namespace/here"
declare variable $fromCount external;
declare variable $toCount external;
<response> {
for $doc in fn:doc()/ns:entity[$fromCount to $toCount]
return
<doc> omitted for brevity </doc>
} </response>
Проблема в том, что запрос тем медленнее, чем дальше по документу находится запрошенная страница; предположительно потому, что ему нужно загружать каждый документ по порядку, проверять, является ли он правильным типом, и повторять до тех пор, пока он не найдет $fromCount
ns:entity
s, прежде чем он даже начнет строить ответ.
Одна проблема заключается в том, что в базе данных есть другие типы документов, поэтому просто использовать fn: doc нереально (хотя они находятся в разных каталогах, поэтому xdmp:directory()
может быть вариантом; кое-что я изучу.)
Также в настоящее время нет индекса для элемента ns:entity
; это поможет? Это всегда корневой узел документа, а документы довольно большие, поэтому меня беспокоит размер индекса. Кроме того, (медленная часть) этого запроса не интересует значение элемента, а только то, что он существует.
Я думал об использовании search:
api для встроенного разбиения на страницы, но это кажется излишним для запроса, который предназначен для сопоставления всех документов; конечно, можно вручную создать запрос, который search:search()
будет строить внутренне.
Похоже, что мне действительно нужен эффективный список всех корневых узлов определенного типа в базе данных. Поддерживает ли Marklogic такую вещь? Если нет, решит ли проблему индекс?
Изменить: Оказывается, в моем случае ответом является использование опции xdmp:directory()
, поскольку ML, по-видимому, хранит быстрый список всех документов в памяти. Тем не менее, если есть более общее решение проблемы, оно обязательно заинтересует, поэтому я оставлю вопрос здесь.