Как я могу улучшить производительность 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 может быстро идентифицировать интересный контент по индексам, но извлечение фактического контента с диска происходит относительно медленно. И отправка всех результатов за раз может означать попытку сохранить все результаты (потенциально миллиарды) в памяти перед отправкой ответа по проводам. Разбиение на страницы позволяет получать результаты в пакетном режиме, что сохраняет низкое использование памяти и потенциально допускает распараллеливание.

НТН!

Другие вопросы по тегам