Производительность PostgreSQL: индекс столбца NOT NULL быстрее, чем столбец NOT NULL? - PullRequest
0 голосов
/ 17 октября 2019

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

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

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

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

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

0 голосов
/ 17 октября 2019

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

...