Xpoint
   [напомнить пароль]

[PostgreSql] Запрос из двух таблиц с исключением

Метки: [без меток]
2004-11-29 08:02:47 [обр] Туговиков Станислав(0/14)[досье]

Задача в принципе аналогичная этой http://phpclub.ru/talk/showthread.php?s=&threadid=50497&rand=12 . Нужно из одной таблицы взять данные отсутвующие во второй и положить в эту вторую. Т.е. что то типа
INSERT INTO b (SELECT * FROM a WHERE a.id != b.id) или INSERT INTO b (SELECT * FROM a WHERE a.id NOT IN (b.id))

Вся проблема в том что в одной таблице примерно 55 000 записей, а в другой примерно 105 000. Т.е. приведенный выше запрос будет выполнятся довольно долго

спустя 1 час 34 минуты [обр] Сергей Сирик(41/737)[досье]

А вы его через промежуточную таблицу какую-то сделайте - должно быстрей получиться, за счет отсутсвия блокировок, связанных со вставкой в таблицу, по которой выполняется сравнение.

Приведенные запросы совсем неправильны кстати.

Как вариант можно попробовать
insert into b
select a.*
from a
left join b on a.id=b.id
where b.id is null

может в Постгрессе будет быстрей работать чем IN, хотя по идее не должно.

спустя 1 час 43 минуты [обр] Денис Гетман(5/228)[досье]
 Только пробовать разные варианты и смотреть. В старых версиях постгресса IN не очень быстро работал.
 Как вариант, выгрузить с объединением во временную таблицу, b стереть, временную таблицу переименовать в b.
 Или уникальный ключ поставить на b.id и просто скопировать все.
 А что, такая операция очень часто будет проводиться? Может, логику действий проверить?
спустя 24 минуты [обр] Туговиков Станислав(0/14)[досье]

Да, уникальный ключ стоит.

Скорее всего я в php отберу нужные записи, так как эта синхронизация будет производится не чаще чем раз в неделю.

спустя 1 час 3 минуты [обр] Евгений Бондарев aka Eugene Bond(11/1600)[досье]
Туговиков Станислав[досье]
Лучше через временную таблицу, чем через скрипт
спустя 1 час 38 минут [обр] Денис Гетман(5/228)[досье]
 Раз в неделю ее можно сделать как угодно, особенно если ночью скрипт запускать. Он по-любому будет минуту максимум работать.
 А может лучше триггер написать, чтобы он по вставке в одну таблицу, заполнял другую? Хотя, конечно, это притормозит саму вставку, так что все зависит от задачи.
спустя 2 минуты [обр] Туговиков Станислав(0/14)[досье]
Это таблицы с пользователями в разных базах данных, хотя и на одной машине и программа одна (PostgreSQL 7.4). В базах контент двух наших проектов, в частности у каждого есть таблица с пользователями/подписчиками на новости. Рассылка новостей осуществляется только с одного из проектов, соответсвенно небходимо из второго проекта дергать пользователей, которые подписались на новости этих проектов. Я планировал дернуть таблицу с пользователями из одного из проектов с помощью pg_dump, закачать ее в какую то временную таблицу второго проекта. И потом уже с помощью SQL запросов скопировать пользователей отсутвующих во второй базе.
спустя 58 секунд [обр] Туговиков Станислав(0/14)[досье]
Да, фокус еще и в том что не все столбцы в этих таблицах совпадают.
Powered by POEM™ Engine Copyright © 2002-2005