Как я могу улучшить производительность Marklogic 7 на следующем: /*[fn:name()="что-то"]
У меня есть базовый запрос:
/*[fn:name()="something"]
(1) Marklogic 7 занимает несколько секунд, есть ли индекс, который я могу добавить, чтобы сделать этот запрос быстрее?
(2) Что в пределах памяти должно быть увеличено для повышения производительности?
(3) Существуют ли другие способы повысить производительность с помощью другого запроса, но получить точно такой же результат?
3 ответа
Попробуйте использовать fn:node-name
вместо. Я считаю, что это оптимизировано. Вам нужно будет правильно обрабатывать пространства имен, и это является частью того, почему его можно оптимизировать, пока fn:name
не может.
/*[fn:node-name()=fn:QName("","something")]
Следующие два xPath должны быть одинаковыми:
/theNameOfMyElement
а также
/*[fn:name()="theNameOfMyElement"]
Последний добавляет ненужный и дорогостоящий классификатор. Во-первых, *
должен искать все, а не только элементы. Есть несколько других проблем с этим подходом.
Если мой первый запрос все еще занимает много времени, используйте cts:search
, что намного быстрее, поскольку он ищет по индексам. Вышеприведенные запросы можно записать так:
cts:search(/theNameOfMyElement, ())
Где второй параметр (пустая последовательность) может быть уточняющим cts:query
,
Если пространства имен вам подходят, вы можете просто сделать:
/*:theNameOfMyElement
/*[fn:name()="something"]
мне кажется, это очень плохая практика. использование /something
вместо.
РЕДАКТИРОВАТЬ
Увидев, что другой ответ был принят, я пытался придумать, какой сценарий вы должны пытаться решить, если его решение сработало, а мое - нет. Я все еще очень уверен, что есть более быстрый способ, просто используя xPath, как он был разработан для работы.
Подумав, я решил, что ваш "реальный" сценарий должен включать динамическое имя элемента, или вы, возможно, пытаетесь проверить, соответствует ли имя элемента одному из последовательности имен.
Я составил пример с выводом, приведенным ниже, который демонстрирует, как вы все еще можете использовать оба без использования классификатора, основанного на fn:node-name
let $xml as element(sample) := <sample>
<wrapper>
<product>
<entry>
<red>$1.00</red>
<yellow>$3.00</yellow>
<blue>$4.50</blue>
</entry>
</product>
</wrapper>
</sample>
let $type as xs:string := "product"
return $xml/wrapper/xdmp:unpath($type)/entry/(red|yellow)
(: Returns
<red>$1.00</red>
<yellow>$3.00</yellow>
:)
В дополнение к другим хорошим предложениям рассмотрите возможность применения нумерации страниц. MarkLogic может быстро идентифицировать интересный контент по индексам, но извлечение фактического контента с диска происходит относительно медленно. И отправка всех результатов за раз может означать попытку сохранить все результаты (потенциально миллиарды) в памяти перед отправкой ответа по проводам. Разбиение на страницы позволяет получать результаты в пакетном режиме, что сохраняет низкое использование памяти и потенциально допускает распараллеливание.
НТН!