Skip to content

JS-AK/db-orm-benchmarks

Repository files navigation

db-orm-benchmarks for PostgreSQL 16.x

!NB Prisma connection options for stable work: schema=public&connection_limit=10&pool_timeout=20

Select data by await Promise.all()

50_000 queries in await Promise.all() ("SELECT email FROM users WHERE users.id = $1") with random users.id

10 separately times

┌───────────────────┬───────────────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬───────────┐
│ orm db            │ avg query per sec |   1     │   2     │   3     │   4     │   5     │   6     │   7     │   8     │   9     │  10     │ avg       │
├───────────────────┼───────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────┤
│ pg.pool           | 10087             |  4997ms |  4970ms |  4972ms |  4962ms |  4926ms |  4954ms |  4944ms |  4932ms |  4946ms |  4967ms |  4957.0ms |
│ drizzle-orm       |  8614             |  5810ms |  5799ms |  5783ms |  5832ms |  5815ms |  5790ms |  5795ms |  5802ms |  5812ms |  5808ms |  5804.6ms |
│ @js-ak/db-manager |  9648             |  5211ms |  5184ms |  5186ms |  5196ms |  5170ms |  5175ms |  5171ms |  5176ms |  5170ms |  5184ms |  5182.3ms |
│ @prisma/client    | 16432             |  3152ms |  3008ms |  2999ms |  2966ms |  3027ms |  3269ms |  2998ms |  3007ms |  2996ms |  3006ms |  3042.8ms |
│ sequelize         |  8335             |  6001ms |  6098ms |  5944ms |  5993ms |  6006ms |  6007ms |  6056ms |  5954ms |  5926ms |  6003ms |  5998.8ms |
│ typeorm           |  7923             |  6306ms |  6292ms |  6298ms |  6256ms |  6355ms |  6346ms |  6324ms |  6307ms |  6295ms |  6328ms |  6310.7ms |
│ mikro-orm         |  6921             |  7239ms |  7230ms |  7222ms |  7287ms |  7194ms |  7170ms |  7268ms |  7140ms |  7243ms |  7248ms |  7224.1ms |
│ objection.js      |  7481             |  6714ms |  6629ms |  6634ms |  6705ms |  6748ms |  6689ms |  6765ms |  6723ms |  6631ms |  6594ms |  6683.2ms |
│ kysely            |  9291             |  5368ms |  5375ms |  5382ms |  5429ms |  5383ms |  5360ms |  5365ms |  5411ms |  5383ms |  5361ms |  5381.7ms |
└───────────────────┴───────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────────┘

Select data by await one by one in for loop

50_000 queries in await one by one in for loop ("SELECT email FROM users WHERE users.id = $1") with random users.id

10 separately times

┌───────────────────┬───────────────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬───────────┐
│ orm db            │ avg query per sec |   1     │   2     │   3     │   4     │   5     │   6     │   7     │   8     │   9     │  10     │ avg       │
├───────────────────┼───────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────┤
│ pg.pool           | 10007             |  5014ms |  5021ms |  5004ms |  5013ms |  4980ms |  5004ms |  4979ms |  4987ms |  4988ms |  4976ms |  4996.6ms |
│ drizzle-orm       |  9225             |  5512ms |  5440ms |  5507ms |  5463ms |  5398ms |  5292ms |  5465ms |  5385ms |  5396ms |  5341ms |  5419.9ms |
│ @js-ak/db-manager |  9594             |  5202ms |  5173ms |  5201ms |  5222ms |  5232ms |  5225ms |  5213ms |  5245ms |  5207ms |  5196ms |  5211.6ms |
│ @prisma/client    |  3570             | 13870ms | 13835ms | 13563ms | 14639ms | 14252ms | 14173ms | 14054ms | 14199ms | 13641ms | 13824ms | 14005.0ms |
│ sequelize         |  8343             |  5956ms |  6001ms |  6026ms |  5996ms |  5956ms |  6020ms |  5983ms |  6035ms |  5961ms |  5994ms |  5992.8ms |
│ typeorm           |  7895             |  6410ms |  6342ms |  6324ms |  6296ms |  6342ms |  6323ms |  6364ms |  6292ms |  6320ms |  6316ms |  6332.9ms |
│ mikro-orm         |  6887             |  7135ms |  7302ms |  7318ms |  7225ms |  7251ms |  7277ms |  7297ms |  7256ms |  7249ms |  7291ms |  7260.1ms |
│ objection.js      |  8622             |  5875ms |  5805ms |  5779ms |  5732ms |  5792ms |  5779ms |  5863ms |  5726ms |  5823ms |  5816ms |  5799.0ms |
│ kysely            |  9230             |  5435ms |  5421ms |  5430ms |  5398ms |  5390ms |  5418ms |  5415ms |  5438ms |  5416ms |  5410ms |  5417.1ms |
└───────────────────┴───────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────────┘

Insert data in one transaction

50_000 users

10 separately times

┌───────────────────┬───────────────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬───────────┐
│ orm db            │ avg query per sec |   1     │   2     │   3     │   4     │   5     │   6     │   7     │   8     │   9     │  10     │ avg       │
├───────────────────┼───────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────┤
│ pg.pool           |  8195             |  9542ms |  5815ms |  5713ms |  5663ms |  5672ms |  5721ms |  5753ms |  5671ms |  5709ms |  5751ms |  6101.0ms |
│ drizzle-orm       |  6627             | 10453ms |  7060ms |  7145ms |  7391ms |  7223ms |  7264ms |  7238ms |  7126ms |  7318ms |  7229ms |  7544.7ms |
│ @js-ak/db-manager |  7580             | 11116ms |  6138ms |  6019ms |  5952ms |  6065ms |  6181ms |  6101ms |  6087ms |  6143ms |  6164ms |  6596.6ms |
│ @prisma/client    |  2686             | 22418ms | 18208ms | 18486ms | 17819ms | 18024ms | 18045ms | 18296ms | 18650ms | 17735ms | 18461ms | 18614.2ms |
│ typeorm           |  6106             | 11839ms |  7743ms |  7600ms |  7752ms |  7739ms |  7790ms |  7912ms |  7912ms |  7814ms |  7784ms |  8188.5ms |
└───────────────────┴───────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────────┘

Insert data by await Promise.all()

50_000 users

10 separately times

┌───────────────────┬───────────────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬───────────┐
│ orm db            │ avg query per sec |   1     │   2     │   3     │   4     │   5     │   6     │   7     │   8     │   9     │  10     │ avg       │
├───────────────────┼───────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼───────────┤
│ pg.pool           |  9128             |  6824ms |  5273ms |  5280ms |  5348ms |  5297ms |  5318ms |  5348ms |  5315ms |  5407ms |  5366ms |  5477.6ms |
│ drizzle-orm       |  4376             | 13587ms | 11201ms | 11122ms | 10958ms | 10749ms | 11337ms | 11203ms | 10785ms | 11319ms | 12003ms | 11426.4ms |
│ @js-ak/db-manager |  8235             |  7578ms |  5852ms |  5912ms |  5810ms |  5884ms |  5960ms |  5844ms |  5807ms |  5852ms |  6216ms |  6071.5ms |
│ @prisma/client    |  9910             |  7026ms |  4883ms |  4771ms |  4725ms |  4876ms |  4797ms |  4836ms |  4910ms |  4848ms |  4780ms |  5045.2ms |
│ typeorm           |  5073             | 11490ms |  9835ms |  9697ms |  9753ms |  9588ms |  9656ms |  9577ms |  9665ms |  9719ms |  9575ms |  9855.5ms |
└───────────────────┴───────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────────┘