Это всегда хороший идеал, чтобы столбцы не были равны NULL, если вы можете избежать этого, потому что семантика использования очень грязная; см. Что такое NULL? , чтобы обсудить, как они могут привести к неприятностям.
В версиях PostgreSQL до 8.2 программное обеспечение не знало, как выполнять сравнения по наиболее распространенному индексу типов (b-дереву) таким образом, чтобы в них можно было найти значения NULL. В соответствующем бите документации по типам индексов вы можете увидеть, что описано как "но обратите внимание, что IS NULL не эквивалентно = и не индексируется". Недостатком этого является то, что если вы укажете запрос, который требует включения значений NULL, планировщик может не выполнить его, используя очевидный индекс для этого случая. В качестве простого примера, если у вас есть оператор ORDER BY, который можно ускорить с помощью индекса, но ваш запрос также должен возвращать значения NULL, оптимизатор не может использовать этот индекс, поскольку в результате будут отсутствовать любые данные NULL - и поэтому будьте неполными и бесполезными. Оптимизатор знает об этом и вместо этого будет выполнять неиндексированное сканирование таблицы, что может быть очень дорогим.
PostgreSQL улучшил это в 8.3 , «условие IS NULL для столбца индекса может использоваться с индексом B-дерева». Таким образом, ситуации, когда вы можете сжечь, пытаясь проиндексировать что-либо со значениями NULL, были уменьшены. Но так как семантика NULL все еще очень болезненна, и вы можете столкнуться с ситуацией, когда даже планировщик 8.3 не делает того, что вы ожидаете из-за них, вам все равно следует использовать NOT NULL, когда это возможно, чтобы снизить ваши шансы на выполнение плохо оптимизированного запроса. .