У меня есть таблица my_obj
с двумя полями value_a varchar(5)
и value_b varchar(5)
Обновление запроса принимает навсегда
Действительно эти два значения не изменяются так много, и могут быть сгруппированы в паре. В лучшем случае это дает максимальное количество < 100 пар. Наоборот, у меня есть несколько миллионов записей в my_obj
.
Все запросы, мешающие value_a
и value_b
, занимают очень много времени. Поэтому я решил создать парную таблицу для всех возможных пар, с полями value_a
и value_b
. И поэтому я добавил поле id_pair в таблицу my_obj
.
Я уже заполнил таблицу со всеми ее парами, это нормально. Итак, теперь, я хотел, чтобы обновить таблицу my_obj
соответственно с этой командой:
update my_obj
set id_pair = p.id
from my_obj as o
inner join pair as p on p.value_a = o.value_a and p.value_b = o.value_b;
Хотя запрос был запущен в течение длительного времени, я запустить select count(*) from my_obj where id_pair > 0;
и он вернулся мне 0
Так была проблема в моем запросе обновления. EDIT/N.B.: функции plpgsql, которые являются единицами транзакции, выполняют фиксацию в конце транзакции, поэтому было полностью нормальным, что я не видел изменений в таблице, так как я перепутал эту функцию.
Я изменил запрос на обновление с критериями по первичному ключу my_obj
, чтобы выполнить только один update
только с одной записью.
update my_obj
set id_pair = p.id
from my_obj as o
inner join pair as p on p.value_a = o.value_a and p.value_b = o.value_b
where o.id = 1234567; -- 1234567 being the key of an existing record
Поразительно, когда я начал этот запрос, который должен update
только одна запись, она, кажется, принимает навсегда.
Что я делаю неправильно?
Есть ли указатель на my_obj.id? – Gerrat
Вы случайно попытались запустить второе обновление, пока первый был запущен? –
@Gerrat в первичном ключе postgresql автоматически индексирует, так что да. –