You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 04:05:24