簡體   English   中英

Optic api, existsJoin by two or more columns 導致性能下降

[英]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正在執行primaryreported的交叉產品連接,並使用該結果來過濾primary 因為叉積太大,過濾器需要很長時間才能執行。

如果您知道自己沒有任何重復行,則可以省略whereDistinct - 我的數據是隨機生成的用於測試,因此我不得不使用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM