Я создаю приложение Node.js, которое работает с ArangoDB в качестве хранилища данных. По сути, в качестве структуры данных у меня есть две таблицы, одна для управления так называемым instances
, другая для entities
. Я делаю следующее:
- В коллекции
instances
есть документ на каждыйinstance
, который у меня есть. - Всякий раз, когда я добавляю объект в коллекцию
entities
, я также хочу отслеживать объекты, принадлежащие конкретному экземпляру. - Таким образом, в каждом документе
instance
есть поле массива дляentities
, и я помещаю идентификатор объекта в этот массив.
Следующий код показывает общую схему:
// Connect to ArangoDB.
db = new Database(...);
db.useBasicAuth(user, password);
// Use the database.
await db.createDatabase(database);
db.useDatabase(database);
// Create the instance collection.
instanceCollection = db.collection(`instances-${uuid()}`);
await instanceCollection.create();
// Create the entities collection.
entityCollection = db.collection(`entities-${uuid()}`);
await entityCollection.create();
// Setup an instance.
instance = {
id: uuid(),
entities: []
};
// Create the instance in the database.
await db.query(aql`
INSERT ${instance} INTO ${instanceCollection}
`);
// Add lots of entities.
for (let i = 0; i < scale; i++) {
// Setup an entity.
const entity = {
id: uuid()
};
// Update the instance.
instance.entities.push(entity);
// Insert the entity in the database.
await db.query(aql`
INSERT ${entity} INTO ${entityCollection}
`);
// Update the instance in the database.
await db.query(aql`
FOR i IN ${instanceCollection}
FILTER i.id == ${instance.id}
UPDATE i WITH ${instance} IN ${instanceCollection} OPTIONS { mergeObjects: false }
`);
}
Проблема сейчас в том, что это становится чрезвычайно медленным, чем больше объектов я добавляю. В основном он имеет экспоненциальный рост, хотя я ожидал линейного роста:
Running benchmark 'add and update'
100 Entities: 348.80ms [+0.00%]
1000 Entities: 3113.55ms [-10.74%]
10000 Entities: 90180.18ms [+158.54%]
Добавление индекса имеет эффект, но ничего не меняет в общей проблеме:
Running benchmark 'add and update with index'
100 Entities: 194.30ms [+0.00%]
1000 Entities: 2090.15ms [+7.57%]
10000 Entities: 89673.52ms [+361.52%]
Проблема может быть отслежена до оператора UPDATE
. Если вы опустите его и будете использовать только оператор базы данных INSERT
, масштабирование будет линейным. Значит, что-то не так с самим обновлением. Однако я не понимаю, где проблема.
Вот что я хотел бы понять: почему оператор UPDATE
со временем становится значительно медленнее? Я использую это неправильно? Это известная проблема в ArangoDB? …?
Что меня не интересует, так это обсуждение этого подхода: Пожалуйста, принимайте то, что дано. Давайте сосредоточимся на производительности оператора UPDATE
. Любые идеи?
ОБНОВИТЬ
Как просили в комментариях, вот некоторая информация о настройке системы:
- ArangoDB 3.4.6, 3.6.2.1 и 3.7.0-alpha.2 (все работают в Docker, на macOS и Linux)
- Настройка одного сервера
- ArangoJS 6.14.0 (у нас также было это с более ранними версиями, хотя я не могу сказать точную версию)
use the database's ADD statement
? Насколько мне известно, нет операции или функции ADD. Вы имеете в виду что-то вроде этого?LET scale = 10000 RETURN (FOR i IN 1..scale RETURN { id: i })
- person CodeManX   schedule 25.03.2020INSERT
вместоADD
. Я починил это. - person Golo Roden   schedule 25.03.2020