PostgreSQL中使用带CHECK约束的数据库域执行ALTER TABLE为何缓慢?
PostgreSQL 添加列性能差异测试结果与疑问
测试结论
- 添加带默认值的列速度很快
- 添加带CHECK约束的列速度较快
- 使用带默认值的数据库域添加列速度很快
- 使用带CHECK约束的数据库域添加列速度极慢
PostgreSQL处理带默认值的数据库域表现正常,但我无法理解:为何直接在列上使用CHECK约束速度较快,而通过带CHECK约束的数据库域添加列却速度缓慢。
测试方法(已在PG12和PG15版本验证)
-- 创建含1000万行的表 CREATE TABLE "test_1" ("id" BIGINT); INSERT INTO "test_1" ("id") SELECT generate_series(1, 10000000); -- 添加带默认值的新列 ALTER TABLE "test_1" ADD COLUMN "value_def_1" SMALLINT DEFAULT 0; -- 结果:即时响应 -- 使用数据库域(数据类型)执行相同操作 -- 创建域,添加以该域为数据类型的列 CREATE DOMAIN "value_default" AS SMALLINT DEFAULT 0; ALTER TABLE "test_1" ADD COLUMN "value_def_2" "value_default"; -- 结果:即时响应 -- 添加带CHECK约束的列 ALTER TABLE "test_1" ADD COLUMN "value_check_1" SMALLINT CHECK ("value_check_1"= ANY (ARRAY[1, 2])); -- 结果:非即时,约为首次插入耗时的10% -- 使用数据库域执行相同操作 -- 创建域,添加以该域为数据类型的列 CREATE DOMAIN "one_or_two" AS SMALLINT CHECK (VALUE = ANY (ARRAY[1, 2])); ALTER TABLE "test_1" ADD COLUMN "value_2" "one_or_two"; -- 结果:约为首次插入耗时的100%
内容的提问来源于stack exchange,提问作者dwich
相关产品推荐
相关产品推荐

