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
而不是 create
。 create
在后台为每个嵌套写入使用单独的插入。如果有很多 statement
连接到一个 context
记录,您将对远程数据库进行大量单独的查询,这会很慢。
您可以做的是:
- 使用
create
创建一个 context
记录,没有嵌套的 statement
记录。
- 对
statement
记录使用单独的 createMany
,使用从第 1 步获得的 id
手动指定 contextId
。
如果您认为合适,也可以将查询 1 和查询 2 包装在 transaction 中。
我正在用 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
而不是 create
。 create
在后台为每个嵌套写入使用单独的插入。如果有很多 statement
连接到一个 context
记录,您将对远程数据库进行大量单独的查询,这会很慢。
您可以做的是:
- 使用
create
创建一个context
记录,没有嵌套的statement
记录。 - 对
statement
记录使用单独的createMany
,使用从第 1 步获得的id
手动指定contextId
。
如果您认为合适,也可以将查询 1 和查询 2 包装在 transaction 中。