Thread: не работает индекс по таблице
Приветствую! Имеем несколько действий: 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 так сильно ошибается? -- У каждого в башке свои тараканы...
>>>>> 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
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 (). в-общем, от чего ушли к тому и пришли $) -- У каждого в башке свои тараканы...