我目前正在为协调我们的数据进行开发工作。我注意到协调的完成很慢。
我对 NoSQL / MarkLogic 开发相对较新,并且不确定要遵循哪些最佳实践才能实现平稳、更快的协调。
以下是一些事实:
数据加载:
- 暂存中加载的数据来自使用关系数据库的 ERP 系统。数据被提取到 CSV 并加载到 MarkLogic
- 每个关系表数据都被提取到一个 CSV 文件中。每个表都以单独的实体表示。
后期协调:
- 227,826 条记录大约需要 66 分钟才能完成协调
- 1074151 条记录完成统一耗时约 4 小时 19 分钟
协调代码片段:
- 有许多日期计算逻辑(示例如下)
function getScheduleWindowEnd(businessUnit,targetDateString,schEndDateString)
{
var scheduleWindowEnd = new String();
var preferredDate = new Date();
var startDayOfWeek = getBUStartDayOfWeek(businessUnit);
if (fn.empty(targetDateString) || targetDateString == null || targetDateString == "" ||
fn.empty(schEndDateString) || schEndDateString == null || schEndDateString == "")
{
tempScheduleWindowEnd = "";
return "";
}
else
{
targetDateString = fn.replace(targetDateString, "/", "-") ;
schEndDateString = fn.replace(schEndDateString,"/","-");
var targetDate = xs.date(targetDateString);
var schEndDate = xs.date(schEndDateString);
// Get preferred date
if (fn.empty(schEndDate))
{
preferredDate = targetDate;
}
else
{
preferredDate = schEndDate;
}
//get target day of week
var scheduledDayOfWeek = xdmp.weekdayFromDate(preferredDate);
if (scheduledDayOfWeek < startDayOfWeek)
{
scheduleWindowEnd = fn.string(addDays(preferredDate,(startDayOfWeek-scheduledDayOfWeek)));
}
else
{
scheduleWindowEnd = fn.string(addDays(preferredDate,(startDayOfWeek-scheduledDayOfWeek+7)));
}
scheduleWindowEnd = fn.replace(fn.substring(scheduleWindowEnd, 1, 10), "-", "/");
tempScheduleWindowEnd = scheduleWindowEnd;
}
return scheduleWindowEnd
}
- 主实体从其他实体获取一些元素数据(在下面的示例中,Table2 是其他实体)
<StatusDescription>${fn.normalizeSpace(getUDCDescription("00", "SS", fn.normalizeSpace(hl.elementText(source, "WASRST", true))))}</StatusDescription>
function getUDCDescription(drsy,drrt,drky) {
let udcRecord = cts.search(cts.andQuery([
cts.collectionQuery("ERPSystemSource"),
cts.collectionQuery("Table2"),
cts.elementWordQuery(xs.QName("DRSY"), drsy),
cts.elementWordQuery(xs.QName("DRRT"), drrt),
cts.elementWordQuery(xs.QName("DRKY"), drky)
]))
let docXML = new String();
for (const item of udcRecord) {
docXML += hl.encodeXml(fn.normalizeSpace(hl.elementText(item, "DRDL01", true)))
}
return docXML;
}
- 一些协调数据是一对一的(直接获取)。请参阅下面的示例:
<Element1>${hl.elementText(source, "WADOCO", true)}</Element1>
<Element2>${fn.normalizeSpace(hl.elementText(source, "WAMCU", true))}</Element2>
- 有许多 for 循环调用(未嵌套),大约 20 个调用。上面 #2 中的示例: