Слой трансляции запросов
Prisma переводит входные данные запроса в SQL для конкретной БД. Это даёт универсальное поведение и семантику Prisma, но добавляет время до выполнения SQL в базе.
Prisma работает медленно? Любите DX Prisma, но нужна лучшая производительность?
Ускорение медленных запросов Prisma в 2–7× (до 53.5× на relation filters в SQLite) без изменения существующих запросов.
import { PrismaClient, Prisma } from '@prisma/client'
import { speedExtension, convertDMMFToModels } from 'prisma-sql'
import postgres from 'postgres'
const sql = postgres(process.env.DATABASE_URL)
const models = convertDMMFToModels(Prisma.dmmf.datamodel)
const prisma = new PrismaClient().$extends(
speedExtension({ postgres: sql, models })
)
const users = await prisma.user.findMany({
where: { status: 'ACTIVE' },
include: { posts: true }
}) Понимание эволюции и характеристик производительности Prisma помогает объяснить, почему существует это расширение.
Prisma 2 была запущена в 2019 году и изменила ландшафт ORM для TypeScript: типобезопасный доступ к БД и генерация типов из схемы. Архитектура с движком позволила переводить запросы, валидировать их и обеспечивать гарантии API, которые сложно реализовать в чистом JavaScript.
Prisma добавила вложенные записи, транзакции и middleware. Функций стало больше, но каждый запрос всё равно платит цену за удобство использования: представление запроса, валидация, выполнение и формирование результата под API Prisma.
В высоконагруженных системах фиксированные накладные расходы на запрос стали измеримыми. Обычно это сильнее видно на чтениях, аналитике, агрегациях и больших выборках. Это не баг, а стоимость гарантий и поведения Prisma.
Prisma выпускала крупные обновления с фокусом на производительность и изменения движка. Даже при улучшениях остаётся неизбежная цена за обработку запроса и формирование результата по сравнению с прямым выполнением SQL.
Расширение нацелено на производительность. Обходит путь выполнения чтений Prisma для findMany, findFirst, findUnique, count, aggregate и groupBy, оставляя Prisma для записей, миграций, управления схемой и генерации типов. Перед деплоем проверьте совместимость с вашей версией Prisma.
Prisma сделала правильный архитектурный выбор: типобезопасность, удобство разработчика и согласованное поведение. Но эти решения добавляют логику, заметную на масштабе. Это расширение не заменяет Prisma — оно ускоряет чтения, сохраняя DX.
Prisma переводит входные данные запроса в SQL для конкретной БД. Это даёт универсальное поведение и семантику Prisma, но добавляет время до выполнения SQL в базе.
Prisma валидирует запросы по схеме и обеспечивает гарантии API. Это предотвращает классы ошибок, но добавляет накладные расходы на каждый запрос.
Результаты приводятся к поведению API Prisma. Это удобно и консистентно, но добавляет задержку, особенно при больших выборках и сложных include.
Это расширение дополняет Prisma, предлагая более быстрый путь для чтений. В типичных случаях вы получаете 2–7× ускорение (и до 53.5× на relation filters в SQLite), сохраняя поведение Prisma.
Комплексное сравнение Prisma v6, v7, Drizzle ORM и Prisma-SQL
Среда бенчмарков: MacBook Pro M1 • PostgreSQL 15 • SQLite 3.43 • 137 тест-кейсов на каждую базу данных
Среднее по 57 тест-кейсам
Среднее по 56 тест-кейсам
Бенчмарки основаны на 137 E2E тестах на каждую базу данных. Prisma v6.16.3, Prisma v7.2.0, Drizzle ORM latest. Посмотреть полные данные бенчмарка →
Статистическое сравнение с использованием t-критерия Уэлча и порога практической значимости 1 мс
Эти результаты отражают режим выполнения, в котором запросы преобразуются в SQL при каждом обращении. В предварительно сгенерированном режиме SQL создаётся на этапе сборки — во время выполнения исполняются «сырые» параметризованные запросы без накладных расходов на преобразование.
| Тест | Prisma | prisma-sql | Drizzle | Ускорение | Знач. | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.506ms ±0.014 | 0.263ms ±0.045 | 0.328ms | ~1.00x | ≈ | 61.8% | 50 |
| findMany where = | 0.537ms ±0.031 | 0.520ms ±0.186 | 0.406ms | ~1.00x | ≈ | 128.9% | 50 |
| findMany where >= | 16.63ms ±0.392 | 5.04ms ±0.245 | 6.80ms | 3.30x 1.35x D | *** | 17.5% | 50 |
| findMany where IN | 0.643ms ±0.044 | 0.349ms ±0.024 | 0.423ms | ~1.00x | ≈ | 24.3% | 50 |
| findMany where null | 0.268ms ±0.0078 | 0.172ms ±0.0100 | 0.170ms | ~1.00x | ≈ | 20.8% | 50 |
| findMany ILIKE | 0.265ms ±0.0100 | 0.255ms ±0.0091 | 0.261ms | ~1.00x | ≈ | 13.0% | 50 |
| findMany AND | 2.77ms ±0.136 | 0.906ms ±0.078 | 1.60ms | 3.06x 1.76x D | *** | 31.2% | 50 |
| findMany OR | 14.41ms ±0.382 | 4.26ms ±0.294 | 5.31ms | 3.38x 1.25x D | *** | 24.9% | 50 |
| findMany NOT | 0.594ms ±0.015 | 0.383ms ±0.045 | 0.404ms | ~1.00x | ≈ | 42.3% | 50 |
| findMany orderBy | 1.71ms ±0.026 | 0.650ms ±0.068 | 0.567ms | 2.63x 0.87x D | *** | 37.6% | 50 |
| findMany pagination | 0.225ms ±0.029 | 0.148ms ±0.020 | 0.153ms | ~1.00x | ≈ | 48.1% | 50 |
| findMany select | 0.236ms ±0.0061 | 0.149ms ±0.026 | 0.104ms | ~1.00x | ≈ | 61.8% | 50 |
| findMany relation some | 0.880ms ±0.014 | 0.477ms ±0.039 | — | ~1.00x | ≈ | 29.2% | 50 |
| findMany relation every | 0.689ms ±0.016 | 0.463ms ±0.022 | — | ~1.00x | ≈ | 17.4% | 50 |
| findMany relation none | 30.27ms ±1.35 | 7.71ms ±0.265 | — | 3.93x | *** | 12.4% | 50 |
| findMany nested relation | 0.732ms ±0.022 | 0.779ms ±0.085 | — | ~1.00x | ≈ | 39.5% | 50 |
| findMany complex | 1.08ms ±0.018 | 0.448ms ±0.012 | 0.563ms | ~1.00x | ≈ | 9.4% | 50 |
| findFirst | 0.220ms ±0.018 | 0.196ms ±0.019 | 0.170ms | ~1.00x | ≈ | 34.8% | 50 |
| findFirst skip | 0.316ms ±0.033 | 0.188ms ±0.042 | 0.170ms | ~1.00x | ≈ | 80.6% | 50 |
| findUnique id | 0.181ms ±0.011 | 0.119ms ±0.0055 | 0.149ms | ~1.00x | ≈ | 17.0% | 50 |
| findUnique email | 0.185ms ±0.0089 | 0.114ms ±0.0053 | 0.137ms | ~1.00x | ≈ | 16.7% | 50 |
| count | 0.132ms ±0.017 | 0.062ms ±0.0022 | 0.083ms | ~1.00x | ≈ | 12.9% | 50 |
| count where | 0.468ms ±0.0089 | 0.282ms ±0.0047 | 0.285ms | ~1.00x | ≈ | 6.1% | 50 |
| aggregate count | 0.246ms ±0.0083 | 0.160ms ±0.0042 | — | ~1.00x | ≈ | 9.5% | 50 |
| aggregate sum/avg | 0.341ms ±0.014 | 0.343ms ±0.033 | — | ~1.00x | ≈ | 34.6% | 50 |
| aggregate where | 0.472ms ±0.020 | 0.289ms ±0.0069 | — | ~1.00x | ≈ | 8.7% | 50 |
| aggregate min/max | 0.321ms ±0.0086 | 0.276ms ±0.0055 | — | ~1.00x | ≈ | 7.1% | 50 |
| aggregate complete | 0.419ms ±0.011 | 0.341ms ±0.015 | — | ~1.00x | ≈ | 15.6% | 50 |
| groupBy | 0.410ms ±0.0094 | 0.368ms ±0.0083 | — | ~1.00x | ≈ | 8.1% | 50 |
| groupBy count | 0.457ms ±0.011 | 0.413ms ±0.048 | — | ~1.00x | ≈ | 41.7% | 50 |
| groupBy multi | 0.576ms ±0.017 | 0.458ms ±0.011 | — | ~1.00x | ≈ | 8.7% | 50 |
| groupBy having | 0.502ms ±0.014 | 0.470ms ±0.023 | — | ~1.00x | ≈ | 17.4% | 50 |
| groupBy + where | 0.513ms ±0.0097 | 0.345ms ±0.040 | — | ~1.00x | ≈ | 41.6% | 50 |
| _count via include | 0.668ms ±0.019 | 0.636ms ±0.015 | — | ~1.00x | ≈ | 8.6% | 50 |
| _count via include + relations | 1.58ms ±0.040 | 1.36ms ±0.059 | — | ~1.00x | ≈ | 15.7% | 50 |
| groupBy aggregates | 0.519ms ±0.021 | 0.435ms ±0.014 | — | ~1.00x | ≈ | 11.7% | 50 |
| groupBy min/max | 0.495ms ±0.010 | 0.428ms ±0.013 | — | ~1.00x | ≈ | 10.8% | 50 |
| include list + nested to-one | 1.45ms ±0.047 | 0.542ms ±0.112 | — | ~1.00x | ≈ | 74.4% | 50 |
| include list + nullable to-one | 2.49ms ±0.044 | 1.47ms ±0.098 | — | 1.69x | *** | 24.0% | 50 |
| include posts | 2.39ms ±0.026 | 1.95ms ±0.044 | 2.43ms | ~1.00x | ≈ | 8.2% | 50 |
| include profile | 0.480ms ±0.032 | 0.276ms ±0.010 | 0.405ms | ~1.00x | ≈ | 13.3% | 50 |
| include 3 levels | 1.66ms ±0.032 | 1.20ms ±0.017 | 1.94ms | ~1.00x | ≈ | 5.1% | 50 |
| include 4 levels | 1.82ms ±0.028 | 1.09ms ±0.045 | 1.43ms | ~1.00x | ≈ | 14.8% | 50 |
| include + where | 1.34ms ±0.095 | 0.720ms ±0.058 | 1.82ms | ~1.00x | ≈ | 28.9% | 50 |
| include + select nested | 1.20ms ±0.018 | 1.50ms ±0.027 | 1.66ms | ~1.00x | ≈ | 6.5% | 50 |
| findMany startsWith | 0.192ms ±0.017 | 0.296ms ±0.177 | 0.135ms | ~1.00x | ≈ | 215.1% | 50 |
| findMany endsWith | 0.535ms ±0.013 | 0.213ms ±0.041 | 0.273ms | ~1.00x | ≈ | 69.4% | 50 |
| findMany NOT contains | 0.591ms ±0.027 | 0.228ms ±0.037 | 0.269ms | ~1.00x | ≈ | 59.3% | 50 |
| findMany LIKE | 0.200ms ±0.0083 | 0.128ms ±0.017 | 0.150ms | ~1.00x | ≈ | 47.3% | 50 |
| findMany < | 27.75ms ±0.511 | 6.75ms ±0.182 | 10.01ms | 4.11x 1.48x D | *** | 9.7% | 50 |
| findMany <= | 28.51ms ±0.683 | 7.92ms ±0.560 | 11.99ms | 3.60x 1.51x D | *** | 25.5% | 50 |
| findMany > | 18.60ms ±2.68 | 4.32ms ±0.187 | 6.21ms | 4.31x 1.44x D | *** | 15.7% | 50 |
| findMany NOT IN | 0.635ms ±0.024 | 0.433ms ±0.146 | 0.663ms | ~1.00x | ≈ | 121.7% | 50 |
| findMany isNot null | 0.634ms ±0.026 | 0.279ms ±0.016 | 0.332ms | ~1.00x | ≈ | 20.1% | 50 |
| orderBy multi-field | 2.21ms ±0.072 | 0.862ms ±0.102 | 0.668ms | 2.57x 0.78x D | *** | 42.6% | 50 |
| orderBy relation to-one | 2.03ms ±0.054 | 1.42ms ±0.030 | — | ~1.00x | ≈ | 7.6% | 50 |
| orderBy relation + scalar | 2.12ms ±0.030 | 1.45ms ±0.015 | — | ~1.00x | ≈ | 3.7% | 50 |
| orderBy nullable relation | 2.22ms ±0.082 | 1.20ms ±0.053 | — | 1.85x | *** | 15.9% | 50 |
| orderBy deep relation | 3.41ms ±0.076 | 1.95ms ±0.030 | — | 1.75x | *** | 5.6% | 50 |
| orderBy deep relation + scalar | 3.33ms ±0.195 | 2.39ms ±0.067 | — | ~1.00x | ≈ | 10.1% | 50 |
| distinct status | 8.60ms ±0.282 | 1.15ms ±0.026 | — | 7.49x | *** | 8.3% | 50 |
| distinct multi | 12.81ms ±0.175 | 2.52ms ±0.036 | — | 5.07x | *** | 5.2% | 50 |
| cursor composite tuple | 1.64ms ±0.021 | 1.27ms ±0.052 | — | ~1.00x | ≈ | 14.7% | 50 |
| cursor composite desc | 1.85ms ±0.039 | 1.36ms ±0.015 | — | ~1.00x | ≈ | 4.0% | 50 |
| cursor prefix of orderBy | 1.78ms ±0.029 | 1.29ms ±0.028 | — | ~1.00x | ≈ | 7.8% | 50 |
| select + include | 0.971ms ±0.019 | 0.782ms ±0.071 | 0.309ms | ~1.00x | ≈ | 32.8% | 50 |
| _count relation | 0.752ms ±0.014 | 0.625ms ±0.020 | — | ~1.00x | ≈ | 11.5% | 50 |
| _count multi-relation | 0.227ms ±0.030 | 0.154ms ±0.0053 | — | ~1.00x | ≈ | 12.2% | 50 |
| _count inside include | 1.22ms ±0.030 | 1.05ms ±0.040 | — | ~1.00x | ≈ | 13.8% | 50 |
| _count inside nested select | 1.77ms ±0.057 | 1.81ms ±0.137 | — | ~1.00x | ≈ | 27.2% | 50 |
| _count deep include | 1.82ms ±0.025 | 1.36ms ±0.045 | — | ~1.00x | ≈ | 11.9% | 50 |
| ILIKE special chars | 0.229ms ±0.014 | 0.157ms ±0.013 | — | ~1.00x | ≈ | 30.4% | 50 |
| LIKE case sensitive | 0.205ms ±0.0091 | 0.130ms ±0.012 | — | ~1.00x | ≈ | 34.4% | 50 |
| findMany Date range | 0.382ms ±0.040 | 0.470ms ±0.013 | 0.515ms | ~1.00x | ≈ | 9.8% | 50 |
| count Date range | 0.457ms ±0.011 | 0.374ms ±0.012 | 0.392ms | ~1.00x | ≈ | 11.4% | 50 |
| findMany Date gte | 0.331ms ±0.0091 | 0.147ms ±0.0039 | 0.182ms | ~1.00x | ≈ | 9.6% | 50 |
| depth-1 low-fan | 0.376ms ±0.016 | 0.229ms ±0.017 | — | ~1.00x | ≈ | 26.9% | 50 |
| depth-1 mid-fan | 2.46ms ±0.032 | 2.01ms ±0.065 | — | ~1.00x | ≈ | 11.8% | 50 |
| depth-1 high-fan | 2.17ms ±0.038 | 1.82ms ±0.029 | — | ~1.00x | ≈ | 5.8% | 50 |
| depth-1 wide | 1.95ms ±0.029 | 1.37ms ±0.069 | — | ~1.00x | ≈ | 18.2% | 50 |
| depth-1 unbound | 42.23ms ±0.621 | 10.82ms ±0.343 | — | 3.90x | *** | 11.4% | 50 |
| depth-2 | 3.77ms ±0.111 | 2.51ms ±0.222 | — | 1.50x | *** | 31.9% | 50 |
| depth-2 paginated Project→tasks | 1.51ms ±0.112 | 1.83ms ±0.228 | — | ~1.00x | ≈ | 44.9% | 50 |
| depth-2 high-fan | 2.09ms ±0.027 | 1.17ms ±0.079 | — | ~1.00x | ≈ | 24.3% | 50 |
| depth-2 wide | 4.31ms ±0.162 | 1.29ms ±0.067 | — | 3.35x | *** | 18.8% | 50 |
| depth-2 unbound | 63.87ms ±1.40 | 16.30ms ±0.669 | — | 3.92x | *** | 6.6% | 10 |
| depth-3 unbound | 14.47ms ±0.261 | 5.95ms ±0.370 | — | 2.43x | *** | 22.5% | 50 |
| depth-3 paginated | 1.64ms ±0.045 | 1.98ms ±0.236 | — | ~1.00x | ≈ | 43.1% | 50 |
| depth-4 unbound | 8.78ms ±0.198 | 4.46ms ±0.197 | — | 1.97x | *** | 15.9% | 50 |
| depth-4 paginated | 1.85ms ±0.072 | 1.60ms ±0.244 | — | ~1.00x | ≈ | 55.2% | 50 |
| findFirst depth-2 | 1.25ms ±0.028 | 0.991ms ±0.048 | — | ~1.00x | ≈ | 17.4% | 50 |
| findUnique depth-2 Project→tasks→comment | 1.57ms ±0.065 | 0.962ms ±0.077 | — | ~1.00x | ≈ | 28.7% | 50 |
| complex nested select | 2.90ms ±0.025 | 1.90ms ±0.112 | — | ~1.00x | ≈ | 21.3% | 50 |
| ultra deep query | 13.63ms ±0.362 | 8.43ms ±0.169 | — | 1.62x | *** | 7.3% | 50 |
| transaction: (3 operations) | 11.89ms ±0.190 | 9.51ms ±0.173 | — | 1.25x | *** | 6.6% | 50 |
| Тест | Prisma | prisma-sql | Drizzle | Ускорение | Знач. | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.481ms ±0.038 | 0.077ms ±0.012 | 0.124ms | ~1.00x | ≈ | 56.7% | 50 |
| findMany where = | 0.402ms ±0.0069 | 0.059ms ±0.0072 | 0.137ms | ~1.00x | ≈ | 43.5% | 50 |
| findMany where >= | 13.83ms ±0.115 | 1.93ms ±0.245 | 2.51ms | 7.18x 1.31x D | *** | 45.8% | 50 |
| findMany where IN | 0.486ms ±0.051 | 0.068ms ±0.011 | 0.120ms | ~1.00x | ≈ | 55.2% | 50 |
| findMany where null | 0.182ms ±0.0053 | 0.025ms ±0.0014 | 0.060ms | ~1.00x | ≈ | 22.1% | 50 |
| findMany AND | 1.68ms ±0.030 | 0.337ms ±0.048 | 0.467ms | 5.00x 1.39x D | *** | 51.7% | 50 |
| findMany OR | 11.30ms ±0.173 | 1.57ms ±0.232 | 2.06ms | 7.22x 1.32x D | *** | 53.5% | 50 |
| findMany NOT | 0.504ms ±0.037 | 0.083ms ±0.023 | 0.101ms | ~1.00x | ≈ | 98.7% | 50 |
| findMany orderBy | 2.51ms ±0.040 | 1.95ms ±0.018 | 2.03ms | ~1.00x | ≈ | 3.3% | 50 |
| findMany pagination | 0.173ms ±0.015 | 0.057ms ±0.014 | 0.075ms | ~1.00x | ≈ | 85.5% | 50 |
| findMany select | 0.204ms ±0.029 | 0.069ms ±0.0083 | 0.044ms | ~1.00x | ≈ | 43.9% | 50 |
| findMany relation some | 5.11ms ±0.067 | 0.455ms ±0.0083 | — | 11.24x | *** | 6.7% | 50 |
| findMany relation every | 10.63ms ±0.088 | 6.95ms ±0.111 | — | 1.53x | *** | 5.8% | 50 |
| findMany relation none | 183.30ms ±0.578 | 3.59ms ±0.414 | — | 51.03x | *** | 18.6% | 10 |
| findMany nested relation | 1.19ms ±0.040 | 0.357ms ±0.015 | — | ~1.00x | ≈ | 15.4% | 50 |
| findMany complex | 0.947ms ±0.051 | 0.435ms ±0.0094 | 0.491ms | ~1.00x | ≈ | 7.8% | 50 |
| findFirst | 0.181ms ±0.039 | 0.029ms ±0.0019 | 0.068ms | ~1.00x | ≈ | 23.8% | 50 |
| findFirst skip | 0.198ms ±0.0061 | 0.033ms ±0.0011 | 0.082ms | ~1.00x | ≈ | 11.4% | 50 |
| findUnique id | 0.166ms ±0.031 | 0.030ms ±0.0022 | 0.064ms | ~1.00x | ≈ | 27.7% | 50 |
| findUnique email | 0.139ms ±0.0055 | 0.027ms ±0.0011 | 0.053ms | ~1.00x | ≈ | 14.7% | 50 |
| count | 0.071ms ±0.0025 | 0.018ms ±0.0036 | 0.018ms | ~1.00x | ≈ | 71.5% | 50 |
| count where | 0.293ms ±0.025 | 0.172ms ±0.0039 | 0.179ms | ~1.00x | ≈ | 7.9% | 50 |
| _count via include | 0.572ms ±0.011 | 0.386ms ±0.0064 | — | ~1.00x | ≈ | 6.0% | 50 |
| _count via include + relations | 1.16ms ±0.018 | 0.698ms ±0.033 | — | ~1.00x | ≈ | 16.9% | 50 |
| aggregate count | 0.166ms ±0.012 | 0.023ms ±0.0017 | — | ~1.00x | ≈ | 26.8% | 50 |
| aggregate sum/avg | 0.298ms ±0.0061 | 0.180ms ±0.0061 | — | ~1.00x | ≈ | 12.0% | 50 |
| aggregate where | 0.279ms ±0.0053 | 0.173ms ±0.0028 | — | ~1.00x | ≈ | 5.8% | 50 |
| aggregate min/max | 0.322ms ±0.027 | 0.179ms ±0.0030 | — | ~1.00x | ≈ | 6.2% | 50 |
| aggregate complete | 0.450ms ±0.025 | 0.257ms ±0.0050 | — | ~1.00x | ≈ | 7.2% | 50 |
| groupBy | 0.598ms ±0.011 | 0.480ms ±0.0067 | — | ~1.00x | ≈ | 5.0% | 50 |
| groupBy count | 0.639ms ±0.017 | 0.487ms ±0.0072 | — | ~1.00x | ≈ | 5.3% | 50 |
| groupBy multi | 1.28ms ±0.023 | 1.04ms ±0.0086 | — | ~1.00x | ≈ | 3.0% | 50 |
| groupBy having | 0.693ms ±0.011 | 0.527ms ±0.0075 | — | ~1.00x | ≈ | 5.1% | 50 |
| groupBy + where | 0.347ms ±0.0061 | 0.219ms ±0.0039 | — | ~1.00x | ≈ | 6.5% | 50 |
| groupBy aggregates | 0.777ms ±0.014 | 0.615ms ±0.0078 | — | ~1.00x | ≈ | 4.5% | 50 |
| groupBy min/max | 0.919ms ±0.055 | 0.635ms ±0.0083 | — | ~1.00x | ≈ | 4.7% | 50 |
| include posts | 2.32ms ±0.288 | 0.453ms ±0.065 | 1.53ms | 5.11x 3.38x D | *** | 51.4% | 50 |
| include profile | 0.367ms ±0.016 | 0.095ms ±0.016 | 0.260ms | ~1.00x | ≈ | 60.1% | 50 |
| include 3 levels | 1.23ms ±0.036 | 1.48ms ±0.069 | 0.941ms | ~1.00x | ≈ | 16.9% | 50 |
| include 4 levels | 1.35ms ±0.142 | 1.65ms ±0.065 | 0.762ms | ~1.00x | ≈ | 14.1% | 50 |
| include + where | 0.832ms ±0.022 | 0.309ms ±0.034 | 0.344ms | ~1.00x | ≈ | 39.7% | 50 |
| include + select nested | 0.868ms ±0.040 | 0.339ms ±0.034 | 1.12ms | ~1.00x | ≈ | 36.0% | 50 |
| findMany startsWith | 0.183ms ±0.0091 | 0.034ms ±0.0014 | 0.073ms | ~1.00x | ≈ | 15.5% | 50 |
| findMany endsWith | 0.549ms ±0.034 | 0.091ms ±0.0097 | 0.154ms | ~1.00x | ≈ | 38.2% | 50 |
| findMany NOT contains | 0.568ms ±0.048 | 0.074ms ±0.0094 | 0.116ms | ~1.00x | ≈ | 45.5% | 50 |
| findMany LIKE | 0.168ms ±0.0036 | 0.032ms ±0.0017 | 0.062ms | ~1.00x | ≈ | 17.6% | 50 |
| findMany < | 23.71ms ±0.228 | 3.32ms ±0.304 | 4.19ms | 7.15x 1.26x D | *** | 33.0% | 50 |
| findMany <= | 24.42ms ±0.132 | 3.90ms ±0.478 | 4.30ms | 6.26x 1.10x D | *** | 44.3% | 50 |
| findMany > | 13.12ms ±0.124 | 1.61ms ±0.250 | 2.22ms | 8.17x 1.38x D | *** | 56.1% | 50 |
| findMany NOT IN | 0.467ms ±0.016 | 0.067ms ±0.0091 | 0.130ms | ~1.00x | ≈ | 48.3% | 50 |
| findMany isNot null | 0.489ms ±0.030 | 0.051ms ±0.0025 | 0.096ms | ~1.00x | ≈ | 18.1% | 50 |
| orderBy multi-field | 0.723ms ±0.022 | 0.366ms ±0.0053 | 0.432ms | ~1.00x | ≈ | 5.3% | 50 |
| orderBy relation to-one | 0.690ms ±0.021 | 0.343ms ±0.0061 | — | ~1.00x | ≈ | 6.5% | 50 |
| orderBy relation + scalar | 0.801ms ±0.022 | 0.445ms ±0.014 | — | ~1.00x | ≈ | 11.1% | 50 |
| orderBy nullable relation | 0.665ms ±0.0091 | 0.351ms ±0.0053 | — | ~1.00x | ≈ | 5.3% | 50 |
| orderBy deep relation | 0.781ms ±0.024 | 0.416ms ±0.0083 | — | ~1.00x | ≈ | 7.2% | 50 |
| orderBy deep relation + scalar | 1.45ms ±0.106 | 0.764ms ±0.020 | — | ~1.00x | ≈ | 9.6% | 50 |
| distinct status | 11.96ms ±0.084 | 4.49ms ±0.024 | — | 2.66x | *** | 2.0% | 50 |
| distinct multi | 13.29ms ±0.233 | 5.52ms ±0.031 | — | 2.41x | *** | 2.0% | 50 |
| select + include | 0.649ms ±0.047 | 0.421ms ±0.055 | 0.167ms | ~1.00x | ≈ | 47.4% | 50 |
| _count relation | 0.738ms ±0.025 | 0.399ms ±0.031 | — | ~1.00x | ≈ | 28.0% | 50 |
| _count multi-relation | 0.156ms ±0.0047 | 0.058ms ±0.0039 | — | ~1.00x | ≈ | 24.5% | 50 |
| _count inside include | 0.936ms ±0.021 | 0.582ms ±0.036 | — | ~1.00x | ≈ | 22.4% | 50 |
| _count inside nested select | 1.68ms ±0.020 | 1.30ms ±0.032 | — | ~1.00x | ≈ | 8.9% | 50 |
| _count deep include | 1.46ms ±0.025 | 1.29ms ±0.044 | — | ~1.00x | ≈ | 12.4% | 50 |
| findMany Date range | 0.290ms ±0.012 | 0.056ms ±0.0080 | 0.267ms | ~1.00x | ≈ | 51.2% | 50 |
| findMany Date gte | 0.259ms ±0.0053 | 0.046ms ±0.0011 | 0.090ms | ~1.00x | ≈ | 9.3% | 50 |
| depth-1 low-fan Project→labels | 0.282ms ±0.025 | 0.069ms ±0.0055 | — | ~1.00x | ≈ | 29.8% | 50 |
| depth-1 mid-fan Project→tasks | 2.14ms ±0.036 | 0.420ms ±0.057 | — | 5.10x | *** | 49.3% | 50 |
| depth-1 high-fan User→assignedTasks | 1.82ms ±0.025 | 0.392ms ±0.060 | — | 4.65x | *** | 55.0% | 50 |
| depth-1 wide | 1.69ms ±0.038 | 0.387ms ±0.047 | — | 4.37x | *** | 44.1% | 50 |
| depth-1 no-limit Project→tasks | 37.22ms ±0.275 | 5.44ms ±0.322 | — | 6.84x | *** | 21.3% | 50 |
| depth-2 | 2.00ms ±0.163 | 0.558ms ±0.080 | — | 3.59x | *** | 51.8% | 50 |
| depth-2 paginated | 0.944ms ±0.017 | 0.488ms ±0.067 | — | ~1.00x | ≈ | 49.1% | 50 |
| depth-2 high-fan | 1.78ms ±0.039 | 0.467ms ±0.046 | — | 3.81x | *** | 35.6% | 50 |
| depth-2 wide+attach+activity | 2.06ms ±0.043 | 0.623ms ±0.055 | — | 3.30x | *** | 32.1% | 50 |
| depth-2 no-limit | 53.75ms ±0.591 | 11.22ms ±1.67 | — | 4.79x | *** | 24.1% | 10 |
| depth-3 | 10.81ms ±0.092 | 2.20ms ±0.233 | — | 4.92x | *** | 38.2% | 50 |
| depth-3 paginated | 1.17ms ±0.021 | 1.47ms ±0.090 | — | ~1.00x | ≈ | 22.1% | 50 |
| depth-4 | 6.65ms ±0.289 | 1.33ms ±0.128 | — | 5.00x | *** | 34.8% | 50 |
| depth-4 paginated | 1.18ms ±0.024 | 1.59ms ±0.059 | — | ~1.00x | ≈ | 13.4% | 50 |
| findFirst depth-2 | 1.01ms ±0.034 | 0.320ms ±0.0080 | — | ~1.00x | ≈ | 9.0% | 50 |
| findUnique depth-2 | 0.989ms ±0.016 | 0.306ms ±0.0047 | — | ~1.00x | ≈ | 5.5% | 50 |
| Тест | Prisma | prisma-sql | Drizzle | Ускорение | Знач. | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.311ms ±0.056 | 0.256ms ±0.050 | 0.279ms | ~1.00x | ≈ | 71.0% | 50 |
| findMany where = | 0.516ms ±0.205 | 0.263ms ±0.060 | 0.343ms | ~1.00x | ≈ | 82.1% | 50 |
| findMany where >= | 10.68ms ±1.97 | 5.17ms ±0.599 | 6.89ms | 2.07x 1.33x D | *** | 41.9% | 50 |
| findMany where IN | 0.402ms ±0.068 | 0.408ms ±0.023 | 0.431ms | ~1.00x | ≈ | 20.3% | 50 |
| findMany where null | 0.167ms ±0.0072 | 0.154ms ±0.0078 | 0.186ms | ~1.00x | ≈ | 17.9% | 50 |
| findMany ILIKE | 0.181ms ±0.012 | 0.265ms ±0.024 | 0.214ms | ~1.00x | ≈ | 32.7% | 50 |
| findMany AND | 2.13ms ±0.098 | 1.11ms ±0.082 | 1.63ms | 1.91x 1.47x D | *** | 26.7% | 50 |
| findMany OR | 7.89ms ±0.331 | 4.28ms ±0.290 | 5.97ms | 1.84x 1.40x D | *** | 24.4% | 50 |
| findMany NOT | 0.383ms ±0.044 | 0.381ms ±0.024 | 0.418ms | ~1.00x | ≈ | 23.1% | 50 |
| findMany orderBy | 1.64ms ±0.053 | 0.737ms ±0.076 | 0.649ms | ~1.00x | ≈ | 37.0% | 50 |
| findMany pagination | 0.116ms ±0.0086 | 0.177ms ±0.026 | 0.163ms | ~1.00x | ≈ | 52.5% | 50 |
| findMany select | 0.118ms ±0.010 | 0.155ms ±0.018 | 0.141ms | ~1.00x | ≈ | 42.0% | 50 |
| findMany relation some | 0.635ms ±0.037 | 0.482ms ±0.026 | — | ~1.00x | ≈ | 19.1% | 50 |
| findMany relation every | 0.739ms ±0.075 | 0.517ms ±0.035 | — | ~1.00x | ≈ | 24.7% | 50 |
| findMany relation none | 13.37ms ±0.240 | 7.56ms ±0.248 | — | 1.77x | *** | 11.8% | 50 |
| findMany nested relation | 0.593ms ±0.023 | 0.515ms ±0.040 | — | ~1.00x | ≈ | 27.9% | 50 |
| findMany complex | 0.814ms ±0.036 | 0.491ms ±0.025 | 0.532ms | ~1.00x | ≈ | 18.6% | 50 |
| findFirst | 0.118ms ±0.0100 | 0.175ms ±0.021 | 0.158ms | ~1.00x | ≈ | 43.6% | 50 |
| findFirst skip | 0.168ms ±0.045 | 0.157ms ±0.017 | 0.171ms | ~1.00x | ≈ | 38.4% | 50 |
| findUnique id | 0.120ms ±0.013 | 0.125ms ±0.012 | 0.164ms | ~1.00x | ≈ | 33.8% | 50 |
| findUnique email | 0.131ms ±0.024 | 0.131ms ±0.019 | 0.144ms | ~1.00x | ≈ | 52.5% | 50 |
| count | 0.098ms ±0.012 | 0.086ms ±0.036 | 0.061ms | ~1.00x | ≈ | 152.3% | 50 |
| count where | 0.427ms ±0.022 | 0.307ms ±0.023 | 0.307ms | ~1.00x | ≈ | 26.8% | 50 |
| aggregate count | 0.239ms ±0.039 | 0.174ms ±0.016 | — | ~1.00x | ≈ | 32.3% | 50 |
| aggregate sum/avg | 0.326ms ±0.021 | 0.297ms ±0.022 | — | ~1.00x | ≈ | 27.0% | 50 |
| aggregate where | 0.447ms ±0.034 | 0.319ms ±0.022 | — | ~1.00x | ≈ | 25.1% | 50 |
| aggregate min/max | 0.304ms ±0.016 | 0.294ms ±0.022 | — | ~1.00x | ≈ | 27.2% | 50 |
| aggregate complete | 0.385ms ±0.021 | 0.351ms ±0.026 | — | ~1.00x | ≈ | 26.3% | 50 |
| groupBy | 0.388ms ±0.028 | 0.428ms ±0.036 | — | ~1.00x | ≈ | 30.3% | 50 |
| groupBy count | 0.501ms ±0.049 | 0.473ms ±0.054 | — | ~1.00x | ≈ | 41.4% | 50 |
| groupBy multi | 0.527ms ±0.031 | 0.506ms ±0.032 | — | ~1.00x | ≈ | 23.2% | 50 |
| groupBy having | 0.572ms ±0.088 | 0.517ms ±0.045 | — | ~1.00x | ≈ | 31.8% | 50 |
| groupBy + where | 0.561ms ±0.061 | 0.375ms ±0.045 | — | ~1.00x | ≈ | 43.0% | 50 |
| _count via include | 0.634ms ±0.053 | 0.658ms ±0.035 | — | ~1.00x | ≈ | 19.3% | 50 |
| _count via include + relations | 1.32ms ±0.076 | 1.46ms ±0.084 | — | ~1.00x | ≈ | 20.7% | 50 |
| groupBy aggregates | 0.484ms ±0.035 | 0.443ms ±0.019 | — | ~1.00x | ≈ | 15.1% | 50 |
| groupBy min/max | 0.454ms ±0.029 | 0.424ms ±0.015 | — | ~1.00x | ≈ | 12.9% | 50 |
| include list + nested to-one | 1.06ms ±0.099 | 0.412ms ±0.029 | — | ~1.00x | ≈ | 25.0% | 50 |
| include list + nullable to-one | 1.45ms ±0.121 | 2.03ms ±0.363 | — | ~1.00x | ≈ | 64.4% | 50 |
| include posts | 1.41ms ±0.100 | 2.16ms ±0.088 | 2.47ms | ~1.00x | ≈ | 14.8% | 50 |
| include profile | 0.248ms ±0.025 | 0.314ms ±0.041 | 0.557ms | ~1.00x | ≈ | 47.1% | 50 |
| include 3 levels | 1.26ms ±0.070 | 1.26ms ±0.036 | 1.53ms | ~1.00x | ≈ | 10.4% | 50 |
| include 4 levels | 1.47ms ±0.169 | 1.11ms ±0.041 | 1.47ms | ~1.00x | ≈ | 13.2% | 50 |
| include + where | 0.760ms ±0.050 | 0.740ms ±0.055 | 1.79ms | ~1.00x | ≈ | 26.8% | 50 |
| include + select nested | 0.669ms ±0.050 | 1.68ms ±0.084 | 1.85ms | 0.40x 1.10x D | *** | 18.1% | 50 |
| findMany startsWith | 0.123ms ±0.010 | 0.176ms ±0.037 | 0.157ms | ~1.00x | ≈ | 76.8% | 50 |
| findMany endsWith | 0.304ms ±0.045 | 0.298ms ±0.061 | 0.301ms | ~1.00x | ≈ | 73.6% | 50 |
| findMany NOT contains | 0.283ms ±0.046 | 0.258ms ±0.050 | 0.276ms | ~1.00x | ≈ | 70.7% | 50 |
| findMany LIKE | 0.114ms ±0.011 | 0.148ms ±0.056 | 0.148ms | ~1.00x | ≈ | 135.6% | 50 |
| findMany < | 12.56ms ±0.244 | 7.31ms ±0.249 | 11.08ms | 1.72x 1.52x D | *** | 12.3% | 50 |
| findMany <= | 17.11ms ±4.84 | 15.09ms ±4.95 | 10.33ms | 1.13x 0.68x D | ns | 118.3% | 50 |
| findMany > | 7.38ms ±0.197 | 4.65ms ±0.638 | 6.11ms | 1.59x 1.31x D | *** | 49.5% | 50 |
| findMany NOT IN | 0.345ms ±0.060 | 0.343ms ±0.019 | 0.384ms | ~1.00x | ≈ | 19.5% | 50 |
| findMany isNot null | 0.319ms ±0.044 | 0.257ms ±0.046 | 0.260ms | ~1.00x | ≈ | 64.9% | 50 |
| orderBy multi-field | 1.89ms ±0.020 | 0.633ms ±0.043 | 0.619ms | 2.98x 0.98x D | *** | 24.7% | 50 |
| orderBy relation to-one | 1.84ms ±0.034 | 1.52ms ±0.086 | — | ~1.00x | ≈ | 20.4% | 50 |
| orderBy relation + scalar | 2.40ms ±0.618 | 1.53ms ±0.028 | — | ~1.00x | ≈ | 6.7% | 50 |
| orderBy nullable relation | 1.83ms ±0.086 | 1.43ms ±0.093 | — | ~1.00x | ≈ | 23.4% | 50 |
| orderBy deep relation | 2.18ms ±0.052 | 1.69ms ±0.033 | — | ~1.00x | ≈ | 7.1% | 50 |
| orderBy deep relation + scalar | 2.68ms ±0.070 | 2.15ms ±0.037 | — | ~1.00x | ≈ | 6.2% | 50 |
| distinct status | 8.78ms ±0.188 | 1.30ms ±0.077 | — | 6.75x | *** | 21.2% | 50 |
| distinct multi | 12.68ms ±0.261 | 2.66ms ±0.051 | — | 4.77x | *** | 6.9% | 50 |
| cursor composite tuple | 1.49ms ±0.032 | 1.35ms ±0.053 | — | ~1.00x | ≈ | 14.3% | 50 |
| cursor composite desc | 1.63ms ±0.028 | 1.35ms ±0.012 | — | ~1.00x | ≈ | 3.2% | 50 |
| cursor prefix of orderBy | 1.53ms ±0.023 | 1.24ms ±0.015 | — | ~1.00x | ≈ | 4.3% | 50 |
| select + include | 0.603ms ±0.042 | 0.681ms ±0.063 | 0.378ms | ~1.00x | ≈ | 33.7% | 50 |
| _count relation | 0.572ms ±0.018 | 0.609ms ±0.019 | — | ~1.00x | ≈ | 11.3% | 50 |
| _count multi-relation | 0.193ms ±0.015 | 0.155ms ±0.0089 | — | ~1.00x | ≈ | 20.9% | 50 |
| _count inside include | 0.906ms ±0.043 | 0.988ms ±0.044 | — | ~1.00x | ≈ | 16.0% | 50 |
| _count inside nested select | 1.37ms ±0.031 | 1.52ms ±0.037 | — | ~1.00x | ≈ | 8.7% | 50 |
| _count deep include | 1.62ms ±0.080 | 1.27ms ±0.025 | — | ~1.00x | ≈ | 7.2% | 50 |
| ILIKE special chars | 0.121ms ±0.012 | 0.168ms ±0.043 | — | ~1.00x | ≈ | 92.8% | 50 |
| LIKE case sensitive | 0.104ms ±0.0091 | 0.114ms ±0.0100 | — | ~1.00x | ≈ | 31.8% | 50 |
| findMany Date range | 0.172ms ±0.030 | 0.173ms ±0.013 | 0.216ms | ~1.00x | ≈ | 26.7% | 50 |
| count Date range | 0.378ms ±0.020 | 0.364ms ±0.0083 | 0.408ms | ~1.00x | ≈ | 8.3% | 50 |
| findMany Date gte | 0.171ms ±0.014 | 0.219ms ±0.034 | 0.212ms | ~1.00x | ≈ | 55.6% | 50 |
| depth-1 low-fan | 0.254ms ±0.031 | 0.230ms ±0.0053 | — | ~1.00x | ≈ | 8.1% | 50 |
| depth-1 mid-fan | 2.48ms ±0.437 | 1.97ms ±0.106 | — | ~1.00x | ≈ | 19.3% | 50 |
| depth-1 high-fan | 1.27ms ±0.150 | 2.25ms ±0.121 | — | ~1.00x | ≈ | 19.4% | 50 |
| depth-1 wide | 1.03ms ±0.092 | 1.58ms ±0.098 | — | ~1.00x | ≈ | 22.4% | 50 |
| depth-1 unbound | 20.57ms ±0.824 | 11.58ms ±1.15 | — | 1.78x | *** | 35.8% | 50 |
| depth-2 | 2.72ms ±0.109 | 2.97ms ±0.153 | — | ~1.00x | ≈ | 18.6% | 50 |
| depth-2 paginated Project→tasks | 0.983ms ±0.091 | 1.98ms ±0.254 | — | ~1.00x | ≈ | 46.5% | 50 |
| depth-2 high-fan | 1.25ms ±0.098 | 1.19ms ±0.068 | — | ~1.00x | ≈ | 20.7% | 50 |
| depth-2 wide | 1.43ms ±0.122 | 1.35ms ±0.078 | — | ~1.00x | ≈ | 21.0% | 50 |
| depth-2 unbound | 33.42ms ±0.818 | 19.13ms ±0.384 | — | 1.75x | *** | 7.2% | 50 |
| depth-3 unbound | 8.95ms ±0.357 | 8.12ms ±0.236 | — | ~1.00x | ≈ | 10.5% | 50 |
| depth-3 paginated | 1.15ms ±0.066 | 1.59ms ±0.216 | — | ~1.00x | ≈ | 49.1% | 50 |
| depth-4 unbound | 4.59ms ±0.292 | 3.07ms ±0.149 | — | 1.50x | *** | 17.6% | 50 |
| depth-4 paginated | 1.40ms ±0.110 | 1.66ms ±0.204 | — | ~1.00x | ≈ | 44.5% | 50 |
| findFirst depth-2 | 0.853ms ±0.068 | 1.04ms ±0.058 | — | ~1.00x | ≈ | 20.2% | 50 |
| findUnique depth-2 Project→tasks→comment | 0.869ms ±0.057 | 0.965ms ±0.045 | — | ~1.00x | ≈ | 17.0% | 50 |
| complex nested select | 3.21ms ±0.099 | 2.14ms ±0.048 | — | 1.50x | *** | 8.1% | 50 |
| ultra deep query | 6.89ms ±0.203 | 6.82ms ±0.097 | — | ~1.00x | ≈ | 5.1% | 50 |
| transaction: (3 operations) | 2.44ms ±0.065 | 1.10ms ±0.027 | — | 2.21x | *** | 8.7% | 50 |
| Тест | Prisma | prisma-sql | Drizzle | Ускорение | Знач. | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.200ms ±0.045 | 0.080ms ±0.014 | 0.152ms | ~1.00x | ≈ | 60.6% | 50 |
| findMany where = | 0.139ms ±0.0050 | 0.067ms ±0.0067 | 0.140ms | ~1.00x | ≈ | 36.4% | 50 |
| findMany where >= | 4.73ms ±0.194 | 2.14ms ±0.344 | 2.56ms | 2.21x 1.19x D | *** | 57.9% | 50 |
| findMany where IN | 0.197ms ±0.042 | 0.067ms ±0.0078 | 0.156ms | ~1.00x | ≈ | 41.9% | 50 |
| findMany where null | 0.070ms ±0.0033 | 0.025ms ±0.0006 | 0.061ms | ~1.00x | ≈ | 8.0% | 50 |
| findMany AND | 0.717ms ±0.102 | 0.364ms ±0.060 | 0.512ms | ~1.00x | ≈ | 59.1% | 50 |
| findMany OR | 3.92ms ±0.201 | 1.74ms ±0.243 | 2.19ms | 2.26x 1.26x D | *** | 50.6% | 50 |
| findMany NOT | 0.160ms ±0.013 | 0.135ms ±0.102 | 0.147ms | ~1.00x | ≈ | 271.5% | 50 |
| findMany orderBy | 1.99ms ±0.033 | 2.02ms ±0.070 | 1.94ms | ~1.00x | ≈ | 12.5% | 50 |
| findMany pagination | 0.079ms ±0.0083 | 0.040ms ±0.0033 | 0.070ms | ~1.00x | ≈ | 29.8% | 50 |
| findMany select | 0.067ms ±0.0044 | 0.073ms ±0.0055 | 0.042ms | ~1.00x | ≈ | 27.8% | 50 |
| findMany relation some | 0.422ms ±0.011 | 0.489ms ±0.048 | — | ~1.00x | ≈ | 35.3% | 50 |
| findMany relation every | 10.17ms ±0.058 | 6.95ms ±0.094 | — | 1.46x | *** | 4.9% | 50 |
| findMany relation none | 138.52ms ±1.80 | 4.34ms ±0.764 | — | 31.93x | *** | 28.4% | 10 |
| findMany nested relation | 0.436ms ±0.045 | 0.365ms ±0.019 | — | ~1.00x | ≈ | 19.0% | 50 |
| findMany complex | 0.577ms ±0.027 | 0.534ms ±0.018 | 0.568ms | ~1.00x | ≈ | 12.2% | 50 |
| findFirst | 0.108ms ±0.022 | 0.034ms ±0.0036 | 0.082ms | ~1.00x | ≈ | 38.0% | 50 |
| findFirst skip | 0.150ms ±0.075 | 0.073ms ±0.017 | 0.137ms | ~1.00x | ≈ | 82.3% | 50 |
| findUnique id | 0.113ms ±0.017 | 0.045ms ±0.0100 | 0.082ms | ~1.00x | ≈ | 79.3% | 50 |
| findUnique email | 0.099ms ±0.014 | 0.038ms ±0.0033 | 0.090ms | ~1.00x | ≈ | 33.0% | 50 |
| count | 0.042ms ±0.0033 | 0.017ms ±0.0028 | 0.017ms | ~1.00x | ≈ | 59.8% | 50 |
| count where | 0.214ms ±0.0055 | 0.176ms ±0.0036 | 0.183ms | ~1.00x | ≈ | 7.4% | 50 |
| _count via include | 0.466ms ±0.0094 | 0.384ms ±0.0075 | — | ~1.00x | ≈ | 6.9% | 50 |
| _count via include + relations | 0.882ms ±0.049 | 0.752ms ±0.032 | — | ~1.00x | ≈ | 15.5% | 50 |
| aggregate count | 0.079ms ±0.0019 | 0.025ms ±0.0008 | — | ~1.00x | ≈ | 10.3% | 50 |
| aggregate sum/avg | 0.237ms ±0.013 | 0.197ms ±0.014 | — | ~1.00x | ≈ | 25.4% | 50 |
| aggregate where | 0.214ms ±0.0069 | 0.183ms ±0.0028 | — | ~1.00x | ≈ | 5.7% | 50 |
| aggregate min/max | 0.228ms ±0.0067 | 0.185ms ±0.0036 | — | ~1.00x | ≈ | 7.0% | 50 |
| aggregate complete | 0.302ms ±0.0053 | 0.252ms ±0.0039 | — | ~1.00x | ≈ | 5.7% | 50 |
| groupBy | 2.20ms ±1.09 | 0.528ms ±0.045 | — | 4.16x | ** | 30.6% | 50 |
| groupBy count | 0.542ms ±0.014 | 0.717ms ±0.090 | — | ~1.00x | ≈ | 45.5% | 50 |
| groupBy multi | 1.06ms ±0.011 | 1.05ms ±0.015 | — | ~1.00x | ≈ | 5.1% | 50 |
| groupBy having | 0.553ms ±0.014 | 0.526ms ±0.024 | — | ~1.00x | ≈ | 16.5% | 50 |
| groupBy + where | 0.245ms ±0.0080 | 0.242ms ±0.052 | — | ~1.00x | ≈ | 77.8% | 50 |
| groupBy aggregates | 0.651ms ±0.013 | 0.606ms ±0.0075 | — | ~1.00x | ≈ | 4.5% | 50 |
| groupBy min/max | 0.659ms ±0.014 | 0.671ms ±0.034 | — | ~1.00x | ≈ | 18.4% | 50 |
| include posts | 0.953ms ±0.108 | 0.488ms ±0.072 | 1.49ms | ~1.00x | ≈ | 52.8% | 50 |
| include profile | 0.199ms ±0.028 | 0.100ms ±0.015 | 0.265ms | ~1.00x | ≈ | 54.5% | 50 |
| include 3 levels | 0.711ms ±0.059 | 1.56ms ±0.086 | 0.871ms | ~1.00x | ≈ | 19.8% | 50 |
| include 4 levels | 0.776ms ±0.063 | 1.89ms ±0.147 | 0.699ms | 0.41x 0.37x D | *** | 28.1% | 50 |
| include + where | 0.512ms ±0.055 | 0.336ms ±0.043 | 0.339ms | ~1.00x | ≈ | 46.0% | 50 |
| include + select nested | 0.405ms ±0.042 | 0.354ms ±0.028 | 1.08ms | ~1.00x | ≈ | 28.1% | 50 |
| findMany startsWith | 0.086ms ±0.012 | 0.037ms ±0.0008 | 0.069ms | ~1.00x | ≈ | 9.3% | 50 |
| findMany endsWith | 0.162ms ±0.0067 | 0.076ms ±0.0083 | 0.155ms | ~1.00x | ≈ | 39.5% | 50 |
| findMany NOT contains | 0.162ms ±0.0050 | 0.091ms ±0.045 | 0.141ms | ~1.00x | ≈ | 180.4% | 50 |
| findMany LIKE | 0.071ms ±0.0047 | 0.035ms ±0.0008 | 0.089ms | ~1.00x | ≈ | 8.7% | 50 |
| findMany < | 7.74ms ±0.275 | 3.56ms ±0.288 | 4.33ms | 2.18x 1.22x D | *** | 29.2% | 50 |
| findMany <= | 8.46ms ±0.379 | 3.29ms ±0.198 | 4.62ms | 2.57x 1.40x D | *** | 21.8% | 50 |
| findMany > | 4.24ms ±0.147 | 1.57ms ±0.151 | 2.41ms | 2.69x 1.53x D | *** | 34.5% | 50 |
| findMany NOT IN | 0.214ms ±0.058 | 0.059ms ±0.0022 | 0.144ms | ~1.00x | ≈ | 13.9% | 50 |
| findMany isNot null | 0.182ms ±0.060 | 0.057ms ±0.0022 | 0.103ms | ~1.00x | ≈ | 14.2% | 50 |
| orderBy multi-field | 0.462ms ±0.0080 | 0.417ms ±0.053 | 0.450ms | ~1.00x | ≈ | 46.3% | 50 |
| orderBy relation to-one | 0.433ms ±0.013 | 0.359ms ±0.012 | — | ~1.00x | ≈ | 11.8% | 50 |
| orderBy relation + scalar | 0.539ms ±0.058 | 0.435ms ±0.0075 | — | ~1.00x | ≈ | 6.2% | 50 |
| orderBy nullable relation | 0.486ms ±0.067 | 0.388ms ±0.025 | — | ~1.00x | ≈ | 23.3% | 50 |
| orderBy deep relation | 0.495ms ±0.0086 | 0.410ms ±0.0061 | — | ~1.00x | ≈ | 5.5% | 50 |
| orderBy deep relation + scalar | 0.839ms ±0.015 | 0.803ms ±0.057 | — | ~1.00x | ≈ | 25.7% | 50 |
| distinct status | 7.73ms ±0.280 | 5.40ms ±0.199 | — | 1.43x | *** | 13.3% | 50 |
| distinct multi | 7.52ms ±0.138 | 5.83ms ±0.037 | — | 1.29x | *** | 2.3% | 50 |
| select + include | 0.329ms ±0.015 | 0.309ms ±0.042 | 0.191ms | ~1.00x | ≈ | 48.7% | 50 |
| _count relation | 0.485ms ±0.045 | 0.385ms ±0.0072 | — | ~1.00x | ≈ | 6.7% | 50 |
| _count multi-relation | 0.093ms ±0.0055 | 0.055ms ±0.0055 | — | ~1.00x | ≈ | 36.2% | 50 |
| _count inside include | 0.711ms ±0.053 | 0.863ms ±0.058 | — | ~1.00x | ≈ | 24.1% | 50 |
| _count inside nested select | 1.38ms ±0.040 | 1.25ms ±0.014 | — | ~1.00x | ≈ | 4.0% | 50 |
| _count deep include | 1.11ms ±0.042 | 1.37ms ±0.078 | — | ~1.00x | ≈ | 20.6% | 50 |
| findMany Date range | 0.124ms ±0.021 | 0.058ms ±0.0083 | 0.365ms | ~1.00x | ≈ | 50.6% | 50 |
| findMany Date gte | 0.100ms ±0.0069 | 0.052ms ±0.0022 | 0.143ms | ~1.00x | ≈ | 16.1% | 50 |
| depth-1 low-fan Project→labels | 0.144ms ±0.0078 | 0.106ms ±0.061 | — | ~1.00x | ≈ | 208.2% | 50 |
| depth-1 mid-fan Project→tasks | 0.883ms ±0.090 | 0.448ms ±0.080 | — | ~1.00x | ≈ | 64.2% | 50 |
| depth-1 high-fan User→assignedTasks | 0.793ms ±0.093 | 0.426ms ±0.074 | — | ~1.00x | ≈ | 62.9% | 50 |
| depth-1 wide | 0.776ms ±0.086 | 0.391ms ±0.046 | — | ~1.00x | ≈ | 42.4% | 50 |
| depth-1 no-limit Project→tasks | 12.80ms ±0.353 | 5.63ms ±0.234 | — | 2.27x | *** | 15.0% | 50 |
| depth-2 | 0.981ms ±0.109 | 0.642ms ±0.092 | — | ~1.00x | ≈ | 51.6% | 50 |
| depth-2 paginated | 0.686ms ±0.069 | 0.626ms ±0.085 | — | ~1.00x | ≈ | 49.2% | 50 |
| depth-2 high-fan | 0.921ms ±0.120 | 0.533ms ±0.053 | — | ~1.00x | ≈ | 35.9% | 50 |
| depth-2 wide+attach+activity | 1.27ms ±0.123 | 0.838ms ±0.127 | — | ~1.00x | ≈ | 54.8% | 50 |
| depth-2 no-limit | 20.25ms ±0.530 | 10.39ms ±0.478 | — | 1.95x | *** | 16.6% | 50 |
| depth-3 | 4.61ms ±0.262 | 2.40ms ±0.397 | — | 1.92x | *** | 59.5% | 50 |
| depth-3 paginated | 0.713ms ±0.057 | 1.48ms ±0.077 | — | ~1.00x | ≈ | 18.9% | 50 |
| depth-4 | 2.51ms ±0.160 | 1.23ms ±0.094 | — | 2.05x | *** | 27.6% | 50 |
| depth-4 paginated | 0.745ms ±0.054 | 1.74ms ±0.095 | — | ~1.00x | ≈ | 19.6% | 50 |
| findFirst depth-2 | 0.617ms ±0.082 | 0.367ms ±0.050 | — | ~1.00x | ≈ | 48.6% | 50 |
| findUnique depth-2 | 0.582ms ±0.049 | 0.335ms ±0.049 | — | ~1.00x | ≈ | 52.4% | 50 |
Обходите путь выполнения чтений Prisma, сохраняя API и типы
Расширение перехватывает операции чтения (findMany, findFirst, findUnique, count, aggregate, groupBy) до выполнения
Преобразует запросы Prisma в быстрый параметризованный SQL с оптимизированными JOIN
Выполняет запросы через postgres.js или better-sqlite3, обходя накладные расходы чтения Prisma
Результаты соответствуют ожидаемому формату Prisma. Типы, IntelliSense и существующий код запросов остаются без изменений
const users = await prisma.user.findMany({
where: { status: 'ACTIVE' },
include: { posts: true }
})
// Прямое выполнение SQL для чтений
// В бенчмарках около ~1.00ms на этой нагрузке
// Тот же код запросов Prisma Скорость ванильного SQL для чтений и всем полюбившийся пользовательский опыт Prisma
Одноразовая настройка ускоряет чтения Prisma. Без рефакторинга, миграции и простоев.
Весь вывод типов, автодополнение и безопасность времени компиляции сохраняются при ускорении чтений.
137 E2E-тестов подтверждают совместимость с актуальными версиями Prisma. Используется для ускорения чтений в продакшене.
Оптимизируйте чтения Prisma на PostgreSQL (включая Neon, Supabase) и SQLite.
Опциональный генератор создает SQL во время сборки, снижая накладные расходы до микросекунд для самых горячих запросов.
Работает в serverless Node-рантаймах. Поддержка Edge зависит от ограничений рантайма и выбранного драйвера.
Сценарии, где это расширение даёт реальный эффект
Агрегации и groupBy часто выигрывают от прямого выполнения SQL
Накладные расходы на запросы накапливаются под нагрузкой, особенно на чтениях
Каждая миллисекунда важна в serverless: снижайте задержку чтений
Пользователи замечают задержки: более быстрые чтения улучшают UX
Ускорьте чтения Prisma менее чем за 60 секунд
# PostgreSQL
npm install prisma-sql postgres
# SQLite
npm install prisma-sql better-sqlite3 import { PrismaClient, Prisma } from '@prisma/client'
import { speedExtension, convertDMMFToModels } from 'prisma-sql'
import postgres from 'postgres'
const sql = postgres(process.env.DATABASE_URL)
const models = convertDMMFToModels(Prisma.dmmf.datamodel)
const prisma = new PrismaClient().$extends(
speedExtension({ postgres: sql, models })
) const users = await prisma.user.findMany({
where: { status: 'ACTIVE' },
include: { posts: true }
}) Вопросы об оптимизации чтений Prisma
Prisma добавляет накладные расходы, потому что реализует гарантии API: валидацию по схеме, согласованное поведение запросов и формирование результата. Эти слои дают отличный DX, но стоят времени по сравнению с прямым выполнением SQL.
Оптимизируйте чтение в Prisma с помощью этого расширения. Оно выполняет чтения через прямой SQL (postgres.js или better-sqlite3), сохраняя API и типы Prisma. Нужна небольшая правка инициализации, без рефакторинга существующих запросов.
Во многих чтениях — да, из-за архитектурных накладных расходов. Это расширение помогает сохранить DX Prisma и снизить задержку чтений за счет прямого выполнения SQL.
Да. Добавьте расширение один раз при инициализации Prisma Client и оставьте существующий код запросов без изменений. Ускоряются чтения, при этом API, типы и схема остаются прежними.
Да. Есть 137 E2E-тестов и дизайн под продакшен. Перед раскаткой проверьте совместимость с вашей версией Prisma и прогоните собственные регрессионные тесты.
Агрегации и groupBy часто усиливают фиксированные накладные расходы (обработка запроса и формирование результата) и могут работать с большими промежуточными данными. Это расширение генерирует SQL напрямую и обычно снижает задержку на таких эндпоинтах.
Присоединяйтесь к разработчикам, ускорившим чтения Prisma: 2–7× (до 53.5×)