我正在 PostgreSQL 中创建一个表并首先使用数据批量加载。PostgreSQL 的文档建议先插入大量数据,然后再创建索引和外键约束。检查约束是怎么回事?在插入初始数据之前还是之后创建它们更好?还是有关系?
例如,一个表将有一个索引 on time
,NOT NULL
对它的约束,检查时间间隔上的约束,可能还有 on device
。如果没有批量加载,则定义为:
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);
索引将在批量创建后创建。要批量加载的数据被清理并满足约束。将来在正常操作期间需要这些约束。
NULL NOT
如果检查约束是在批量加载之前还是之后创建的,效率会更高吗?检查约束中的目标列上是否存在索引是否重要?
您可以对其进行基准测试,但它不应该有所作为。将为每一行评估检查表达式,并且它仅使用该行中的数据。如果在您加载数据时或之后发生这种情况,应该没有区别。