按天自动分区 - PostgreSQL

2024-03-05

我想做一个日常分区。我知道oracle是这样的。

CREATE TABLE "PUBLIC"."TEST"     
(   
"ID" NUMBER(38,0) NOT NULL ENABLE, 
"SOME_FIELD" VARCHAR2(20 BYTE) NOT NULL ENABLE,     
"ANOTHER_FIELD" VARCHAR2(36 BYTE) NOT NULL ENABLE,    
TABLESPACE "PUBLIC"."TEST_DATA" 
PARTITION BY RANGE ("TEST_DATE") INTERVAL (NUMTODSINTERVAL(1,'DAY'))  
(PARTITION "TEST_P1"  
VALUES LESS THAN (TIMESTAMP' 2019-01-01 00:00:00')   TABLESPACE "TEST_DATA" );

PostgreSQL 怎么样?

新编辑: 示例脚本:

该脚本将在一个表中维护前 15 天的数据,即“p1”,而剩余天数的数据则在另一个分区中。

1-创建自动分区取决于插入命令的日期范围

2-在脚本中我还提到了如何在所需列上添加索引。

3- 日期范围从 1 日到 14 日的数据将添加到分区“p1”中,其余数据将添加到分区“p2”中。

示例脚本:

    CREATE TABLE measurement (
        city_id         int not null,
        logdate         date not null,
        peaktemp        int,
        unitsales       int
    );

    CREATE OR REPLACE FUNCTION new_partition_creator() RETURNS trigger AS
  $BODY$
    DECLARE
      partition_date TEXT;
      partition TEXT;
      partition_day int;
      startdate date;
      enddate date;
    BEGIN
      partition_day := to_char(NEW.logdate,'DD');
      partition_date := to_char(NEW.logdate,'YYYY_MM');

         IF partition_day < 15 THEN
      partition := TG_RELNAME || '_' || partition_date || '_p1';
      startdate := to_char(NEW.logdate,'YYYY-MM-01');
      enddate := date_trunc('MONTH', NEW.logdate) + INTERVAL '1 MONTH - 1 day';
      ELSE 
      partition := TG_RELNAME || '_' || partition_date || '_p2';
      startdate := to_char(NEW.logdate,'YYYY-MM-15');
      enddate := date_trunc('MONTH', NEW.logdate) + INTERVAL '1 MONTH - 1 day';
      END IF;

      IF NOT EXISTS(SELECT relname FROM pg_class WHERE relname=partition) THEN
        RAISE NOTICE 'A partition has been created %',partition;
        EXECUTE 'CREATE TABLE ' || partition || ' ( CHECK ( logdate >= DATE ''' || startdate || '''  AND logdate <=  DATE ''' ||  enddate || ''' )) INHERITS (' || TG_RELNAME || ');';
        EXECUTE 'CREATE INDEX ' || partition || '_logdate ON '  || partition || '(logdate)';
        EXECUTE 'ALTER TABLE ' || partition || ' add primary key(city_id);';       
        END IF;
        EXECUTE 'INSERT INTO ' || partition || ' SELECT(' || TG_RELNAME || ' ' || quote_literal(NEW) || ').* RETURNING city_id;';
      RETURN NULL;
    END;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100; 


    CREATE TRIGGER testing_partition_insert_trigger BEFORE INSERT ON measurement FOR EACH ROW EXECUTE PROCEDURE new_partition_creator();


    postgres=# insert into measurement values(1,'2017-10-11',10,10);
    NOTICE:  A partition has been created measurement_2017_10_p1
    INSERT 0 0

您可以使用扩展 pg_partman 来自动创建分区。https://github.com/pgpartman/pg_partman https://github.com/pgpartman/pg_partman

或者您甚至可以使用调度程序 pg_agent,您将在每天的 18:00:00 执行一个过程来创建第二天的分区。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

按天自动分区 - PostgreSQL 的相关文章

随机推荐

  • 如何使用 Prisma 2 和 NodeJS 将图像存储到 PostgreSQL 中?

    大家好 我一直在寻找类似的可以参考的东西 但遗憾的是直到现在我还没有找到 希望有人能给我一些指导 我使用 filepond 发送 api 请求 并使用 prisma 2 客户端存储它 谢谢你 将图像存储在 Blob 存储中通常是一个很好的做
  • 在我的用户控件中找不到 GotFocus()/LostFocus()

    我创建了一个 WinForms 用户控件 我读过几个地方的内容GotFocus and LostFocus 事件 但我的用户控件未在 属性 窗口的 事件 部分中提供这些事件 我什至尝试打字override看看这些事件处理程序是否会出现 但他
  • 如何将 RVM 与 tcsh 一起使用?

    我想将 RVM 与 tcsh 一起使用 我该怎么做呢 据我所知 没有这方面的 官方 说明 我按照 将 RVM 与 tcsh 结合使用 http po ru com diary using rvm with tcsh 但这对我不起作用 特别是
  • PowerShell 变量声明中的大括号有什么意义吗?

    我遇到过这样声明的变量 或参数 var name Hello world 据我所知 这与以下内容没有什么不同 var name Hello world 我想知道是否 第一个示例中的大括号可以做任何事情或意味着任何事情 它们会改变变量的行为吗
  • 如何将 getdate 格式化为 YYYYMMDDHHmmSS

    在 SQL Server 中如何格式化getdate 输出到YYYYMMDDHHmmSS where HH是24小时格式吗 我有YYYYMMDD完成了 select CONVERT varchar GETDATE 112 但据我所知 Tha
  • 如何防止网格行跨度改变列位置?

    我有一个 3 X 3CSS Grid https developer mozilla org en US docs Web CSS CSS Grid Layout 我有一排 其中有三项A B C 我想要物品C有一个rowspan of 2
  • Spring boot 中不渲染 Jsp 视图页面。怎么解决呢?

    我正在尝试发出一个 ajax 请求 将一个值发送到我的 spring boot 但是 一旦我合并了 ajax 调用并且它成功地将值传递给 java 它就不会查看jsp页 我认为问题出在方法本身 但我不完全确定 我再次传递了值 但是每当我使用
  • 将功能绑定到按键不起作用

    My code import tkinter master tkinter Tk master title test1 master geometry 300x300 masterFrame tkinter Frame master mas
  • rcs 在 lm() 模型中生成错误的预测

    我正在尝试重现这篇博文 http www portfolioprobe com 2011 03 28 the devil of overfitting 关于过度拟合 我想探索样条曲线与测试多项式的比较 我的问题 使用 rcs 受限三次样条
  • 添加 2 级索引作为带有条件的其他索引的总和

    我有一个df df pd DataFrame from dict group 0 A 1 A 2 A 3 A 4 A 5 A 6 A 7 A 8 A 9 B 10 B 11 B 12 B 13 B 14 B 15 B 16 B 17 B 1
  • 重新初始化 ScheduledExecutorService 中的修复延迟

    根据我的要求 我必须在一段时间后执行一些特定的代码 我选择做同样的事ScheduledExecutorService scheduleWithFixedDelay runnable 0 5 TimeUnit SECONDS 它对我来说工作得
  • Pandas DataFrame 列命名约定

    有没有常用的 Pandas DataFrame 列命名约定 是PEP8 https www python org dev peps pep 0008 在这里推荐 例如实例变量 意识到大量数据是从带有标题的外部源加载的 但我很好奇当我必须自己
  • 使用 R 文本挖掘包保留土耳其语字符

    首先我要说的是 我仍然是 R 的初学者 目前 我正在使用 tm 包尝试土耳其语文本的基本文本挖掘技术 然而 我在 R 中显示土耳其语字符时遇到了问题 这就是我所做的 docs lt VCorpus DirSource DIRECTORY e
  • Cordova / Phonegap:实时更新代码库

    我们将 Cordova 与 AngularJS 一起用于 iOS 和 Android 应用程序 iOS 的一大缺点是 Apple 的审核时间较长 在 Google 的 Playstore 中 您的应用程序几乎可以立即或在几个小时内可用 但苹
  • 可以信任第三方主机进行闭源/私有源代码管理吗? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 对于许多公司来说 他们项目的源代码对他们来说非常有价值 窃取源代码可能会造成非常高昂的代价 在本地网络上严格控制源代码是帮助保护源代码
  • npm 依赖冲突

    我正在使用 Vue 开发一个项目 我运行 Vue Cli 并添加了 Typescript 插件 我有几个弱点 当我跑步时npm audit fix它无法解决依赖冲突 npm ERR code ERESOLVE npm ERR ERESOLV
  • Airflow连接密码解密

    我想解密气流连接的密码 从连接表中获取值 有什么方法可以解密密码值 你可以做 from airflow hooks base hook import BaseHook connection BaseHook get connection c
  • Material-ui 芯片 - 拖放支持

    我想用材料 UI 芯片 https material ui com demos chips 在我的反应应用程序中 问题是我想通过拖放来移动芯片 不支持此功能material ui 是否有解决方法 扩展来使芯片可拖动 如果没有其他办法的话 我
  • Android 库项目作为 jar 文件进行分发,例如 google Analytics

    我见过this https stackoverflow com questions 5014128 create an android jar library for distribution问题 并且对创建一个我可以分发并可以在任何 An
  • 按天自动分区 - PostgreSQL

    我想做一个日常分区 我知道oracle是这样的 CREATE TABLE PUBLIC TEST ID NUMBER 38 0 NOT NULL ENABLE SOME FIELD VARCHAR2 20 BYTE NOT NULL ENA