RethinkDB: обновление нескольких записей массива с использованием ReQL с высокой производительностью

Внутри одного документа моей таблицы я пытаюсь добиться обновления нескольких записей массива с высокой производительностью.

Массив составляет около 20 тыс. записей, и я пытаюсь объединить 5 тыс. изменений элементов. Вот пример:

      "entities": [
    {
        "debug_name": {
            "value": "Entity 1"
        },
        "euid": {
            "value": "9fcde834-f5ca-4b98-885d-c000365bd921"
        },
        "local_transform": {
            "orientation": [
                -0.7070000171661377,
                0,
                0,
                0.7070000171661377
            ],
            "position": [
                0,
                0,
                0
            ],
            "scale": [
                1,
                1,
                1
            ]
        }
    },
    {
        "debug_name": {
            "value": "Default (IfcSite)"
        },
        "euid": {
            "value": "9fcde834-f5ca-4b98-885d-c000365bd923"
        },
        "lineage": {
            "parentUUID": "9fcde834-f5ca-4b98-885d-c000365bd921"
        },
        "local_transform": {
            "orientation": [
                0,
                0,
                0,
                1
            ],
            "position": [
                0,
                0,
                0
            ],
            "scale": [
                1,
                1,
                1
            ]
        }
    },
    [.....]
]

Записи идентифицируются по "euid": {"value"}объект, и моя цель — объединить некоторые значения в эти записи.

Мой первый подход был:

      r.db('desc')
.table('scene')
.get(sceneUUID)
.update(function(row)
{
    const cMap = r.expr(componentMap);

    return {
        entities : row('entities').map(entity =>
        {
            const euid  = entity('euid')('value');

            return r.branch(
                 cMap.hasFields(euid),
                 entity.merge(cMap.getField(euid)),
                 entity
            );
        })
    };
})

это объект, используемый в качестве карты, ссылающейся на новые значения для объединения с существующими записями.

Пример :

      {
    "32204602-445c-453f-b94a-5f31bb6858ea": {
        "material_ref": {
            "value":"c22177c3-32d7-453b-bfb3-bdc80f6de01e",
            "faceCulling":0
        }
    },
    [.....]
 }

Этот запрос работает, но занимает более 5 минут при отправке componentMap5k записей в массиве из 18163 элементов. В течение этих 5 минут документ не может быть прочитан.

Мои вопросы:

  • Как я могу оптимизировать этот запрос?

  • Улучшит ли сегментирование или масштабирование моей базы данных производительность этого запроса?

0 ответов

Другие вопросы по тегам