Thread: не работает индекс по таблице

не работает индекс по таблице

From
Genix
Date:
Приветствую!

Имеем несколько действий:

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 так сильно ошибается?

--
У каждого в башке свои тараканы...

Re: не работает индекс по

From
Sergey Suleymanov
Date:
>>>>> Genix  writes:

 Genix> решение было найдено: set enable_seqscan=false;

 Genix> вот только возник вопрос, правильно ли что PostgreSQL так
 Genix> сильно ошибается?

 Genix> -- У каждого в башке свои тараканы...

        Вот именно. :) VACUUM ANALIZE не помогает? Или попробуйте
        что-то вроде

SELECT count(*) FROM addresses
   WHERE addresses.addresses_id IN (SELECT addresses_id FROM t1)

--
  Sergey Suleymanov

Re: не работае

From
Genix
Date:
Sergey Suleymanov wrote:

>  Genix> решение было найдено: set enable_seqscan=false;
>
>  Genix> вот только возник вопрос, правильно ли что PostgreSQL так
>  Genix> сильно ошибается?
>
>  Genix> -- У каждого в башке свои тараканы...
>
>         Вот именно. :) VACUUM ANALIZE не помогает?

нет.
однако одно радует, что в бета-версии 8.1 этот же запрос на этих же
данных трудностей не вызывает $)


> Или попробуйте что-то вроде
>
> SELECT count(*) FROM addresses
>    WHERE addresses.addresses_id IN (SELECT addresses_id FROM t1)

так потому и уходили от select where in (select ) потому как медленно. И
даже в сети есть статьи, в которых говориться об оптимизации этой
структуры через select exists ().
в-общем, от чего ушли к тому и пришли $)


--
У каждого в башке свои тараканы...