免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5029 | 回复: 3
打印 上一主题 下一主题

[PGSQL]自动分区问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-06 15:46 |只看该作者 |倒序浏览
我现在有一个需求,一个表的数据量非常大,所以打算进行分区。
我现在打算每2天的数据存放在一个表内。
请问PGSQL能不能进行自动建表,比如当插入一条记录的时候都有时间。发现该时间的表还没有建立
表分区则自动建立一个分区,然后插入该数据。

请大家给一个思路,目前还在看PGSQL的手册。

谢谢!

论坛徽章:
0
2 [报告]
发表于 2010-07-09 16:01 |只看该作者
回复 1# wzhuzhu


请通过以下过程:
  1. CREATE SEQUENCE public.seq_bigtable_id;

  2. CREATE TABLE public.bigtable
  3. (
  4.   id bigint NOT NULL DEFAULT nextval('seq_bigtable_id'::regclass),
  5.   tdate timestamp without time zone NOT NULL,
  6.   CONSTRAINT bigtable_pkey PRIMARY KEY (id)
  7. );

  8. CREATE INDEX idx_bigtable_tdate
  9.   ON public.bigtable (tdate);

  10. -- Trigger: bigtable_part_trig on public.bigtable

  11. -- DROP TRIGGER bigtable_part_trig ON public.bigtable;

  12. CREATE OR REPLACE TRIGGER bigtable_part_trig
  13.   BEFORE INSERT
  14.   ON public.bigtable
  15.   FOR EACH ROW
  16. DECLARE
  17.         v_part_tbl_name VARCHAR2;
  18.         v_tbl_exist int;
  19.         v_tbl_interval int;
  20. BEGIN
  21.         IF mod(EXTRACT(DOY FROM :NEW.tdate)::int,2) = 0 THEN
  22.                 v_part_tbl_name := 'bigtable_' || to_char(NEW.tdate,'YYYYMMDD');
  23.                 v_tbl_interval := 1;
  24.         ELSE
  25.                 v_part_tbl_name := 'bigtable_' || to_char(NEW.tdate-1,'YYYYMMDD');
  26.                 v_tbl_interval := -1;
  27.         END IF;
  28.         SELECT count(*) INTO v_tbl_exist FROM pg_tables WHERE schemaname='public' and tablename=v_part_tbl_name;
  29.         IF v_tbl_exist = 0 THEN
  30.                 IF v_tbl_interval = 1 THEN
  31.                         EXECUTE IMMEDIATE 'CREATE TABLE public.' ||
  32.                         v_part_tbl_name || ' (CHECK (tdate >= ''' ||
  33.                         to_char(:NEW.tdate,'YYYY-MM-DD') ||
  34.                         ''' and tdate <= ''' || to_char(:NEW.tdate+v_tbl_interval,'YYYY-MM-DD') ||
  35.                         ''')) INHERITS (public.bigtable);';
  36.                 ELSE
  37.                         EXECUTE IMMEDIATE 'CREATE TABLE public.' ||
  38.                         v_part_tbl_name || ' (CHECK (tdate <= ''' ||
  39.                         to_char(:NEW.tdate,'YYYY-MM-DD') ||
  40.                         ''' and tdate >= ''' || to_char(:NEW.tdate+v_tbl_interval,'YYYY-MM-DD') ||
  41.                         ''')) INHERITS (public.bigtable);';
  42.                 END IF;
  43.         END IF;
  44.         EXECUTE IMMEDIATE 'INSERT INTO public.' || v_part_tbl_name || '
  45.         VALUES (DEFAULT,''' || :NEW.tdate || ''');';
  46.         RETURN NULL;
  47. END;
复制代码

论坛徽章:
0
3 [报告]
发表于 2010-07-21 15:12 |只看该作者
回复  wzhuzhu


请通过以下过程:
scottsiu 发表于 2010-07-09 16:01

谢谢回复,非常感谢。
我随后测试一下。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
4 [报告]
发表于 2010-07-21 15:58 |只看该作者
学习了。不错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP