У меня есть запрос формы:
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. Мне нужно сделать "частичный" или "функциональный" индекс специально для ускорения запросов NOT NOT, или это уже индексирование NULL, и я просто не понимаю проблему?