Медленная гармонизация при использовании подстановочных знаков в MarkLogic

Я согласовываю документы в MarkLogic, которые завершаются в течение 26 минут без выполнения фрагментов подстановочного кода (закомментировано). Когда я выполняю приведенный ниже код, время согласования завершается гораздо дольше, 1 час 50 минут.

Этот фрагмент кода — моя попытка перевести приведенный ниже код SQL:

DECLARE @GETPRODLOSS decimal(18,2)
IF @ASSETNUMBER = NULL
    SET @GETPRODLOSS = NULL
ELSE
    SELECT @GETPRODLOSS = CONVERT(decimal(18,2), SUM(GLU/100)) 
        FROM AccountLedgerTable 
        WHERE GLDCT = 'MU' AND 
        GLSBLT = 'W' AND 
        LTRIM(SUBSTRING(GLASID,2,25)) LIKE concat('%',@assetNumber) AND 
        GLSBL LIKE concat('%',@workOrder) 
        GROUP BY GLANI
    RETURN(@GETPRODLOSS)
END

Интересно, почему так долго выполняется. Ниже приведены эквивалентные фрагменты кода javascript для этого в MarkLogic:

function getAffectedProduction(assetNumber, workOrder) {
  let accountLedger =  cts.search(cts.andQuery([
     cts.collectionQuery("JDEdwards"),
     cts.collectionQuery("JDEAccountLedger"),
     cts.elementWordQuery(fn.QName("http://www.example.com/ads/JDEdwards/document","GLDCT"), "MU"),
     cts.elementWordQuery(fn.QName("http://www.example.com/ads/JDEdwards/document","GLSBLT"), 'W'),
     cts.elementWordQuery(fn.QName("http://www.example.com/ads/JDEdwards/document","GLASID"), fn.concat("*", assetNumber), "wildcarded"),
     cts.elementWordQuery(fn.QName("http://www.example.com/ads/JDEdwards/document","GLSBL"), fn.concat("*", workOrder), "wildcarded")
   ]))


   let affectedProduction = new Number();

   if(fn.count(accountLedger) <= 0) return "";

   affectedProduction = 0;

   let docXML = new String();
   for (const item of accountLedger) {
    
     affectedProduction += fn.number(`${fn.normalizeSpace(hl.elementText(item, "GLU"))}`);

   }

   return fn.string(fn.abs(affectedProduction/100));

 }

Примечание. Я установил индекс диапазона элементов для элементов GLDCT, GLSBLT, GLASID, GLSBL.

Что-то не так с моим кодом? Или есть настройка интерфейса администратора, которую мне нужно включить при использовании подстановочных знаков?


person Ryan    schedule 03.10.2018    source источник


Ответы (1)


Взгляните на рекомендуемые настройки индекса подстановочных знаков от MarkLogic. Я бы также установил, что ваш вызов cts.search будет выполняться без фильтрации после того, как вы выполните рекомендации.

person Rob S.    schedule 03.10.2018
comment
Эй, @Rob, спасибо за ответ. Что вы подразумеваете под вызовом cts.search без фильтрации? - person Ryan; 03.10.2018
comment
@Ryan. Под нефильтрованным он подразумевает, что после того, как вы будете следовать рекомендациям, в вашем cts:search укажите значения параметров как нефильтрованный поиск. - person Shalini; 03.10.2018
comment
@Ryan, в вашей разработке может быть хорошей идеей запустить поток гармонизации как с фильтрацией, так и без фильтрации и сравнить результаты, чтобы убедиться в правильности ваших результатов. - person Fan Li; 03.10.2018
comment
Спасибо! я пытался использовать нефильтрованный вариант, но моя гармонизация заняла больше времени, более 2 часов. - person Ryan; 08.10.2018
comment
@Ryan, возможно, вы захотите проверить и посмотреть, сколько результатов возвращает ваш вызов cts.search. Если нефильтрованное возвращает больше, чем отфильтрованное, возможно, вы видите ложные срабатывания, которые могут увеличить время обработки. - person Rob S.; 08.10.2018