В PostgreSQL документы для ограничений говорится
Не-нулевое ограничение функционально эквивалентно созданию проверочного ограничения
CHECK (column_name IS NOT NULL)
, но в PostgreSQL создание явного ненулевого ограничения более эффективно.
мне любопытно
- Что именно означает «более эффективный»?
- Каковы недостатки использования
CHECK (column_name IS NOT NULL)
вместоSET NOT NULL
?
Я хочу иметь возможность добавлять NOT VALID
CHECK
ограничение и проверять его отдельно (поэтому AccessExclusiveLock
оно удерживается только в течение короткого периода времени для добавления ограничения, а затем ShareUpdateExclusiveLock
удерживается для более длинного шага проверки):
ALTER TABLE table_name
ADD CONSTRAINT column_constraint
CHECK (column_name IS NOT NULL)
NOT VALID;
ALTER TABLE table_name
VALIDATE CONSTRAINT column_constraint;
Вместо того:
ALTER TABLE table_name
ALTER COLUMN column_name
SET NOT NULL;
postgresql
postgresql-9.5
check-constraints
Робин Джозеф
источник
источник
not in
с обоими вариантами? Они одинаковые или отличаются?Ответы:
Моя дикая догадка: «более эффективный» означает «требуется меньше времени для выполнения проверки» (преимущество во времени). Это также может означать, что для выполнения проверки требуется меньше памяти (преимущество пространства). Это также может означать «имеет меньше побочных эффектов» (например, не блокировать что-либо или блокировать его на более короткие промежутки времени) ... но у меня нет способа узнать или проверить это «дополнительное преимущество».
Я не могу придумать простой способ проверить возможное космическое преимущество (которое, я думаю, не так важно, когда память сегодня дешева). С другой стороны, это не так сложно проверить на возможное преимущество во времени: просто создайте две одинаковые таблицы, с единственным исключением из ограничения. Вставьте достаточно большое количество строк, повторите несколько раз и проверьте время.
Это настройка таблицы:
Это дополнительная таблица, используемая для хранения таймингов:
И это тест, выполненный с использованием pgAdmin III и функции pgScript .
Результат суммируется в следующем запросе:
Со следующими результатами:
График значений показывает важную изменчивость:
Таким образом, на практике CHECK (столбец IS NOT NULL) очень немного медленнее (на 0,5%). Однако это небольшое различие может быть вызвано любой случайной причиной, при условии, что изменчивость временных параметров намного больше, чем эта. Таким образом, это не является статистически значимым.
С практической точки зрения я бы очень проигнорировал «более эффективную»
NOT NULL
, потому что я не вижу в ней значимости; в то время как я думаю, что отсутствиеAccessExclusiveLock
является преимуществом.источник