У меня есть запрос вида:
select m.id from mytable m
left outer join othertable o on o.m_id = m.id
and o.col1 is not null and o.col2 is not null and o.col3 is not null
where o.id is null
Запрос возвращает несколько сотен записей, хотя в таблицах миллионы строк, и на его выполнение уходит вечность (около часа).
Когда я проверяю статистику своего индекса, используя:
select * from pg_stat_all_indexes
where schemaname <> 'pg_catalog' and (indexrelname like 'othertable_%' or indexrelname like 'mytable_%')
Я вижу, что используется только индекс для othertable.m_id, и что индексы для col1..3 вообще не используются. Почему это?
Я прочитал в нескольких местах , что PG традиционно не может индексировать значения NULL. Тем не менее, я читал, что это предположительно изменилось с PG 8.3? В настоящее время я использую PostgreSQL 8.4 в Ubuntu 10.04. Нужно ли создавать «частичный» или «функциональный» индекс специально для ускорения запросов IS NOT NULL или он уже индексирует NULL, и я просто неправильно понимаю проблему?