Arregla consultas lentas de Prisma con ejecución SQL directa

¿Te encanta el DX de Prisma pero necesitas menos sobrecarga de lectura en las formas de consulta compatibles? El JSON de benchmarks actual muestra aceleraciones promedio en Prisma v6, v7 y v8 para lecturas compatibles en PostgreSQL y SQLite; cada forma de consulta varía.

Acelerar Prisma ahora

  • Lecturas compatibles más rápidas
  • Sin cambios de consulta
  • JSON de benchmarks actual
  • PostgreSQL y SQLite
Tu llamada a Prismauser.findMany
const users = await prisma.user.findMany({
  where: { status: 'ACTIVE' },
  include: { posts: true },
})
SQL que ejecuta prisma-sql
SELECT user_t.id, user_t.email, user_t.status,  COALESCE((    SELECT COALESCE(json_agg(json_build_object(      'id', posts_0.id,      'title', posts_0.title,      'authorId', posts_0."authorId"    )), '[]'::json)    FROM "public"."Post" posts_0    WHERE posts_0."authorId" = user_t.id  ), '[]'::json) AS postsFROM "public"."User" user_tWHERE user_t.status = $1
params ["ACTIVE"]1 sentencia
Salida de createToSQL para un esquema de dos modelos, con saltos de línea añadidos.
Cobertura de Prisma
v6–v8
Matriz de benchmarks en PostgreSQL y SQLite
Cambios de consulta
0
Mantén tus llamadas Prisma existentes
Archivos de benchmark
6
Prisma v6/v7/v8 × PG/SQLite
Seguridad de tipos
100%
La misma API de Prisma

¿Por qué Prisma es lento?

Entender la evolución de Prisma y sus características de rendimiento ayuda a explicar por qué existe esta extensión.

El recorrido de Prisma: DX primero, el rendimiento importa a escala

💡 Por qué existe esta extensión

Prisma tomó las decisiones arquitectónicas correctas para sus objetivos: seguridad de tipos, experiencia de desarrollo y comportamiento consistente entre bases de datos. Pero esas decisiones crean una sobrecarga que se nota a escala. Esta extensión no reemplaza Prisma: optimiza lecturas para equipos que quieren el DX de Prisma más ejecución más rápida donde importa.

  1. 🎯 2019: El nacimiento de Prisma moderno

    Prisma 2 se lanzó en 2019, cambiando el panorama de ORMs en TypeScript con acceso a base de datos con seguridad de tipos y tipos generados desde tu esquema. Prisma introdujo una arquitectura basada en engine para traducir consultas, validarlas y ofrecer garantías fuertes que eran difíciles de lograr con ORMs tradicionales de JavaScript.

  2. ⚡ 2020–2022: Crecimiento rápido y expansión de funcionalidades

    Prisma añadió funciones potentes como escrituras anidadas, transacciones y middleware. El conjunto de funciones creció, pero cada consulta seguía pagando un coste arquitectónico: las consultas se representan, validan, ejecutan y los resultados se moldean para coincidir con la API de Prisma.

  3. 📊 2023: La sobrecarga se vuelve notable a escala

    A medida que más equipos desplegaron Prisma en cargas de trabajo de alto tráfico, la sobrecarga fija por consulta se volvió medible. Esto se ve especialmente en endpoints con muchas lecturas, analítica, agregaciones y conjuntos de resultados grandes. La sobrecarga no es un bug; es el coste de las garantías y el comportamiento de la API de Prisma.

  4. 🚀 2024–2025: Continúa el trabajo de rendimiento en Prisma

    Prisma publicó actualizaciones importantes centradas en rendimiento y cambios del engine. Incluso con mejoras, sigue existiendo un coste inevitable por parsear, validar, planificar y moldear resultados frente a ejecutar SQL crudo directamente.

  5. 🎯 2026: Se lanza la extensión prisma-sql

    Esta extensión se centra en el rendimiento de lectura. Evita la ruta de ejecución de lecturas de Prisma para findMany, findFirst, findUnique, count, aggregate y groupBy, mientras mantiene Prisma para escrituras, migraciones, gestión de esquema y generación de tipos. Valida la compatibilidad con tu versión de Prisma antes del despliegue.

Capa de traducción de consultas

Prisma traduce los inputs de tu consulta a SQL específico del motor. Esto permite comportamiento consistente entre bases de datos y la semántica de la API de Prisma, pero añade tiempo de procesamiento antes de que la base de datos vea el SQL.

Validación y garantías de tipos

Prisma valida consultas contra el esquema y aplica garantías a nivel de API. Estas salvaguardas previenen clases de bugs, pero también añaden sobrecarga a cada consulta.

Moldeado de resultados

Los resultados se moldean para coincidir con el comportamiento de la API de Prisma. Esto es excelente para DX y consistencia, pero añade latencia, especialmente en conjuntos de resultados grandes e includes complejos.

Esta extensión complementa Prisma ofreciendo una ruta más rápida para las consultas de lectura compatibles. Conservas Prisma para el esquema, las migraciones, las escrituras y los tipos generados, mientras el SQL generado atiende las lecturas frecuentes seleccionadas mediante clientes nativos de la base de datos.

¿Cuánto más rápido? Benchmarks reales

Comparación del JSON de benchmarks más reciente entre Prisma v6, v7, v8, Drizzle ORM y prisma-sql

PostgreSQL

95 casos de consulta por ejecución
  • Prisma v6 (6.19.3)1.56× frente a Drizzle
    1.99×

    Prisma v6 (6.19.3): aceleración promedio de 1.99× frente a Prisma

    95 casos de consulta medidos, promedio frente a Prisma30 sept 2026
  • Prisma v7 (7.10.0)1.51× frente a Drizzle
    1.47×

    Prisma v7 (7.10.0): aceleración promedio de 1.47× frente a Prisma

    95 casos de consulta medidos, promedio frente a Prisma30 sept 2026
  • Prisma v8 (8.1.0-dev.1)1.63× frente a Drizzle
    1.54×

    Prisma v8 (8.1.0-dev.1): aceleración promedio de 1.54× frente a Prisma

    95 casos de consulta medidos, promedio frente a Prisma30 sept 2026

SQLite

84 casos de consulta por ejecución
  • Prisma v6 (6.19.3)1.79× frente a Drizzle
    4.80×

    Prisma v6 (6.19.3): aceleración promedio de 4.80× frente a Prisma

    84 casos de consulta medidos, promedio frente a Prisma30 sept 2026
  • Prisma v7 (7.10.0)1.84× frente a Drizzle
    2.29×

    Prisma v7 (7.10.0): aceleración promedio de 2.29× frente a Prisma

    84 casos de consulta medidos, promedio frente a Prisma30 sept 2026
  • Prisma v8 (8.1.0-dev.1)1.63× frente a Drizzle
    2.10×

    Prisma v8 (8.1.0-dev.1): aceleración promedio de 2.10× frente a Prisma

    84 casos de consulta medidos, promedio frente a Prisma30 sept 2026

Generado en tiempo de compilación a partir de los archivos benchmark-results/*-latest.json más recientes. Las barras comparten una misma escala en ambas bases de datos; el ámbar marca la mejor ejecución por base de datos. Cada forma de consulta varía.Tabla por consultaVer datos completos del benchmark

Resultados detallados de benchmark

Comparación estadística con la prueba t de Welch y un umbral de significancia práctica de 1 ms

Estos resultados reflejan el modo en tiempo de ejecución, donde las consultas se convierten a SQL en cada solicitud. En el modo precompilado, el SQL se genera en tiempo de compilación — en ejecución solo se lanzan consultas parametrizadas en bruto, sin sobrecarga de conversión.

PostgreSQLPrisma v6 (6.19.3)

Promedio 1.99x frente a PrismaPromedio 1.56x frente a Drizzle35/95 victorias significativas60 dentro del umbral de ruido
30 sept 2026
PruebaPrismaprisma-sqlDrizzleAceleraciónSig.CV%n
findMany basic0.529ms±0.0640.231ms±0.2340.271ms~1.00x≈198.0%50
findMany where =0.501ms±0.00690.208ms±0.00940.347ms~1.00x≈15.6%50
findMany where >=16.51ms±0.2675.67ms±0.3387.43ms2.91x1.31x D***21.0%50
findMany where IN0.657ms±0.1420.292ms±0.0170.492ms~1.00x≈20.3%50
findMany where null0.280ms±0.0200.167ms±0.0120.177ms~1.00x≈25.7%50
findMany ILIKE0.297ms±0.00970.168ms±0.00890.278ms~1.00x≈18.6%50
findMany AND2.72ms±0.1611.11ms±0.1111.45ms2.45x1.31x D***31.5%50
findMany OR13.98ms±0.2864.69ms±0.2215.88ms2.98x1.25x D***17.0%50
findMany NOT0.639ms±0.0130.274ms±0.00910.478ms~1.00x≈12.2%50
findMany orderBy4.50ms±0.2191.48ms±0.0751.76ms3.03x1.18x D***18.5%50
findMany pagination0.342ms±0.0320.171ms±0.0260.295ms~1.00x≈43.2%50
findMany select0.294ms±0.00940.181ms±0.00720.176ms~1.00x≈14.0%50
findMany relation some1.69ms±0.0980.999ms±0.064—~1.00x≈22.1%50
findMany relation every2.17ms±0.0961.47ms±0.078—~1.00x≈18.9%50
findMany relation none26.02ms±0.51710.06ms±0.511—2.59x***18.0%50
findMany nested relation1.76ms±0.0761.24ms±0.060—~1.00x≈18.0%50
findMany complex2.94ms±0.1091.46ms±0.0681.73ms2.01x1.18x D***17.2%50
findFirst0.378ms±0.0320.175ms±0.0140.350ms~1.00x≈28.0%50
findFirst skip0.328ms±0.1070.147ms±0.00640.301ms~1.00x≈15.2%50
findUnique id0.232ms±0.00970.102ms±0.00550.207ms~1.00x≈18.6%50
findUnique email0.210ms±0.00720.090ms±0.00440.179ms~1.00x≈17.1%50
count0.109ms±0.00330.063ms±0.00300.064ms~1.00x≈16.2%50
count where0.469ms±0.0150.247ms±0.0160.287ms~1.00x≈22.2%50
aggregate count0.215ms±0.00780.155ms±0.0042—~1.00x≈9.2%50
aggregate sum/avg0.305ms±0.0140.261ms±0.0053—~1.00x≈7.1%50
aggregate where0.446ms±0.01000.239ms±0.0058—~1.00x≈8.7%50
aggregate min/max0.305ms±0.0150.268ms±0.010—~1.00x≈13.2%50
aggregate complete0.381ms±0.00610.292ms±0.0072—~1.00x≈8.8%50
groupBy0.419ms±0.0240.344ms±0.013—~1.00x≈12.8%50
groupBy count0.422ms±0.01000.358ms±0.0050—~1.00x≈4.8%50
groupBy multi0.544ms±0.0130.442ms±0.052—~1.00x≈38.9%50
groupBy having0.505ms±0.0110.375ms±0.0086—~1.00x≈8.2%50
groupBy + where0.550ms±0.0110.294ms±0.0064—~1.00x≈7.8%50
_count via include0.679ms±0.0130.511ms±0.013—~1.00x≈8.9%50
_count via include + relations1.55ms±0.0370.666ms±0.017—~1.00x≈9.3%50
groupBy aggregates0.557ms±0.00970.465ms±0.0091—~1.00x≈6.9%50
groupBy min/max0.531ms±0.00800.441ms±0.0053—~1.00x≈4.2%50
include list + nested to-one1.46ms±0.0290.337ms±0.032—4.32x***30.2%50
include list + nullable to-one2.59ms±0.0811.65ms±0.056—~1.00x≈11.9%50
include posts4.25ms±0.2162.35ms±0.1205.77ms1.81x2.45x D***18.9%50
include profile0.635ms±0.8710.540ms±0.2410.648ms~1.00x≈104.7%50
include 3 levels4.48ms±0.1484.03ms±0.1474.58ms~1.00x≈13.6%50
include 4 levels5.61ms±0.1823.39ms±0.1324.65ms1.65x1.37x D***13.9%50
include + where4.04ms±0.1762.88ms±0.3995.51ms~1.00x≈46.7%50
include + select nested2.52ms±0.1391.96ms±0.1854.42ms~1.00x≈31.8%50
findMany startsWith0.270ms±0.0280.140ms±0.0140.314ms~1.00x≈35.4%50
findMany endsWith0.563ms±0.0150.216ms±0.00690.369ms~1.00x≈11.1%50
findMany NOT contains0.627ms±0.0220.250ms±0.1040.447ms~1.00x≈121.8%50
findMany LIKE0.245ms±0.00940.111ms±0.00690.250ms~1.00x≈21.9%50
findMany <25.55ms±0.3987.55ms±0.29210.60ms3.39x1.40x D***13.4%50
findMany <=26.43ms±0.3717.78ms±0.22010.97ms3.40x1.41x D***10.2%50
findMany >15.55ms±0.5995.21ms±0.3566.78ms2.99x1.30x D***24.2%50
findMany NOT IN0.644ms±0.0130.282ms±0.0110.487ms~1.00x≈13.4%50
findMany isNot null0.642ms±0.0140.336ms±0.0170.362ms~1.00x≈18.6%50
orderBy multi-field4.99ms±0.1901.55ms±0.0761.88ms3.22x1.21x D***17.0%50
orderBy relation to-one4.10ms±0.1353.08ms±0.090—1.33x***10.2%50
orderBy relation + scalar5.02ms±0.2583.63ms±0.205—1.39x***20.0%50
orderBy nullable relation4.08ms±0.3002.94ms±0.181—1.39x***21.1%50
orderBy deep relation5.43ms±0.1864.04ms±0.174—1.34x***14.9%50
orderBy deep relation + scalar6.34ms±0.1354.62ms±0.100—1.37x***7.8%50
distinct status8.84ms±0.3761.56ms±0.181—5.66x***36.9%50
distinct multi12.04ms±0.1712.50ms±0.073—4.81x***10.3%50
cursor composite tuple1.61ms±0.0251.13ms±0.017—~1.00x≈5.3%50
cursor composite desc1.75ms±0.0371.31ms±0.021—~1.00x≈5.8%50
cursor prefix of orderBy2.70ms±0.1881.66ms±0.082—1.63x***18.1%50
select + include1.60ms±0.1010.309ms±0.0210.568ms5.16x1.84x D***24.6%50
_count relation1.74ms±0.3411.67ms±0.781—~1.00x≈123.8%50
_count multi-relation0.257ms±0.0290.218ms±0.045—~1.00x≈62.4%50
_count inside include2.32ms±0.1261.55ms±0.124—~1.00x≈32.0%50
_count inside nested select4.64ms±0.2023.69ms±0.266—~1.00x≈24.3%50
_count deep include5.49ms±0.2473.98ms±0.158—1.38x***14.1%50
ILIKE special chars0.425ms±0.0330.193ms±0.022—~1.00x≈36.5%50
LIKE case sensitive0.263ms±0.0100.110ms±0.0078—~1.00x≈24.0%50
findMany Date range0.424ms±0.0120.190ms±0.0120.321ms~1.00x≈21.1%50
count Date range1.14ms±0.0470.925ms±0.0520.995ms~1.00x≈19.8%50
findMany Date gte0.403ms±0.0250.178ms±0.00580.303ms~1.00x≈11.6%50
depth-1 low-fan0.566ms±0.0210.447ms±0.102—~1.00x≈73.7%50
depth-1 mid-fan4.21ms±0.1102.34ms±0.178—1.80x***26.3%50
depth-1 high-fan4.16ms±0.1222.25ms±0.130—1.85x***20.4%50
depth-1 wide3.11ms±0.1141.78ms±0.166—1.75x***31.3%50
depth-1 unbound39.65ms±3.789.43ms±0.884—4.21x***29.1%50
depth-24.78ms±0.1533.54ms±0.187—1.35x***18.6%50
depth-2 paginated Project→tasks3.16ms±0.1492.68ms±0.161—~1.00x≈20.6%50
depth-2 high-fan3.84ms±0.1852.86ms±0.229—~1.00x≈28.7%50
depth-2 wide4.90ms±0.1763.08ms±0.176—1.59x***20.6%50
depth-2 unbound65.60ms±1.5217.60ms±0.479—3.73x***4.4%10
depth-3 unbound15.32ms±0.2818.38ms±0.354—1.83x***15.8%50
depth-3 paginated2.44ms±0.1562.34ms±0.253—~1.00x≈32.7%50
depth-4 unbound9.96ms±0.2686.14ms±0.266—1.62x***15.7%50
depth-4 paginated3.42ms±0.1612.42ms±0.175—~1.00x≈23.6%50
findFirst depth-22.91ms±0.1142.30ms±0.173—~1.00x≈25.9%50
findUnique depth-2 Project→tasks→comment3.27ms±0.1132.16ms±0.173—1.52x***27.5%50
complex nested select4.51ms±0.4283.01ms±0.777—~1.00x≈65.7%50
ultra deep query15.94ms±0.5465.83ms±0.361—2.73x***22.0%50
transaction: (3 operations)3.00ms±0.2751.41ms±0.246—2.14x***53.2%50
*** p < 0.001** p < 0.01*  p < 0.05ns no significativo≈ dentro del umbral de ruido de 1 ms± IC del 95%CV% > 15% = alta varianza
Se midió el modo en tiempo de ejecución. El modo precompilado omite por completo la conversión de consulta a SQL en tiempo de ejecución — espera una latencia menor que la mostrada aquí, especialmente en consultas complejas, donde el coste de conversión es proporcionalmente mayor.

Metodología

  • –Reprodúcelo con: npm run bench (BENCHMARK_JSON_OUTPUT=1 escribe JSON). Los resultados se guardan en benchmark-results/summary-.json; v--latest.json alimenta esta página.
  • –Cada consulta se ejecuta contra la misma base de datos para todos los clientes: Prisma, prisma-sql, Drizzle. El tamaño de muestra de cada prueba aparece en la columna n.
  • –Se reporta para cada lado: media, mediana, stdDev, p95, p99, CV%. La significancia usa la prueba t de Welch con un umbral práctico de 1 ms; las barras de error son IC del 95%.
  • –Se mide el modo en tiempo de ejecución: el SQL se convierte en cada solicitud. Las consultas precompiladas (@optimize) omiten la conversión por completo y son más rápidas que lo mostrado.
  • –El hardware y las versiones varían entre ejecuciones - cada archivo JSON lleva su propio timestamp. Compara ejecuciones de la misma máquina.

Qué se ejecuta más rápido y qué se queda en Prisma

Cada funcionalidad de Prisma Client que comprobamos, en PostgreSQL y SQLite. Las escrituras se quedan en Prisma; las lecturas se compilan a SQL cuando la forma es compatible.

PostgreSQL
SQLite
Métodos de modeloOpciones de consultaFiltrosOrdenaciónAgregadosAPI del clienteTipos de resultado

25 de 73 funcionalidades comprobadas están totalmente aceleradas en PostgreSQL. 19 pueden devolver un resultado distinto al de Prisma; el mapa completo lista cada una con el motivo.

Número de funcionalidades por estado
EstadoPostgreSQLSQLite
Acelerado2521
Parcial66
Recurre a Prisma97
Se ejecuta en Prisma77
Puede diferir1917
No disponible24
Solo prisma-sql52
No está en Prisma06
Sin comprobar03
Abrir el mapa de paridad completo
Validado¿Cómo aseguramos la corrección?Las consultas compatibles se validan contra Prisma en PostgreSQL y SQLite, con informes de benchmark que cubren Prisma v6, v7, v8, Drizzle y SQL generado.Ver metodología de pruebas

Cómo optimiza Prisma

Evita la ruta de ejecución de lecturas de Prisma manteniendo la API y los tipos de Prisma

  1. Interceptar consultas de Prisma

    La extensión captura operaciones de lectura (findMany, findFirst, findUnique, count, aggregate, groupBy) antes de que se ejecuten

    generated/sql, extracto
    query: {
      $allModels: {
        async $allOperations({ model, operation, args, query }) {
          if (!ACCELERATED_METHODS.has(operation)) {
            return query(args)
          }
          return executeAccelerated(model, operation, args, query)
        },
      },
    }
  2. Generar SQL optimizado

    Convierte consultas Prisma en SQL rápido y parametrizado con JOINs optimizados

    SQL para PostgreSQL
    SELECT user_t.id, user_t.email, user_t.status,
      COALESCE((
        SELECT COALESCE(json_agg(json_build_object(
          'id', posts_0.id,
          'title', posts_0.title,
          'authorId', posts_0."authorId"
        )), '[]'::json)
        FROM "public"."Post" posts_0
        WHERE posts_0."authorId" = user_t.id
      ), '[]'::json) AS posts
    FROM "public"."User" user_t
    WHERE user_t.status = $1
    
    -- params ["ACTIVE"]
  3. Ejecutar directamente

    Ejecuta consultas mediante postgres.js o better-sqlite3, evitando la sobrecarga de lectura de Prisma

    generated/sql, extracto
    if (DIALECT === 'postgres') {
      await client.unsafe(sql, normalizedParams).forEach((row) => {
        results.push(row)
      })
      return results
    }
    
    const stmt = getOrPrepareStatement(client, sql)
    return stmt.all(...normalizedParams)
  4. Devolver resultados compatibles

    Los resultados coinciden con la forma esperada por Prisma. Tipos, IntelliSense y el código de consultas existente permanecen sin cambios

    users.ts
    const users = await prisma.user.findMany({
      where: { status: 'ACTIVE' },
      include: { posts: true },
    })
    
    users[0].email
    users[0].posts[0].title
    
    // Los mismos tipos inferidos que Prisma Client.
    // Los valores Decimal, BigInt y DateTime pueden
    // diferir; el mapa de paridad lista cada caso.
Seguridad verificada¿Cómo prevenimos inyección SQL?Validación multicapa con enlace de parámetros, comprobaciones de campos basadas en esquema y la suite actual de pruebas de seguridadVer detalles de seguridad

¿Por qué elegir esta extensión de Prisma?

Obtén velocidad de ejecución de SQL crudo para lecturas manteniendo la experiencia de desarrollo de Prisma

Aceleración instantánea de Prisma
Una configuración única acelera lecturas de Prisma. Sin refactor, sin migración, sin downtime.
Mantén tus tipos de Prisma
Compatibilidad completa con TypeScript. Inferencia de tipos, autocompletado y seguridad en compilación preservados mientras se aceleran lecturas.
Solución probada en producción
Las pruebas de paridad actuales validan las lecturas compatibles en versiones recientes de Prisma. Úsala en apps de producción tras comprobar la compatibilidad con tu versión de Prisma y tu carga de trabajo.
Soporte para múltiples bases de datos
Optimiza lecturas de Prisma en PostgreSQL (incluido Neon, Supabase) y SQLite.
Opción precompilada
Un generador opcional crea el SQL en tiempo de compilación, reduciendo la sobrecarga a microsegundos para tus consultas más frecuentes.
Listo para serverless (runtimes Node)
Funciona en runtimes serverless de Node. El soporte para Edge runtime depende de las restricciones del runtime y del driver que uses.

Más allá de lecturas más rápidas

prisma-sql añade capacidades que Prisma Client no tiene. Los mismos tipos, el mismo estilo de código.

$batch

N consultas de panel, un solo viaje de ida y vuelta

Combina lecturas independientes en un único viaje de ida y vuelta a PostgreSQL. Resultado como objeto tipado, sin malabares con Promise.all.

const dash = await prisma.$batch((b) => ({
  users: b.user.count(),
  posts: b.post.findMany({ take: 10 }),
  stats: b.task.aggregate({ _count: true }),
}))

@optimize

Precompila tus consultas más frecuentes

Anota un modelo en schema.prisma. En tiempo de generación se fija el SQL exacto; las formas que coinciden en tiempo de ejecución omiten la conversión por completo.

/// @optimize {
///   "method": "findMany",
///   "query": {
///     "where": { "status": "$status" },
///     "take": "$take"
///   }
/// }
model User { ... }

Planificador de cardinalidad

Estrategia elegida por los datos, no por intuición

Las estadísticas de relaciones recopiladas deciden el cambio de estrategia entre joins planos, subconsultas correlacionadas y carga segmentada con where-in. Las tablas hijas grandes nunca provocan escaneos por cada padre.

prisma-sql-collect-stats \
  --output dist/planner.generated.js \
  --prisma-client dist/client/index.js

Cuándo el rendimiento de Prisma importa más

Escenarios comunes donde esta extensión marca una diferencia real

Analítica e informes

Las agregaciones y operaciones groupBy de Prisma se benefician significativamente de la ejecución SQL directa

  • groupBy 5× más rápido acelera informes
  • Consultas aggregate más rápidas
  • Métricas en tiempo real con menor latencia

APIs de alto tráfico

La sobrecarga por consulta se acumula bajo carga, especialmente en endpoints con muchas lecturas

  • Menores tiempos de respuesta de la API
  • Manejar más solicitudes por instancia
  • Reducir costes de infraestructura

Funciones serverless

Cada milisegundo cuenta en serverless: reduce latencia de lectura donde importa

  • Mejor p95/p99 en lecturas
  • Menor coste mediante lecturas más rápidas
  • Lecturas más rápidas sin refactors

Backends móviles

Los usuarios notan la latencia: lecturas más rápidas mejoran el UX percibido de inmediato

  • Carga de feed más rápida
  • Paginación más rápida
  • Interacciones más responsivas

Optimiza Prisma en 3 pasos

Acelera lecturas de Prisma en menos de 60 segundos

  1. Instala la extensión de Prisma

    Terminal
    # PostgreSQL
    npm install prisma-sql postgres
    
    # SQLite
    npm install prisma-sql better-sqlite3
  2. Añade la extensión a Prisma Client

    schema.prisma
    generator client {
      provider = "prisma-client"
    }
    
    generator sql {
      provider = "prisma-sql-generator"
    }
    Terminal
    npx prisma generate
    db.ts
    import { PrismaClient } from '@prisma/client'
    import { speedExtension, type SpeedClient } from './generated/sql'
    import postgres from 'postgres'
    
    const sql = postgres(process.env.DATABASE_URL!)
    const basePrisma = new PrismaClient()
    
    export const prisma = basePrisma.$extends(
      speedExtension({ postgres: sql }),
    ) as SpeedClient<typeof basePrisma>
  3. Usa Prisma normalmente

    users.ts
    const users = await prisma.user.findMany({
      where: { status: 'ACTIVE' },
      include: { posts: true },
    })

SQLite: pasa speedExtension({ sqlite: db }) con una base de datos de better-sqlite3.Guía de configuración completa

FAQ de rendimiento de Prisma

Preguntas comunes sobre cómo optimizar lecturas en Prisma

¿Por qué Prisma tiene sobrecarga?

Prisma añade sobrecarga porque implementa garantías de API como validación basada en el esquema, comportamiento de consulta consistente y moldeado de resultados. Esas capas ofrecen una gran experiencia de desarrollo, pero cuestan tiempo comparado con ejecutar SQL crudo directamente.

¿Cómo optimizo consultas de Prisma?

Optimiza cargas de trabajo de Prisma centradas en lecturas añadiendo esta extensión. Ejecuta operaciones de lectura mediante SQL directo con postgres.js o better-sqlite3, manteniendo la API y los tipos de Prisma. La configuración es un pequeño cambio de inicialización y no requiere refactor de tus consultas existentes.

¿Prisma es más lento que SQL crudo?

Para muchas cargas de lectura, sí. Hay una sobrecarga arquitectónica frente a ejecutar SQL crudo. Esta extensión busca mantener el DX de Prisma reduciendo la latencia de lectura mediante ejecución SQL directa.

¿Puedo acelerar Prisma sin cambiar consultas existentes?

Sí. Añade la extensión una vez durante la inicialización del Prisma Client y mantén tu código de consultas Prisma sin cambios. Las operaciones de lectura se ejecutan más rápido mientras tu API, tipos y esquema de Prisma permanecen igual.

¿Esto funciona en producción?

Sí, está diseñado para usarse en producción en las rutas de lectura compatibles. Verifica siempre la compatibilidad con tu versión de Prisma y ejecuta tus propias pruebas de regresión antes del despliegue.

¿Qué causa agregaciones más lentas en Prisma?

Las agregaciones y groupBy a menudo amplifican la sobrecarga fija (procesamiento de consulta y moldeado de resultados) y pueden involucrar conjuntos de resultados intermedios más grandes. Esta extensión optimiza esas lecturas generando SQL directamente, lo que típicamente reduce la latencia en endpoints con muchas agregaciones.

¿Listo para acelerar Prisma?

Consulta la tabla de benchmarks actual para lecturas compatibles en PostgreSQL y SQLite