[英]Optic api, existsJoin by two or more columns causes a decrease in performance
对于这样的输入数据,我想获得一个结果,在该结果中我将只有那些对于相同的 id1 和 id2 具有 Reported 和 Primary 值的值。
var items = [
{
"id1": 241,
"id2": 716,
"type": "Primary"
},
{
"id1": 241,
"id2": 716,
"type": "Reported"
},
{
"id1": 477,
"id2": 850,
"type": "Reported"
},
{
"id1": 563,
"id2": 340,
"type": "Primary"
},
{
"id1": 649,
"id2": 322,
"type": "Reported"
}];
我尝试使用 exists join 如下所示:
const op = require('/MarkLogic/optic');
var reportedItems = op.fromLiterals(items)
.where(op.in(op.col('type'), 'Reported'))
.select(['id1', 'id2'], 'reported');
var primaryItems = op.fromLiterals(items)
.where(op.in(op.col('type'), 'Primary'))
.select(['id1', 'id2'], 'primary')
primaryItems
.existsJoin(reportedItems, [
op.on(op.viewCol('primary', 'id1'),
op.viewCol('reported', 'id1')),
op.on(op.viewCol('primary', 'id2'),
op.viewCol('reported', 'id2'))
])
.select("id1")
.result()
.toArray()
但是,当输入数据的项目数超过5000时,执行时间超过2秒。 但是,如果我只对一个属性(例如 id1)执行连接,结果几乎会立即出现(对于 5k 个对象 0.3s)。
为什么这么慢,我可以通过某种方式改进它或者使用其他方法来获得相同的结果吗?
我希望这会给出相同的结果,而且在我的测试中它似乎要快得多:
'use strict';
const op = require('/MarkLogic/optic');
var reportedItems = op.fromView('test', 'exists')
.where(op.in(op.col('type'), 'Reported'))
.select(['id1', 'id2'], 'reported')
.whereDistinct();
var primaryItems = op.fromView('test', 'exists')
.where(op.in(op.col('type'), 'Primary'))
.select(['id1', 'id2'], 'primary')
.whereDistinct()
primaryItems
.joinInner(reportedItems, [
op.on(op.viewCol('primary', 'id1'),
op.viewCol('reported', 'id1'))
],
op.eq(op.viewCol('primary', 'id2'),
op.viewCol('reported', 'id2'))
)
.select(op.viewCol('primary', 'id1'), '')
.result()
我认为在原始查询中发生的是existsJoin
正在执行primary
和reported
的交叉产品连接,并使用该结果来过滤primary
。 因为叉积太大,过滤器需要很长时间才能执行。
如果您知道自己没有任何重复行,则可以省略whereDistinct
- 我的数据是随机生成的用于测试,因此我不得不使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.