Postgresql建分区表步骤sql

编程入门 行业动态 更新时间:2024-10-14 12:22:58

Postgresql建<a href=https://www.elefans.com/category/jswz/34/1765571.html style=分区表步骤sql"/>

Postgresql建分区表步骤sql

由于业务发展,需要对系统表进行分区处理,以提高查询速度,下面代码是示例,以partition_table_name表为例。

--备份表
SELECT * INTO partition_table_name_2022_bak FROM partition_table_name;
--删除原表
DROP TABLE IF EXISTS "public"."partition_table_name";
--创建带分区的原表
CREATE TABLE "public"."partition_table_name" ("id" int8 NOT NULL DEFAULT '-1'::integer,"tenant_id" int8 NOT NULL DEFAULT '-1'::integer,"app_id" int8 NOT NULL DEFAULT '-1'::integer,"data_id" varchar(100) COLLATE "pg_catalog"."default" NOT NULL,"data_type" varchar(100) COLLATE "pg_catalog"."default" NOT NULL,"data_version" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,"data_format" varchar(32) COLLATE "pg_catalog"."default" NOT NULL,"data_source" varchar(32) COLLATE "pg_catalog"."default","data" text COLLATE "pg_catalog"."default","status" char(1) COLLATE "pg_catalog"."default" NOT NULL,"status_time" timestamp(6),"create_time" timestamp(6) NOT NULL
)
--分区字段 可支持多个
PARTITION BY RANGE ("create_time"
)
;
//创建默认分区
CREATE TABLE IF NOT EXISTS SWAP_DATA_INFO_DEFAULT PARTITION OF SWAP_DATA_INFO DEFAULT;
--索引
CREATE INDEX "idx_partition_table_name_1" ON "public"."partition_table_name" USING btree ("data_id" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_partition_table_name_2" ON "public"."partition_table_name" USING btree ("tenant_id" "pg_catalog"."int8_ops" ASC NULLS LAST
);
CREATE INDEX "idx_partition_table_name_3" ON "public"."partition_table_name" USING btree ("create_time" "pg_catalog"."timestamp_ops" ASC NULLS LAST
);ALTER TABLE "public"."partition_table_name" ADD CONSTRAINT "pk_partition_table_name" PRIMARY KEY ("id","create_time");--创建分区表函数
CREATE OR REPLACE FUNCTION public.create_daypartition_by_day(v_tablename character varying, v_start_day character varying, v_end_day character varying)RETURNS voidLANGUAGE plpgsql
AS $function$
DECLARE vt_i integer;  vd_i integer; vn_day date; vn_next_day date; vn_num_day varchar;  vn_day_num integer;
BEGINselect count(tablename) into vt_i from  pg_tables where tablename=v_tablename||'_'||to_char(v_end_day :: DATE, 'yyyyMMdd');if vt_i = 0 thenselect (v_end_day::date - v_start_day::date) into vn_day_num;
for vd_i in 0..vn_day_num loop
vn_day := v_start_day :: DATE + (vd_i || ' day') :: INTERVAL ;vn_next_day := vn_day + INTERVAL '1 day' ;vn_num_day := to_char(vn_day, 'yyyyMMdd') ; EXECUTE 'create table ' || v_tablename || '_' || vn_num_day || ' partition of ' || v_tablename || ' for values from (''' || vn_day || ' 00:00:00'') to (''' || vn_next_day || ' 00:00:00'');' ;
end loop;else  RAISE EXCEPTION 'partition table % exist!',v_tablename ||'_' ||v_start_day; end if;
END ; $function$;set lock_timeout = 9999999;--执行创建分区表函数
select create_daypartition_by_day('partition_table_name','2022-07-01','2022-09-30');
select create_daypartition_by_day('partition_table_name','2022-10-01','2022-12-01');--历史数据放进默认分区
INSERT INTO partition_table_name SELECT * FROM partition_table_name_bak;

更多推荐

Postgresql建分区表步骤sql

本文发布于:2024-03-04 17:01:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1709857.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:分区表   步骤   Postgresql   sql

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!