Orientdb имеет очень низкую производительность при вставке с проверкой дубликатов - PullRequest
0 голосов
/ 02 июля 2018

Я использую REST API для отправки пакета команд SQL в OrientDB. Каждая партия содержит около 6000 вершин и 13200 ребер. Я создаю вершины и ребра, используя CSV, 1 пакет - это все запросы, сгенерированные при разборе 100 строк в CSV. Я проверяю наличие дубликатов перед тем, как вставить, как показано ниже:

Vertex

UPDATE vertex SET property1 = "property1", property2 = "property2" UPSERT WHERE property1 = "property1";

Edge (используя этот метод, поскольку UPSERT не поддерживается с краями)

LET $1 = SELECT expand(bothE("edge1")) FROM vertex1 WHERE property1 = "property1";
LET $2 = SELECT expand(bothE("edge1")) FROM vertex2 WHERE property1 = "property1";
LET $3 = SELECT INTERSECT($1, $2);
IF($3.INTERSECT.size() == 0) {
LET $4 = CREATE EDGE edge1 FROM (SELECT FROM vertex1 WHERE property1 = "property1") TO (SELECT FROM vertex2 WHERE property1 = "property1");

Первая партия занимает около 50 секунд, затем вторая - около 250 секунд, а третья - более 1000 секунд. Я подозреваю, что поиск дубликатов в предыдущих записях - это то, что замедляет его, однако, я подозреваю, что это настолько маленький объем данных, что виновата либо моя проверка на дубликаты, либо конфигурация сервера.

Есть ли лучший способ проверить наличие дубликатов? Я обновил свою конфигурацию сервера, чтобы использовать следующее:

storage.diskCache.bufferSize = 40GB
query.parallelMinimumRecords = 1
storage.useWAL = false

Любой совет приветствуется

...