Corrija Consultas Prisma Lentas Com Execução Direta de SQL

Gosta do DX do Prisma, mas precisa de menos overhead de leitura nos formatos de consulta suportados? O JSON de benchmark atual mostra acelerações médias no Prisma v6, v7 e v8 para leituras suportadas em PostgreSQL e SQLite; formatos de consulta individuais variam.

Acelerar Prisma Agora

  • Leituras Suportadas Mais Rápidas
  • Sem Mudanças nas Consultas
  • JSON de Benchmark Atual
  • PostgreSQL e SQLite
Sua chamada Prismauser.findMany
const users = await prisma.user.findMany({
  where: { status: 'ACTIVE' },
  include: { posts: true },
})
SQL que o prisma-sql executa
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 instrução
Saída de createToSQL para um schema com dois models, com quebras de linha adicionadas.
Cobertura do Prisma
v6–v8
Matriz de benchmark PostgreSQL e SQLite
Mudanças nas Consultas
0
Mantenha suas chamadas Prisma atuais
Arquivos de Benchmark
6
Prisma v6/v7/v8 × PG/SQLite
Segurança de Tipos
100%
Mesma API do Prisma

Por que o Prisma é lento?

Entender a evolução do Prisma e suas características de performance ajuda a explicar por que esta extensão existe.

A Jornada do Prisma: DX Primeiro, Performance Importa em Escala

💡 Por que Esta Extensão Existe

O Prisma fez escolhas arquiteturais corretas para seus objetivos: segurança de tipos, experiência do desenvolvedor e comportamento consistente entre bancos. Mas essas escolhas criam overhead que fica perceptível em escala. Esta extensão não substitui o Prisma — ela otimiza leituras para equipes que querem o DX do Prisma com execução mais rápida onde importa.

  1. 🎯 2019: O Nascimento do Prisma Moderno

    O Prisma 2 foi lançado em 2019, mudando o cenário de ORMs em TypeScript com acesso ao banco com segurança de tipos e tipos gerados a partir do seu schema. O Prisma introduziu uma arquitetura baseada em engine para traduzir consultas, validá-las e fornecer garantias fortes que eram difíceis de alcançar com ORMs JavaScript tradicionais.

  2. ⚡ 2020–2022: Crescimento Rápido e Expansão de Recursos

    O Prisma adicionou recursos poderosos como nested writes, transações e middleware. O conjunto de recursos cresceu, mas cada consulta ainda pagava um custo arquitetural: consultas são representadas, validadas, executadas e os resultados são moldados para corresponder à API do Prisma.

  3. 📊 2023: Overhead Fica Notável em Escala

    À medida que mais equipes implantaram o Prisma em workloads de alto tráfego, o overhead fixo por consulta tornou-se mensurável. Isso aparece principalmente em endpoints com muitas leituras, analytics, agregações e grandes conjuntos de resultados. O overhead não é um bug; é o custo das garantias e do comportamento da API do Prisma.

  4. 🚀 2024–2025: O Trabalho de Performance do Prisma Continua

    O Prisma entregou grandes atualizações focadas em performance e mudanças na engine. Mesmo com melhorias, ainda existe um custo inevitável de parsing, validação, planejamento e formatação de resultados em comparação com executar SQL bruto diretamente.

  5. 🎯 2026: Extensão prisma-sql Lançada

    Esta extensão foca em performance de leitura. Ela contorna o caminho de execução de leitura do Prisma para findMany, findFirst, findUnique, count, aggregate e groupBy, mantendo o Prisma para escritas, migrations, gerenciamento de schema e geração de tipos. Valide a compatibilidade com sua versão do Prisma antes da implantação.

Camada de Tradução de Consultas

O Prisma traduz os inputs da sua consulta para SQL específico do banco. Isso habilita comportamento cross-database e a semântica da API do Prisma, mas adiciona tempo de processamento antes de o banco ver o SQL.

Validação e Garantias de Tipo

O Prisma valida consultas contra o schema e impõe garantias no nível da API. Esses mecanismos evitam classes de bugs, mas também adicionam overhead a cada consulta.

Formatação de Resultados

Os resultados são moldados para corresponder ao comportamento da API do Prisma. Isso é ótimo para DX e consistência, mas adiciona latência, especialmente em grandes conjuntos de resultados e includes complexos.

Esta extensão complementa o Prisma oferecendo um caminho mais rápido para consultas de leitura suportadas. Você mantém o Prisma para schema, migrations, escritas e tipos gerados, enquanto o SQL gerado cuida de leituras críticas selecionadas por meio de clientes nativos do banco.

Quanto mais rápido? Benchmarks reais

Comparação do JSON de benchmark mais recente entre Prisma v6, v7, v8, Drizzle ORM e prisma-sql

PostgreSQL

95 casos de consulta por execução
  • Prisma v6 (6.19.3)1.56× vs Drizzle
    1.99×

    Prisma v6 (6.19.3): aceleração média de 1.99× em relação ao Prisma

    95 casos de consulta medidos, média vs Prisma30 de set. de 2026
  • Prisma v7 (7.10.0)1.51× vs Drizzle
    1.47×

    Prisma v7 (7.10.0): aceleração média de 1.47× em relação ao Prisma

    95 casos de consulta medidos, média vs Prisma30 de set. de 2026
  • Prisma v8 (8.1.0-dev.1)1.63× vs Drizzle
    1.54×

    Prisma v8 (8.1.0-dev.1): aceleração média de 1.54× em relação ao Prisma

    95 casos de consulta medidos, média vs Prisma30 de set. de 2026

SQLite

84 casos de consulta por execução
  • Prisma v6 (6.19.3)1.79× vs Drizzle
    4.80×

    Prisma v6 (6.19.3): aceleração média de 4.80× em relação ao Prisma

    84 casos de consulta medidos, média vs Prisma30 de set. de 2026
  • Prisma v7 (7.10.0)1.84× vs Drizzle
    2.29×

    Prisma v7 (7.10.0): aceleração média de 2.29× em relação ao Prisma

    84 casos de consulta medidos, média vs Prisma30 de set. de 2026
  • Prisma v8 (8.1.0-dev.1)1.63× vs Drizzle
    2.10×

    Prisma v8 (8.1.0-dev.1): aceleração média de 2.10× em relação ao Prisma

    84 casos de consulta medidos, média vs Prisma30 de set. de 2026

Gerado em tempo de build a partir dos arquivos benchmark-results/*-latest.json mais recentes. As barras compartilham uma única escala entre os dois bancos; âmbar marca a melhor execução por banco. Formatos de consulta individuais variam.Tabela por consultaVer dados completos do benchmark

Resultados detalhados de benchmark

Comparação estatística com o teste t de Welch e um limite de significância prática de 1 ms

Estes resultados refletem o modo runtime, em que as consultas são convertidas para SQL a cada requisição. No modo pré-renderizado, o SQL é gerado em tempo de build — em runtime são executadas consultas parametrizadas brutas, sem overhead de conversão.

PostgreSQLPrisma v6 (6.19.3)

Média 1.99x vs PrismaMédia 1.56x vs Drizzle35/95 vitórias significativas60 dentro do limite de ruído
30 de set. de 2026
TestePrismaprisma-sqlDrizzleAceleraçãoSig.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 não significativo≈ dentro do limite de ruído de 1 ms± IC de 95%CV% > 15% = alta variância
Benchmark feito no modo runtime. O modo pré-renderizado elimina totalmente a conversão de consulta para SQL em runtime — espere latência menor do que a mostrada aqui, especialmente em consultas complexas, nas quais o custo de conversão é proporcionalmente maior.

Metodologia

  • –Reproduza com: npm run bench (BENCHMARK_JSON_OUTPUT=1 grava JSON). Os resultados ficam em benchmark-results/summary-.json; v--latest.json alimenta esta página.
  • –Cada consulta roda no mesmo banco de dados para todos os clientes: Prisma, prisma-sql, Drizzle. O tamanho da amostra por teste aparece na coluna n.
  • –Reportado para cada lado: mean, median, stdDev, p95, p99, CV%. A significância usa o teste t de Welch com limite prático de 1ms; as barras de erro são IC de 95%.
  • –Medido no modo runtime: o SQL é convertido a cada requisição. Consultas pré-renderizadas (@optimize) pulam totalmente a conversão e são mais rápidas do que o mostrado.
  • –Hardware e versões variam entre execuções - cada arquivo JSON traz seu próprio timestamp. Compare execuções da mesma máquina.

O que roda mais rápido e o que fica no Prisma

Cada recurso do Prisma Client que verificamos, em PostgreSQL e SQLite. Escritas ficam no Prisma; leituras são compiladas para SQL quando o formato é suportado.

PostgreSQL
SQLite
Métodos de modelOpções de consultaFiltrosOrdenaçãoAgregaçõesAPI do clienteTipos de resultado

25 de 73 recursos verificados são totalmente acelerados no PostgreSQL. 19 podem retornar um resultado diferente do Prisma; o mapa completo lista cada um com o motivo.

Quantidade de recursos por status
StatusPostgreSQLSQLite
Acelerado2521
Parcial66
Recorre ao Prisma97
Roda no Prisma77
Pode divergir1917
Indisponível24
Só no prisma-sql52
Não suportado pelo Prisma06
Não verificado03
Abrir o mapa de paridade completo
ValidadoComo garantimos a correção?As consultas suportadas são validadas contra o Prisma em PostgreSQL e SQLite, com relatórios de benchmark cobrindo Prisma v6, v7, v8, Drizzle e SQL gerado.Ver Metodologia de Testes

Como Ela Otimiza o Prisma

Contorne o caminho de execução de leitura do Prisma mantendo a API e os tipos do Prisma

  1. Interceptar Consultas do Prisma

    A extensão captura operações de leitura (findMany, findFirst, findUnique, count, aggregate, groupBy) antes de serem executadas

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

    Converter consultas Prisma em SQL rápido e parametrizado com JOINs otimizados

    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. Executar Diretamente

    Rodar consultas via postgres.js ou better-sqlite3, contornando o overhead de leitura do Prisma

    generated/sql, trecho
    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. Retornar Resultados Compatíveis

    Os resultados correspondem ao formato esperado pelo Prisma. Tipos, IntelliSense e o código de consulta existente permanecem inalterados

    users.ts
    const users = await prisma.user.findMany({
      where: { status: 'ACTIVE' },
      include: { posts: true },
    })
    
    users[0].email
    users[0].posts[0].title
    
    // Mesmos tipos inferidos do Prisma Client.
    // Valores Decimal, BigInt e DateTime podem
    // diferir; o mapa de paridade lista cada caso.
Segurança VerificadaComo evitamos SQL injection?Validação em múltiplas camadas com vinculação de parâmetros, checagem de campos baseada em schema e a suíte atual de testes de segurançaVer Detalhes de Segurança

Por que Escolher Esta Extensão para Prisma?

Obtenha velocidade de execução de SQL bruto para leituras mantendo a experiência do desenvolvedor do Prisma

Aceleração Instantânea do Prisma
Configuração única acelera leituras do Prisma. Sem refatoração, sem migração, sem downtime.
Mantenha Seus Tipos do Prisma
Suporte completo a TypeScript mantido. Inferência de tipos, autocomplete e segurança em tempo de compilação preservados enquanto as leituras aceleram.
Solução Testada em Produção
Os testes de paridade atuais validam leituras suportadas em versões recentes do Prisma. Use em apps de produção após verificar a compatibilidade com sua versão do Prisma e sua carga de trabalho.
Suporte a Múltiplos Bancos
Otimize leituras do Prisma em PostgreSQL (incluindo Neon, Supabase) e SQLite.
Opção Pré-Compilada
Gerador opcional cria SQL em tempo de build, reduzindo o overhead a microssegundos para suas consultas mais críticas.
Pronto para Serverless (Runtimes Node)
Funciona em runtimes serverless Node. Suporte ao Edge runtime depende de restrições do runtime e do driver usado.

Além de leituras mais rápidas

prisma-sql adiciona recursos que o Prisma Client não tem. Mesmos tipos, mesmo estilo de código.

$batch

N consultas de dashboard, um round trip

Combine leituras independentes em um único round trip no PostgreSQL. Resultado em objeto tipado, sem malabarismo com 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

Pré-gere o SQL das suas consultas mais críticas

Anote um model no schema.prisma. No generate, o SQL exato é pré-gerado; formatos correspondentes em runtime pulam completamente a conversão.

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

Planejador de cardinalidade

Estratégia escolhida pelos dados, não por palpite

Estatísticas de relações coletadas orientam a troca de estratégia entre joins planos, subconsultas correlacionadas e carregamento segmentado com where-in. Tabelas filhas grandes nunca disparam varreduras por pai.

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

Quando a Performance do Prisma Importa Mais

Cenários comuns em que esta extensão faz diferença de verdade

Analytics e Relatórios

Agregações e operações groupBy do Prisma se beneficiam significativamente da execução direta de SQL

  • groupBy 5× mais rápido acelera relatórios
  • Consultas aggregate mais rápidas
  • Métricas em tempo real com menor latência

APIs de Alto Tráfego

O overhead por consulta se acumula sob carga, especialmente em endpoints com muitas leituras

  • Menores tempos de resposta da API
  • Mais requisições por instância
  • Redução de custos de infraestrutura

Funções Serverless

Cada milissegundo importa em serverless: reduza latência de leitura onde conta

  • Melhor p95/p99 em leituras
  • Menores custos com leituras mais rápidas
  • Leituras mais rápidas sem refatorar

Backends Mobile

Usuários percebem latência: leituras mais rápidas melhoram o UX percebido imediatamente

  • Carregamento de feed mais rápido
  • Paginação mais rápida
  • Interações mais responsivas

Otimize o Prisma em 3 Passos

Acelere leituras do Prisma em menos de 60 segundos

  1. Instalar a Extensão do Prisma

    Terminal
    # PostgreSQL
    npm install prisma-sql postgres
    
    # SQLite
    npm install prisma-sql better-sqlite3
  2. Adicionar a Extensão ao 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. Usar o Prisma Normalmente

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

SQLite: passe speedExtension({ sqlite: db }) com um banco better-sqlite3.Guia completo de configuração

FAQ de Performance do Prisma

Perguntas comuns sobre otimizar leituras do Prisma

Por que o Prisma tem overhead?

O Prisma adiciona overhead porque implementa garantias de API como validação baseada em schema, comportamento consistente de consulta e formatação de resultados. Essas camadas dão uma ótima experiência de desenvolvedor, mas custam tempo em comparação com executar SQL bruto diretamente.

Como otimizo consultas do Prisma?

Otimize workloads Prisma com muitas leituras adicionando esta extensão. Ela executa leituras via SQL direto usando postgres.js ou better-sqlite3 mantendo a API e os tipos do Prisma. O setup é uma pequena mudança de inicialização e não exige refatoração das consultas existentes.

O Prisma é mais lento que SQL bruto?

Para muitos workloads de leitura, sim. Existe overhead arquitetural em comparação com execução de SQL bruto. Esta extensão busca manter o DX do Prisma reduzindo latência de leitura ao executar SQL diretamente.

Posso acelerar o Prisma sem mudar consultas existentes?

Sim. Adicione a extensão uma vez durante a inicialização do Prisma Client e mantenha seu código de consulta Prisma inalterado. As leituras ficam mais rápidas enquanto API, tipos e schema permanecem iguais.

Isso funciona em produção?

Sim, foi projetado para uso em produção nos caminhos de leitura suportados. Sempre verifique a compatibilidade com sua versão do Prisma e rode seus próprios testes de regressão antes da implantação.

O que causa agregações mais lentas no Prisma?

Agregações e groupBy frequentemente amplificam overhead fixo (processamento de consulta e formatação de resultados) e podem envolver conjuntos intermediários maiores. Esta extensão otimiza essas leituras gerando SQL diretamente, o que geralmente reduz latência em endpoints com muitas agregações.

Pronto para Acelerar o Prisma?

Confira a tabela de benchmark atual para leituras suportadas em PostgreSQL e SQLite