Prisma:在 AWS 上连接远程数据库 Postrgsql 时嵌套写入速度非常慢

Prisma: very slow nested writes when connecting with remote DB Postrgsql on AWS

我正在用 prisma 编写一个非常基本的查询:

async createContext(contextData: CreateContextDto): Promise<ContextRO> {
    const statements = contextData.body
      .split('\n')
      .filter((statement) => statement !== '')
      .map((statement) => ({ content: statement }));
    const context = await this.prisma.context.create({
      data: {
        contextName: contextData.name,
        userId: contextData.user,
        statements: {
          create: statements,
        },
      },
      include: {
        statements: true,
      },
    });

    return { context };

使用本地 PostgreSQL,相同的查询大约需要 4 秒。当连接到 AWS 上的 PostgreSQL 时,它最多需要 90 秒。

知道为什么要花这么长时间吗?

请找一个example repo重现这个问题。

cli output 当 运行ning Prisma 与 'DEBUG=*'

ps。如果我 运行 在 aws 上使用 PostgreSQL 使用 typeorm 进行相同的查询,则需要 1-2 秒,因此这不是部署问题。 (检查分支“typeorm”以查看比较)

您应该使用 createMany 而不是 createcreate 在后台为每个嵌套写入使用单独的插入。如果有很多 statement 连接到一个 context 记录,您将对远程数据库进行大量单独的查询,这会很慢。

您可以做的是:

  1. 使用 create 创建一个 context 记录,没有嵌套的 statement 记录。
  2. statement 记录使用单独的 createMany,使用从第 1 步获得的 id 手动指定 contextId

如果您认为合适,也可以将查询 1 和查询 2 包装在 transaction 中。