Переиндексация. Подскажите как лучше сделать?

fixxxer

К.О.
Партнер клуба
Тоже не понял наездов на PG. Даже комментировать не хочется -__-
UPSERT, MERGE, REPLACE нет по тем же причинам, по которым "оно чудесным образом будет работать в 3-4 раза быстрее".
чочочочочочочочочо?

по каким причинам их нет, можно посмотреть в обсуждениях про просранный GSoC :)

но учитывая изменения в 9.1, позволяющие делать writeable expressions, основной шаг сделан

P.S. про оракл - это несерьезно
 

DiMA

php.spb.ru
Команда форума
~WR~, ты бы читал внимательно, что я написал:

> INSERT с повтором ключа вызовет срачь в логи

Я согласен на простейший INSERT. Но мне нужно, чтобы при вставке уже существующего ключа вернули бы просто FALSE, а не срачь в логи. Это возможно? Или срачь в логи (на медленный hdd) как раз и делает pg намного более быстрым? Или мне нужно делать select перед каждым insert?

> Sad Spirit
> Не очень честный подход, когда свою порцию рвотных пакетиков ты вываливаешь в одной теме, а ответную "просишь" в другую.

Спасибо за комменты. Я написал собственные очучения от ПОВЕРХНОСТНОГО ознакомления с неким продуктом, в поисках более быстрого инструмента выполнить свою задачу. Попробовал, удивился ущербности, порадовался результатам, сообщил всем. Ничего нечестного здесь нет. Если вы привыкли к ущербности и не считаете ее таковой - я очень рад. Со временем тоже привыкну и разберусь тщательнее.
 

~WR~

Новичок
PHP:
INSERT INTO table (name)
SELECT 'DiMA' WHERE NOT EXISTS (SELECT * FROM table WHERE name='DiMA')
Просто INSERT. Будет добавлена новая запись, если она еще не существует.
Проверить успех можно через pg_affected_rows.
 

DiMA

php.spb.ru
Команда форума
А все же, знатоки pg под хайлодом, какой из методов сделать изменение более эффективен?

Бывает 2 ситуации
а) записи, как правило, всегда существуют, поэтому мы сначала делаем UPDATE, а если не найдено - INSERT (если вдруг кто-то опередил - опять UPDATE и так по кругу до бесконечности, нахваливая продуманную атомарность операций в пг)
б) записи, как правило, не существует, поэтому сначала делает INSERT, если если ошибка повтора ключа - UPDATE (если вдруг кто-то опередил и сделал DELETE, то опять в круг)
+от INSERT не должно быть записей в лог с ошибкой (либо логи вообще придется отключить, в силу кол-ва такого спама)

fixxxer на пред. странице написал совет (я еще не изучал тему, поэтому не понимаю написанного), ~WR~ воткнул мега запрос с подзапросами.. Что делать то лучше для нагружнной таблички?
 

~WR~

Новичок
Моё мнение: не надо мудрить. Два простых запроса:
PHP:
UPDATE table SET name='new_name' WHERE id=1;

INSERT INTO table (id, name)
SELECT 1, 'new_name' WHERE NOT EXISTS (SELECT * FROM table WHERE id=1);
Если данные чаще не существуют, то делаем наоборот insert перед update.
Если первый из запросов успешен, то второй не выполняем вовсе.
В большинстве случае на первом запросе все и будет заканчиваться.

Подзапрос не страшный)) Думаю, mysql тоже делает проверку на существование ключа. Просто здесь она вынесена в явном виде.

Если нужно загрузить за один раз много данных, то можно поступить следующим образом:

1. Создать временную таблицу с той же структурой (CREATE TABLE TEMP temp_table LIKE orig_table).
2. Импортировать в неё данные командой COPY (это самый быстрый способ импорта).
3. Выполнить один большой update и один большой insert, используя join между оригинальной таблицей и временной.
 
Сверху