【问题标题】:Mongodb Aggregation pipeline performance issue after lookup stage查找阶段后的 Mongodb 聚合管道性能问题
【发布时间】:2020-04-24 18:34:50
【问题描述】:

我尝试在庞大的数据集上运行查询,但在查找阶段(第 3 阶段)之后,它花费了太多时间(大约 12 小时)。如何提高查询性能。我正在使用具有 16 cpu、64 gb RAM 和 mongodb 4.0 版本的单节点。

// Pipeline
[
    // Stage 1
    {
        $match: {
         "ID" : "XXXXX"
        }
    },

    // Stage 2
    {
        $redact: {
           $cond: [ { $or: [ { $eq: [ "$Masterid", "" ] }, { $or: [ { $eq: [ "$VKORG", "" ] }, { $or: [ { $eq: [ "$VTWEG", "" ] },{ $eq: [ "$UDATE", "" ] } ] } ] } ] } ] } ] } ] } ] }, "$$PRUNE", "$$KEEP" ] 
        }
    },

    // Stage 3
    {
        $lookup: {
            from: "BU07-02", let: { raw_Masterid: "$Masterid", raw_VKORG: "$VKORG", raw_VTWEG: "$VTWEG", raw_SPART: "$SPART", raw_KUNNR: "$KUNNR",
               raw_VBELN: "$VBELN", raw_POSNR: "$POSNR", raw_UDATE: "$UDATE", raw_KNUMH: "$KNUMH", raw_AUART: "$AUART", raw_FKART: "$FKART",
                }, pipeline: [ { $match: { $expr: { $and: [ { $eq: [ "$$raw_Masterid", "$Masterid" ] }, 
                  { $and: [ { $eq: [ "$$raw_VKORG", "$VKORG" ] }, { $and: [ { $eq: [ "$$raw_VTWEG", "$VTWEG" ] }, { $and: [ { $eq: [ "$$raw_SPART", "$SPART" ] },
                     { $and: [ { $eq: [ "$$raw_KUNNR", "$KUNNR" ] }, { $and: [ { $eq: [ "$$raw_VBELN", "$AUBEL" ] }, { $and: [ { $eq: [ "$$raw_POSNR", "$AUPOS" ] }, 
                       { $lte: [ "$$raw_UDATE", "$UDATE" ] } ] } ] } ] } ] } ] } ] } ] } } } ], as: "BU07-02"
        }
    },

    // Stage 4
    {
        $unwind: {
            path : "$BU07-02",

        }
    },

    // Stage 5
    {
        $redact: {
        $cond: [ { $and: [ { $eq: [ "$Masterid", "$BU07-02.Masterid" ] }, { $and: [ { $eq: [ "$VKORG", "$BU07-02.VKORG" ] }, { $and: [ { $eq:
           [ "$VTWEG", "$BU07-02.VTWEG" ] }, { $and: [ { $eq: [ "$SPART", "$BU07-02.SPART" ] }, { $and: [ { $eq: [ "$KUNNR", "$BU07-02.KUNNR" ] }, 

                     { $and: [ { $ne: [ "$BU07-02.FKART", "ZBS1" ] },
                              { $and: [ { $ne: [ "$BU07-02.FKART", "ZBS2" ] }, { $and: [ { $ne: [ "$VBTYP", "U" ] }, { $and: [ { $ne: [ "$BU07-02.VBTYP", "U" ] }, 
                                { $ne: [ "$BASE_ENTITY", true ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] }, "$$KEEP", 
                                "$$PRUNE" ] }
    },      
],

);

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    $lookup 的管道形式和$expr 运算符都不能有效地使用索引。这意味着$lookup 阶段实质上是从磁盘读取BU07-02 集合中的每个文档,以评估所有条件。

    您可以尝试选择您期望通常会返回最少文档的条件,并以$lookupforeignField 形式使用它,确保BU07-02 中的该字段上有索引,然后应用其余条件使用$match$filter

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多