1 分区策略
1 LIST 分区
含义:根据字段的**离散值**进行分区,每个分区包含一组明确的取值
PARTITION BY LIST (tenant_id)
2 RANGE分区(范围分区)
含义:根据字段的**连续范围**进行分区
PARTITION BY RANGE (order_confirm_date)
3 HASH 分区(哈希分区)
含义:根据字段的**哈希值**均匀分布数据。
PARTITION BY HASH (customer_id)
2 分区表步骤:
2.1 备份表数据
CREATE TABLE erp_product_tem AS TABLE erp_product;
SELECT count(*) FROM erp_product;
SELECT count(*) FROM erp_product_tem;
2.2 重构主表
// 1 删除原表
DROP TABLE IF EXISTS public.erp_product CASCADE;
// 2 构建新表(普通表禁止分区表,所以需要构建新的分区表)
CREATE TABLE "public"."erp_product" (
......
CONSTRAINT pk_erp_product PRIMARY KEY (product_id, tenant_id)
......
)PARTITION BY LIST(tenant_id);
2.3 创建索引
CREATE INDEX "idx_erp_product_tenant " ON "public"."erp_product"(tenant_id) ;
CREATE INDEX "idx_erp_product_tenant_category" ON "public"."erp_product" (tenant_id, category_id);
CREATE INDEX "idx_erp_product_tenant_status" ON "public"."erp_product" (tenant_id, product_status);
......
2.4 维护备注
COMMENT ON COLUMN "public"."erp_product"."product_id" IS '商品ID';
COMMENT ON COLUMN "public"."erp_product"."product_code" IS '商品条码';
......
2.5 创建分区
CREATE TABLE erp_product_t1 PARTITION OF erp_product
FOR VALUES IN (1)
2.6 快速查看所有分区
SELECT
inhrelid::regclass AS partition_name,
relkind AS type,
reltuples AS estimated_rows
FROM pg_inherits
JOIN pg_class ON pg_inherits.inhrelid = pg_class.oid
WHERE inhparent = 'erp_product'::regclass
ORDER BY partition_name;
2.7 备份数据导回
INSERT INTO erp_product SELECT * FROM erp_product_tem;
2.8 验证数据
SELECT count(*) FROM erp_product;
SELECT count(*) FROM erp_product_tem;