Выпустив 1000 операторов вставки, вы получите 1000 обращений в базу данных. Это занимает довольно много времени (задержка сети и планирования). Поэтому постарайтесь уменьшить количество операторов вставки!
Допустим, вы хотите:
insert into test_table(item, count) values (1000, 10);
insert into test_table(item, count) values (1001, 20);
insert into test_table(item, count) values (1002, 30);
Преобразуйте его в один запрос, и запросу потребуется менее половины времени:
insert into test_table(item, count) values (1000, 10), (1001, 20), (1002, 30);
В PostgreSQL есть еще один способ написать это:
insert into test_table(item, count) values (
unnest(array[1000, 1001, 1002])
unnest(array[10, 20, 30]));
Моя причина для представления второго способа заключается в том, что вы можете передать все содержимое большого массива в одном параметре (протестировано в C # с драйвером базы данных "Npgsql"):
insert into test_table(item, count) values (unnest(:items), unnest(:counts));
items
- это параметр запроса со значением int[]{100, 1001, 1002}
counts
- параметр запроса со значением int[]{10, 20, 30}
Сегодня я сократил время выполнения 10 000 вставок в C # с 80 до 550 мс с помощью этой техники. Это просто. Кроме того, с транзакциями не возникает проблем, поскольку один оператор никогда не разделяется на несколько транзакций.
Надеюсь, это работает и с драйвером Qt PostgreSQL. На стороне сервера вам нужен PostgreSQL> = 8.4., Поскольку более старые версии не предоставляют unnest
(но могут быть обходные пути).