如何加快MarkLogic数据中心的协调

如何加快MarkLogic数据中心的协调,marklogic,marklogic-dhf,Marklogic,Marklogic Dhf,我目前正在做数据协调的开发工作。 我注意到协调的完成是一个缓慢的过程。 我对NoSQL/MarkLogic开发相对较新,不确定为了实现平稳、快速的协调,应该遵循哪些最佳实践 以下是一些事实: 数据加载: 暂存中加载的数据来自使用关系数据库的ERP系统。数据被提取到CSV中并加载到MarkLogic中 每个关系表数据都被提取到CSV文件中。每个表都用单独的实体表示 协调后: 227826条记录花了大约66分钟完成协调 1074151条记录花了大约4小时19分钟完成协调 协调代码片段: 有许多日期计

我目前正在做数据协调的开发工作。 我注意到协调的完成是一个缓慢的过程。
我对NoSQL/MarkLogic开发相对较新,不确定为了实现平稳、快速的协调,应该遵循哪些最佳实践

以下是一些事实:

数据加载:

  • 暂存中加载的数据来自使用关系数据库的ERP系统。数据被提取到CSV中并加载到MarkLogic中
  • 每个关系表数据都被提取到CSV文件中。每个表都用单独的实体表示
  • 协调后:

  • 227826条记录花了大约66分钟完成协调
  • 1074151条记录花了大约4小时19分钟完成协调
  • 协调代码片段:

  • 有许多日期计算逻辑(以下示例)
  • 函数getScheduleWindowEnd(业务单元、targetDateString、schEndDateString) { var scheduleWindowEnd=新字符串(); var preferredDate=新日期(); var startDayOfWeek=getBUStartDayOfWeek(业务单位); 如果(fn.empty(targetDateString)| | targetDateString==null | | targetDateString==“”| | fn.empty(schEndDateString)| | schEndDateString==null | | schEndDateString==“”) { tempScheduleWindowEnd=“”; 返回“”; } 其他的 { targetDateString=fn.replace(targetDateString,“/”,“-”; schEndDateString=fn.replace(schEndDateString,“/”,“-”; var targetDate=xs.date(targetDateString); var schEndDate=xs.date(schEndDateString); //获得首选日期 如果(fn.空(schEndDate)) { preferredDate=目标日期; } 其他的 { preferredDate=schEndDate; } //获取一周中的目标日期 var scheduledDayOfWeek=xdmp.weekdayFromDate(preferredDate); 如果(计划日期周<开始日期周) { scheduleWindowEnd=fn.string(addDays(preferredDate,(startDayOfWeek scheduledDayOfWeek)); } 其他的 { scheduleWindowEnd=fn.string(addDays(preferredDate,(startDayOfWeek scheduledDayOfWeek+7)); } scheduleWindowEnd=fn.replace(fn.substring(scheduleWindowEnd,1,10),“-”,“/”; tempScheduleWindowEnd=scheduleWindowEnd; } 返回调度窗口结束
    如果有可能,您可以考虑与MARKLogic的代表合作解决这个问题。提高软件性能可能是复杂的,最好与能够与您往返的人建立工作关系

    我经常问的第一个问题是:那么,您期望的SLA是什么?除非你有一个明确的期望集,你认为绩效应该是什么样子,否则我不能告诉你这是慢还是快,或者你的期望是现实的还是不现实的

    根据我的经验,性能问题往往分为两类:软件瓶颈或基础设施瓶颈。由于从200k到1m记录的时间外推似乎是线性的,我认为您的瓶颈不是一个严重的软件问题

    我要做的第一件事是检查MarkLogic监控历史记录,并确定您是否充分利用了您的基础设施。如果没有,请尝试增加协调工作负载的线程数和批量大小,以便充分利用您的基础架构

    如果您正在充分利用您的基础设施,您可以升级您的基础设施,也可以开始考虑改进您的软件

    根据您的代码,以下是一些改进软件的建议:

  • 使您的cts.search呼叫未经筛选(如果可能)
  • 尽可能限制cts.search调用。我有种感觉,你可能做的不仅仅是一份工作
  • 如果只需要从文档中提取一个元素,请考虑使用cts.elementValues代替cts.search
  • 规范化空间和其他字符串函数可能会占用大量文本字符串。如果使用大字符串,考虑是否可以减少使用它们的次数。
  • 我建议为您拉入的每种类型的表在文档上实现一个唯一的XML名称空间,这样您就不需要集合查询了

  • 除了Rob的建议之外,您可能还需要检查协调中的收集器步骤。看起来您正在将多个记录折叠到一个实体实例中,如果不迭代所有记录,效果最好。迭代记录URI是默认的收集器实现。例如,您可能希望将其替换为您正在创建的实体的某个唯一id上的cts.values

    如果您真的要迭代URI,那么可能是因为您正在重新创建同一实体实例的次数与它所包含的记录的次数相同,这将意味着大量的时间浪费。您可以通过查看最终数据库在从干净的数据库运行协调后是否包含大量已删除的片段来检查这一点


    通过使用
    xdmp.elapsedTime
    记录各个步骤的运行时间,您可以开始识别插件中的慢步骤。感谢您的回复!我应该在什么时候调用它,在函数调用之前还是之后?我会记录函数调用前后经过的时间。不同的是函数的执行时间。谢谢@Rob S!以上这些建议是有道理的!