2011-12-19 6 views
0

Я использую postgres 9.X. У меня есть две таблицыГруппа Postgres по обновлению - медленный запрос

Table A 
(
id integer 
); 

Table B 
(
id integer, 
Value integer 
); 

Обе таблицы индексируются по идентификатору.

Таблица A может иметь дубликат идентификаторы

Example: 
Table A 
ID 
1 
1 
1 
2 
1 

Я намерен ввести число вхождений ID в таблицу В (Эта таблица содержит все идентификаторы, которые находятся в таблице A, но значение равно 0, первоначально)

Table B 
ID  Value 
1   4 
2   1 
3   0 
4   0 

Вот мой SQL заявление

update tableB set value = value + sq.total 
from 
(select id, count(*) as total from TableA group by id) as sq 
where sq.id = tableB.id; 

С 3-10 миллионов записей в TableA, это та король ужасное количество времени. Я могу оптимизировать этот запрос?

+0

У вас есть - for istance - индекс b-дерева в первом индексе таблицы? Может быть, это поможет вам. – DonCallisto

+0

Привет, у меня есть индекс B-дерева на «id» в обеих таблицах. – KarthikRajagopal

+0

Это была моя единственная идея ... Я не знаю, как вы можете улучшить время работы ... Извините – DonCallisto

ответ

1

Нужно ли вам tableB быть заселенным? INSERT...SELECT из tableA в пустой tableB (без индексов на tableB) должен быть быстрее:

insert into tableb (id, value) 
select id, count(*) 
from tablea 
group by id 

, а затем добавить свои индексы для tableB когда данные есть.

+0

Я сократил время обновления, уменьшив размер столбца от целого до char. Благодаря! – KarthikRajagopal