Импортиране на групови данни на Postgres и попълване на асоциирани данни

Имам база данни на Postgres, която се актуализира от различни външни източници няколко пъти на ден и всеки запис има полета като company_id и user_id, които трябва да бъдат потърсени от съществуваща таблица и запазени със записа. В момента използвам Ruby, за да прегледам новите записи и да получа идентификаторите на компанията и потребителя със заявка за ActiveRecord. Това обаче е ужасно неефективно.

Какъв е ефикасен метод за това? Може ли да се направи с JOIN заявка при актуализация?


person Avishai    schedule 07.06.2013    source източник
comment
Моля, покажете дефинициите на таблицата и заявките. В противен случай има твърде много догадки. винаги трябва да споменавате вашите версии (PostgreSQL, Ruby и т.н.) във въпросите. Покажете и вие какво вече правите. (Отговорете тук, след като редактирате и аз ще разгледам).   -  person Craig Ringer    schedule 08.06.2013


Отговори (1)


зависи от това как зареждате данните, ако ги заредите с "copy", тогава не можете да ги търсите по време на процеса на импортиране. Имам същата ситуация тук, ето как го правя:

1) импортирайте данни в таблица IMPORT

\copy importtable (companyname, what, ever, i , need) from 'FILE' WITH DELIMITER AS ';' CSV HEADER;

2) тази стъпка е необходима, ако импортирате нови компании/потребители, които вече нямат съществуващ идентификатор. прави запитвания към компаниите без ID и създава нови ID

INSERT INTO company (companyid,companyname)
SELECT  companyname
FROM importtable
        LEFT OUTER JOIN company ON (importtable.companyname=company.companyname)
WHERE company.companyid is NULL
GROUP BY companyname;

3) вмъкнете цялата таблица за импортиране в таблицата за консолидиране

INSERT INTO consolidationable(companyid, what,ever,you,need )
SELECT companyid, what,ever,you,need
  FROM importtable
        INNER JOIN company ON (importtable.companyname=company.companyname);

Хубавото е, че използва COPY, така че самото импортиране е бързо, и след това използва всички буфери, защото postgreSQL може да прави заявки за всички фирмени идентификатори наведнъж. може да работи много паралелно, когато създавате няколко таблици за импортиране.

person Chris    schedule 08.06.2013