当我更新具有检查约束的列时,显然postgres必须检查它是否仍然符合约束。但是如果我更新行中的其他一些值并保持所有列的检查约束不变,它还会对这些值进行一些测试吗?我试图弄清楚在我不会修改的列上对额外检查约束有多大的性能影响,这样我就可以在分区表上排除约束条件以获得更多实用性。我的表有一系列维度列,每个维度列(或者至少其中许多列)都有检查约束,我知道这些约束基于分区约束。我从不在批处理作业之后将数据插入此表,但我对没有约束的数据列进行了一系列更新。
答案 0 :(得分:2)
请参阅this example:
CREATE TABLE log (
id SERIAL PRIMARY KEY,
checked integer NOT NULL
);
CREATE OR REPLACE FUNCTION checker(i integer) RETURNS boolean
LANGUAGE plpgsql VOLATILE AS
$$BEGIN
INSERT INTO log (checked) VALUES (i);
RETURN i > 0;
END;$$;
CREATE TABLE checkme (
id integer PRIMARY KEY,
checked integer NOT NULL
CHECK (checker(checked)),
unchecked integer NOT NULL
);
第二个UPDATE
仅更改了unchecked
列:
INSERT INTO checkme (id, checked, unchecked)
VALUES (1, 42, 45);
UPDATE checkme
SET checked = 100
WHERE id = 1;
UPDATE checkme
SET unchecked = 100
WHERE id = 1;
现在让我们看看检查约束的时间:
SELECT * FROM log;
id | checked
----+---------
1 | 42
4 | 100
5 | 100