Самый эффективный способ импорта данных в сервис Prisma/PostgreSQL?

У меня работает служба Prisma (1.14.2), которая подключена к базе данных PostgreSQL. Мне нужно вставить множество узлов с отношением «один ко многим» в базу данных PostgreSQL через коннектор Prisma. Сейчас я делаю это следующим образом. Массивы strokes и samples содержат много узлов:

for (let strokeIndex = 0; strokeIndex < painting.strokes.length; strokeIndex++) {
    const stroke = painting.strokes[strokeIndex];
    const samples = stroke.samples;
    const createdStroke = await PrismaServer.mutation.createStroke({
        data: {
            myId: stroke.id,
            myCreatedAt: new Date(stroke.createdAt),
            brushType: stroke.brushType,
            color: stroke.color,
            randomSeed: stroke.randomSeed,
            painting: {connect: {myId: jsonPainting.id}},
            samples: { create: samples }
        }
    });
}

В случае 128 штрихов и 128 сэмплов для каждого штриха (т.е. всего 16348 семплов) это занимает около 38 секунд.

Интересно, есть ли способ ускорить процесс? Тем более, что количество штрихов и семплов может стать намного больше. Я мог бы использовать prisma import ..., который показал 6-кратное ускорение. Но я хочу избежать обязательного преобразования в Формат нормализованных данных (NDF).

Я читал об ускорении INSERT в PostgreSQL в целом, но я не уверен, могу ли я применить это к разъему Prisma и как это сделать.


person 1awuesterose    schedule 23.08.2018    source источник
comment
Я не мог опубликовать это, пока вы не удалили свой последний вопрос, поэтому просто дайте вам знать здесь: FWIW, если у вас есть std::string или std::string_view, вы можете просто использовать string_variable.front() == string_variable.back(), не оплачивая все расходы, необходимые для регулярного выражения   -  person NathanOliver    schedule 28.02.2019


Ответы (2)


Круговые обходы (запросы к вашему API, которые запрашивают вашу базу данных и возвращают значения) занимают много времени. На самом деле, это определенно занимает больше времени, чем собственно SQL-запрос.

Чтобы решить вашу проблему, вам, вероятно, следует группировать ваши запросы. Есть много способов сделать это, вы можете использовать пакет пакетной обработки запросов GraphQL или просто сделать это следующим образом:

mutation {
  q1: createStroke(color: "red") {
    id
  }
  q2: createStroke(color: "blue") {
    id
  }
}

Помните, что у Prisma истечет время ожидания. запросы занимают больше 45 секунд, поэтому вы можете ограничить размер пакетов.

Учитывая n количество запросов в пакете, он разделит количество обращений туда и обратно на n.

person Namoz    schedule 04.09.2018

Начиная с Prisma версии 2.20.0, теперь вы сможете использовать .createMany({}). Вероятно, этот ответ не будет полезен, так как вы спросили 3 года назад...

https://www.prisma.io/docs/concepts/components/prisma-client/crud#create-multiple-records

person victorkurauchi    schedule 29.07.2021