我从一个MySQL表( customTable)中获取所有记录,这个表有一个主键。我还从salesforce对象(customTable__c)从salesforce查询所有记录。我正在试图找到销售人员的记录,但已从数据库中删除。桌子和销售队伍都有大约80000张唱片。我使用下面的脚本进行比较,但是这个脚本需要很长时间才能完成。
salesforce数据以JSON格式出现:
[
{
"Product_Line__c": "Sample",
"ExternalId__c": "a9M5C000000GoJxUAK",
},
{
"Product_Line__c": "Sample2",
"ExternalId__c": "a9M5C000000GoJxUAL"
}
]
数据库记录以JSON格式出现:
[
{
"changed_on": "2021-12-08T11:24:50",
"primaryKey":"a9M5C000000GoJxUAL"
},
{
"changed_on": "2021-12-08T11:24:50",
"primaryKey":"a9M5C000000GoJxUAQ"
}
]
主键是一个字符串。
预期输出( salesforce和数据库中主/外部id的差异:
[
"ExternalId__c" : "a9M5C000000GoJxUAK",
"Is_RM_Deleted__c" : true
]
我们还有别的好办法吗?我们能更快地完成任务吗?
salesforce.externaID是一个80k记录的数组。
database.primaryKey是一个80k记录的数组。
%dw 2.0
output application/json
(salesforce.externalID -- database.primaryKey)
map {
"ExternalId__c": $,
"Is_RM_Deleted__c": true
}
发布于 2022-01-31 06:27:08
通常,在性能方面,DW不是瓶颈。您正在从DB和Salesforce加载160 k记录。默认情况下,Mulesoft将尝试流,一开始只加载几条记录。在DW代码中,您使用两个流,这意味着在执行DW转换时,Mulesoft将所有160 K记录加载到内存中,这可能需要一些时间。
如果您想要找到消耗每个流所需的时间,可以在DB和Salesforce查询之后添加带有sizeOf()的转换操作符。这个sizeOf()函数消耗了流,您可以这样计时它。
如果性能瓶颈正在加载数据,则可能必须将其分解为较小的块。
如果您已经有了内存中的数据,您可以尝试这样的方法:
如果在内存中加载记录不是瓶颈,您可以尝试这样的方法:
%dw 2.0
output application/json
var salesforce = [
{ externalID: 1 },
{ externalID: 2 },
{ externalID: 3 }
]
var database = [
{ primaryKey: 1 },
{ primaryKey: 2 }
]
var bSearch = java!java::util::Arrays::binarySearch
var databaseSortedArray = database.primaryKey orderBy ($)
---
salesforce
filter ((databaseSortedArray bSearch $.externalID) < 0)
map {
ExternalId__c: $.externalID,
Is_RM_Deleted__c: true,
}
这将使用标准的java函数进行二进制搜索,这需要对PrimaryKey数组进行排序。为了获得更好的性能,可以向SQL查询中添加order子句,以便在DB中进行排序。
https://stackoverflow.com/questions/70925208
复制相似问题