【问题标题】:Prisma: very slow nested writes when connecting with remote DB Postrgsql on AWSPrisma:在 AWS 上连接远程 DB Postrgsql 时嵌套写入非常慢
【发布时间】:2021-11-21 15:54:33
【问题描述】:

我正在用 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 重现此问题。

当使用 'DEBUG=*' 运行 Prisma 时,cli output

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

【问题讨论】:

  • 你正在使用 promise ,但你没有解决你确实返回了!
  • 您能否尝试启用nApi 并查看是否有任何更改?您可以了解如何为您的 prisma here 版本执行此操作。如果这不能解决问题,您能否记录您的 Prisma 事件并提供运行查询时发生的情况?您可以设置环境变量export DEBUG="*" 来执行此操作,如文档的debugging article 中所述。
  • @TasinIshmam 嗯,我尝试使用“debug=*”和“debug=prisma*”,但输出与我在上面的要点中发布的相同。最后一条消息来自引擎:`prisma:client:libraryEngine 发送请求,this.libraryStarted: true +13s`。我看不到如何按时获取每个步骤的日志。我会尝试更多地研究这个
  • 您可能会考虑添加自己的调试日志记录,以查看您的 Prisma 查询和查询持续时间实际生成了哪些 SQL 查询。您可以挂钩 Prisma 中的“查询”事件来执行此操作。这是一些代码: prisma.$on('query', (e: any) => { const msg = \nBegin query (Prisma): -----\n Query: ${e.query}\n Parameters:${e.params}\n Duration: ${e.duration}ms\nEnd query (Prisma): -----\n console.debug(msg); })
  • @OlegYarin 嘿,真的很抱歉。让我看看能不能让人看看!

标签: postgresql nestjs prisma


【解决方案1】:

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

你可以做的是:

  1. 使用create 创建一条context 记录,不包含嵌套的statement 记录。
  2. statement 记录使用单独的 createMany,使用从步骤 1 中获得的 id 手动指定 contextId

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

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 2012-01-03
    • 1970-01-01
    • 2021-01-19
    • 2010-09-21
    • 2019-10-12
    • 2018-04-09
    • 2019-02-05
    • 2022-06-14
    相关资源
    最近更新 更多