Проблема производительности конвейера Mongodb Aggregation после этапа поиска - PullRequest
0 голосов
/ 24 апреля 2020

Я пытался выполнить запрос к огромному набору данных, но после этапа поиска (этап 3) это заняло слишком много времени (приблизительно 12 часов). Как мне улучшить производительность запросов. Я использую один узел с 16 процессорами, 64 ГБ ОЗУ с версией 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" ] }
    },      
],

);

1 Ответ

0 голосов
/ 24 апреля 2020

Ни конвейерная форма $lookup, ни оператор $expr не могут эффективно использовать индекс. Это означает, что этап $lookup, по сути, читает все документы в коллекции BU07-02 с диска, чтобы оценить все критерии.

Вы можете попробовать выбрать критерии, которые, как вы ожидаете, обычно возвращают меньше документов и используйте его в foreignField форме $lookup, убедившись, что в этом поле есть индекс BU07-02, а затем примените остальные критерии, используя $match или $filter.

...