Estou criando uma tabela no PostgreSQL e carrego em massa com os dados primeiro. A documentação do PostgreSQL recomenda primeiro inserir grandes volumes de dados e depois criar índices e restrições de chave estrangeira. E quanto às restrições de verificação? É melhor criá-los antes de inserir os dados iniciais ou depois? Ou isso importa?
Por exemplo, uma tabela terá um índice em time
, NOT NULL
restrição nela, verificação de restrição no intervalo de tempo e possivelmente em device
. Se não houver carregamento em massa, a definição será:
CREATE TABLE conditions(
time timestamptz NOT NULL,
device int,
value float,
CONSTRAINT cond_time CHECK ("time" >= '2020-01-16 01:00:00+01'::timestamp with time zone
AND "time" < '2020-01-23 01:00:00+01'::timestamp with time zone),
CONSTRAINT cond_device CHECK (my_hash_function(device) >= 1073741823
AND my_hash_function(device) < 1075441823)
);
CREATE INDEX conditions_time_index ON conditions(time);
O índice será criado após o volume. Os dados para carregamento em massa são limpos e atendem às restrições. As restrições são necessárias no futuro durante as operações normais.
Será mais eficiente se as restrições de verificação e NULL NOT
forem criadas antes do carregamento em massa ou depois? Importa se um índice existirá na coluna de destino na restrição de verificação?
Você pode comparar, mas não deve fazer diferença. A expressão de verificação será avaliada para cada linha e usará apenas os dados dessa linha. Não deve fazer diferença se isso ocorrer enquanto você carrega os dados ou depois.