Производительность PostgreSQL: индекс для столбца NOT NULL быстрее, чем столбец NOT NULL?

В производственной таблице из пары десятков миллионов записей мы обнаружили, что у нас есть (индексированный) строковый столбец, который в логике домена никогда не равен NULL. Однако в настоящее время этот столбец не обязательно должен иметь значение NOT NULL в схеме.

Теперь нам интересно: есть ли разница в производительности между запросом индексированного столбца (разрешен NULL) и индексированного столбца NOT NULL? Или это не имеет большого значения? Отличается ли способ хранения (/может быть) индекса внутри Postgres в этих двух случаях?


person Qqwy    schedule 17.10.2019    source источник
comment
Я не верю, что в индексе b-дерева есть какая-то разница в производительности. Postgres все равно выделяет значения NULL в индексе. Если их нет, то часть заголовка будет пустой.   -  person Gordon Linoff    schedule 17.10.2019


Ответы (2)


Нет, это совершенно неважно. Специальной обработки значений NULL в индексах не предусмотрено. Единственным исключением является то, что индекс UNIQUE может содержать несколько индексов NULL, но это не влияет на производительность.

person Laurenz Albe    schedule 17.10.2019

Индекс содержит список значений указанного столбца (столбцов). Если в столбце есть значения NULL, они не будут включены в индекс. Ограничение NOT NULL — это просто определение того, что разрешено в таблице, и оно не влияет на производительность сканирования индекса (если, конечно, схема плохо спроектирована и вы указываете NOT NULL для столбца, а затем ставите значения 0 или 'undefined` во всем этом столбце, когда вы не должны этого делать - это дополнит индекс кучей бесполезных значений).

Короче говоря, NOT NULL просто ограничивает типы значений, которые идут в таблицу, а не в индекс, поэтому производительность индекса в целом не пострадает.

person richyen    schedule 17.10.2019