|
68 | 68 | **[Модификация пользовательских данных (DML)](#модификация-пользовательских-данных-dml)** |
69 | 69 | 1. [Как добавить или обновить записи одним запросом (UPSERT)?](#как-добавить-или-обновить-записи-одним-запросом-upsert) |
70 | 70 | 1. [Как сделать `INSERT ... ON CONFLICT ...` без увеличения последовательности для дубликатов?](#как-сделать-insert--on-conflict--без-увеличения-последовательности-для-дубликатов) |
| 71 | + 1. [Как ускорить добавление строк через `INSERT ... VALUES ...`?](как-ускорить-добавление-строк-через-insert-values) |
71 | 72 | 1. [Как модифицировать данные в нескольких таблицах и вернуть id затронутых записей в одном запросе?](#как-модифицировать-данные-в-нескольких-таблицах-и-вернуть-id-затронутых-записей-в-одном-запросе) |
72 | 73 | 1. [Как модифицировать данные в связанных таблицах одним запросом?](#как-модифицировать-данные-в-связанных-таблицах-одним-запросом) |
73 | 74 | 1. [Как добавить запись с id, значение которого нужно сохранить ещё в другом поле в том же INSERT запросе?](#как-добавить-запись-с-id-значение-которого-нужно-сохранить-ещё-в-другом-поле-в-том-же-insert-запросе) |
@@ -1242,6 +1243,36 @@ returning id; |
1242 | 1243 | table t1_id_seq; -- "last_value" is 3 |
1243 | 1244 | ``` |
1244 | 1245 |
|
| 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 | + |
1245 | 1276 | ### Как модифицировать данные в нескольких таблицах и вернуть id затронутых записей в одном запросе? |
1246 | 1277 |
|
1247 | 1278 | ```sql |
|
0 commit comments