Skip to content

Commit dbbe95b

Browse files
committed
Как ускорить добавление строк через INSERT ... VALUES ...?
1 parent 655655f commit dbbe95b

File tree

1 file changed

+31
-0
lines changed

1 file changed

+31
-0
lines changed

README.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
**[Модификация пользовательских данных (DML)](#модификация-пользовательских-данных-dml)**
6969
1. [Как добавить или обновить записи одним запросом (UPSERT)?](#как-добавить-или-обновить-записи-одним-запросом-upsert)
7070
1. [Как сделать `INSERT ... ON CONFLICT ...` без увеличения последовательности для дубликатов?](#как-сделать-insert--on-conflict--без-увеличения-последовательности-для-дубликатов)
71+
1. [Как ускорить добавление строк через `INSERT ... VALUES ...`?](как-ускорить-добавление-строк-через-insert-values)
7172
1. [Как модифицировать данные в нескольких таблицах и вернуть id затронутых записей в одном запросе?](#как-модифицировать-данные-в-нескольких-таблицах-и-вернуть-id-затронутых-записей-в-одном-запросе)
7273
1. [Как модифицировать данные в связанных таблицах одним запросом?](#как-модифицировать-данные-в-связанных-таблицах-одним-запросом)
7374
1. [Как добавить запись с id, значение которого нужно сохранить ещё в другом поле в том же INSERT запросе?](#как-добавить-запись-с-id-значение-которого-нужно-сохранить-ещё-в-другом-поле-в-том-же-insert-запросе)
@@ -1242,6 +1243,36 @@ returning id;
12421243
table t1_id_seq; -- "last_value" is 3
12431244
```
12441245

1246+
### Как ускорить добавление строк через `INSERT ... VALUES ...`?
1247+
1248+
Вместо запроса типа
1249+
1250+
```sql
1251+
INSERT INTO t1 (col1, col2, col3)
1252+
VALUES
1253+
($1, $2, $3),
1254+
($4, $5, $6),
1255+
...,
1256+
($2998, $2999, $3000);
1257+
```
1258+
1259+
используйте запрос
1260+
```sql
1261+
INSERT INTO t1 (col1, col2, col3)
1262+
SELECT *
1263+
FROM unnest(
1264+
$1::timestamptz[],
1265+
$2::text[],
1266+
$3::float8[]
1267+
)
1268+
```
1269+
1270+
Трюк в том, что на `INSERT VALUES` тратится много времени на планирование запроса (обрабатывается каждое значение), а на `INSERT UNNEST` нет.
1271+
1272+
Детальная информация:
1273+
* https://www.timescale.com/blog/boosting-postgres-insert-performance
1274+
* https://www.timescale.com/blog/benchmarking-postgresql-batch-ingest
1275+
12451276
### Как модифицировать данные в нескольких таблицах и вернуть id затронутых записей в одном запросе?
12461277

12471278
```sql

0 commit comments

Comments
 (0)