2013-03-27 4 views
1

У меня есть таблица 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 только одна запись, она, кажется, принимает навсегда.

Что я делаю неправильно?

+0

Есть ли указатель на my_obj.id? – Gerrat

+0

Вы случайно попытались запустить второе обновление, пока первый был запущен? –

+0

@Gerrat в первичном ключе postgresql автоматически индексирует, так что да. –

ответ

3

Как это работает для вас?

update my_obj o 
set id_pair = p.id 
from pair p 
where p.value_a = o.value_a and 
     p.value_b = o.value_b and 
     o.id = 1234567; 
+0

это мгновенно ... –

+0

@StephaneRolland Пожалуйста, примите ответ, когда SO позволит вам. –

Смежные вопросы