Настройка для bulk update/insert

ebonfortress
Дата: 18.02.2015 16:38:56
Есть рид-онли база, в которую время от времени заливаются апдейты (типа таблица 50 миллионов строк, вставить 1 миллион, поменять 10 миллионов, UPDATE items i SET name = ii.name FROM items_import ii WHERE i.id = ii.id, такой запрос). Апдейт дико тормозит. Как можно ускорить процесс, с учетом того, что надежность не нужна вообще?
Leonid Kudryavtsev
Дата: 25.02.2015 18:40:18
1. Вместо INSERT использовать COPY.
2. UPDATE мало того, что _будут_ тормозить, так еще в старых версиях (начало 2000) приводили к необходимости VACUM. В новых версиях не знаю.

Если "таблица 50 лямов, залить 1 лям и поменять 10" и время критично. Лично я бы подумал над тем, что бы взять C,Java etc, написать приложение. Все посчитать в приложении (оперативной памяти, каком нибудь хорошем и хитром контейнере, в общем, детали) и 50 лямов быстро, командой COPY залить в PostgreSQL.

IMHO
думаецца
Дата: 25.02.2015 18:51:50
Leonid Kudryavtsev
Лично я бы подумал над тем, что бы взять C,Java etc, написать приложение. Все посчитать в приложении (оперативной памяти, каком нибудь хорошем и хитром контейнере, в общем, детали) и 50 лямов быстро, командой COPY залить в PostgreSQL.
IMHO

можно на пустой базе даже в том же инстансе провести "расчет" выгрузкой SELECT в COPY -- это точно дешевле клиентского овна, но копи всем куском на табличке с триггерами тоже не подарок.


т.ч. проще всего -- написать в соседней базёнке того же интсанса нарезалку на батчи, и запустит dblink батчики на обработку. Примерно - по 1000 -- 10000 операций. (длинная транзакция висит в стороне - не лочит вакуумы в БД назначения и прочее)
Ivan Durak
Дата: 26.02.2015 00:46:40
ebonfortress
Есть рид-онли база, в которую время от времени заливаются апдейты (типа таблица 50 миллионов строк, вставить 1 миллион, поменять 10 миллионов, UPDATE items i SET name = ii.name FROM items_import ii WHERE i.id = ii.id, такой запрос). Апдейт дико тормозит. Как можно ускорить процесс, с учетом того, что надежность не нужна вообще?


create table temp as
select coalesce(ii.name, i.name) from items i
left join items_import ii on i.id = ii.id

потом дропнуть items и переименовать items_import в items