【问题标题】:Most efficient way to import data to Prisma / PostgreSQL service?将数据导入 Prisma / PostgreSQL 服务的最有效方法?
【发布时间】:2019-01-30 03:30:08
【问题描述】:

我有一个附加到 PostgreSQL 数据库的 Prisma (1.14.2) 服务正在运行。我需要通过 Prisma 连接器插入许多与 PostgreSQL 数据库具有一对多关系的节点。现在我正在通过以下方式执行此操作。 strokessamples 数组包含很多节点:

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 倍的加速。但我想避免转换为Normalized Data Format (NDF)

我读到了关于在 PostgreSQL in general 中加速 INSERT,但我不确定是否以及如何将其应用于 Prisma 连接器。

【问题讨论】:

  • 在您删除您的最新问题之前,我无法发布此内容,所以在这里让您知道:FWIW,如果您有 std::stringstd::string_view,您可以使用 string_variable.front() == string_variable.back() 不支付所有费用正则表达式所需的成本

标签: postgresql prisma


【解决方案1】:

往返(查询您的 API、查询您的数据库并返回值)需要大量时间。 实际上,它肯定比实际的 SQL 查询花费更多的时间。

要解决您的问题,您可能应该 批处理 您的查询。有很多方法可以做到,你可以使用 GraphQL 查询批处理包,或者简单地这样做:

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

请记住 Prisma will time out queries taking longer than 45s,因此您可能希望限制批次大小。

给定每个批次的查询数 n,它将往返次数除以 n。

【讨论】:

    【解决方案2】:

    从 Prisma 2.20.0 版开始,您现在应该可以使用.createMany({})。 自从您 3 年前问起,这个答案可能没有帮助......

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

    【讨论】:

      猜你喜欢
      • 2012-09-20
      • 1970-01-01
      • 2012-08-06
      • 2012-05-11
      • 2016-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多