Приветствую!
Имеем несколько действий:
drop table t1;
select post_addresses_id into t1 from persons where $условие;
create index t1_ on t1 (post_addresses_id);
select count(*) from addresses where
exists ( select addresses_id from t1 where
addresses.addresses_id=t1.post_addresses_id)
на самом деле, в последнем запросе вместо select count(*) нужно делать
удаление, но для проверки я использовал именно этот вариант, ибо оба они
выполняются одного порядка времени.
так вот, если все написано так как есть, то последний запрос выполняется
около 8 секунд (у меня небольшой, тестовый набор данных) и по обоим
таблицам идет seq_scan.
если же поменять местами две таблицы, т.е.:
select count(*) from t1 where
exists ( select addresses_id from addresses where
addresses.addresses_id=t1.post_addresses_id)
то запрос пробегается за 40 мс и по таблице addresses подхватывается
индекс. Но ведь удалять-то надо именно из addresses, и такой вариант
условия exists уже не подходит $)
решение было найдено:
set enable_seqscan=false;
вот только возник вопрос, правильно ли что PostgreSQL так сильно ошибается?
--
У каждого в башке свои тараканы...