es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La paginación en Prisma con Cursor es lenta.

He probado ambos métodos (cursor y offset) para paginar a través de mi base de datos de aproximadamente 1000 documentos, sin embargo, no logro que el método del cursor sea más rápido que el método del offset.

// método del cursor
const allDocs = []
let queryResults = await prismaClient.obsidian.findMany({
    take: 100
})
while (queryResults.length > 0) {
    allDocs.push(...queryResults)
    queryResults = await prismaClient.obsidian.findMany({
        take: 100,
        skip: 1,
        cursor: {
            id: queryResults[queryResults.length - 1]!.id
        }
    })
}
return allDocs

Tarda aproximadamente ~25 segundos en completarse (Nota: también parece estar utilizando OFFSET, ¿no se supone que esto no debería suceder?)

Query: SELECT "public"."obsidian"."id", "public"."obsidian"."doc", "public"."obsidian"."createdAt", "public"."obsidian"."updatedAt", "public"."obsidian"."filename" FROM "public"."obsidian", (SELECT "public"."obsidian"."id" AS "obsidian_id_0" FROM "public"."obsidian" WHERE ("public"."obsidian"."id") = ($1)) AS "order_cmp" WHERE "public"."obsidian"."id" >= "order_cmp"."obsidian_id_0" ORDER BY "public"."obsidian"."id" ASC LIMIT $2 **OFFSET** $3
// método del offset
const count = await prismaClient.obsidian.count()
const pages = Math.ceil(count / 100)
const allDocsPromises = []
for (let i = 0; i < pages; i++) {
    const page = prismaClient.obsidian.findMany({
        skip: i * 100,
        take: 100
    })
    allDocsPromises.push(page)
}
const allDocs = await Promise.all(allDocsPromises)
return _.flatten(allDocs)

Tarda aproximadamente ~14 segundos en completarse. Mi idea es que el método del offset se ejecuta más rápido debido a Promise.all(), pero ¿hay alguna forma de hacer que la paginación del cursor devuelva todos los documentos de manera súper rápida?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Análisis de los Métodos de Paginación en Node.js con Postgresql y Prisma

    Como experto en TI especializado en Node.js, PostgreSQL y Prisma, he analizado los métodos de paginación (cursor y offset) utilizados para iterar a través de una base de datos con alrededor de 1,000 documentos. Ambos métodos se han utilizado para recuperar los datos, pero el método del cursor es más lento y parece utilizar OFFSET, lo cual no es deseable.

    El método del cursor compara el uso de una declaración while para recuperar datos y se tarda alrededor de 25 segundos en completarse. Sin embargo, notamos que el método del cursor utiliza OFFSET, lo cual no es el comportamiento deseado. Por otro lado, el método de offset utiliza una función de conteo para determinar el número total de páginas que se utilizarán en una llamada a la API, en base a la cual se recuperan los registros utilizando un bucle, y una función Promise.all() aplanaría los resultados en un solo arreglo. Este método (offset) tarda alrededor de 14 segundos en recuperar los datos.

    Según mi análisis, el método de offset parece ser más rápido que el método del cursor, y aprovecha Promise.all() como el secreto de su velocidad, ya que evita el temido bucle while. Sin embargo, es importante tener en cuenta que no existe una solución lista para hacer que el método del cursor sea más rápido.

    En conclusión, el método de offset es más rápido y eficiente cuando se trata de paginación en Node.js con Postgresql y Prisma, ya que evita bucles infinitos y utiliza Promise.all() para agregar datos.

Comments are closed.