RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1030228
Accepted
Василий Никпуп
Василий Никпуп
Asked:2020-10-02 15:10:51 +0000 UTC2020-10-02 15:10:51 +0000 UTC 2020-10-02 15:10:51 +0000 UTC

如何在 postgresql 中正确创建时间分区

  • 772

我有一张这样的桌子:

CREATE TABLE user (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    last_name VARCHAR(50),
    created_at TIMESTAMP
)

我想按列分区created_at。一些消息来源说,最好按没有时间的日期进行分区,而不是timestamp按“y”。这应该会减少可能出现的问题的数量。这是否意味着我需要创建一个单独的列,例如created_at_date,并在其中写入一个没有时间的日期并将其移植?

但毕竟,为此您每次都需要指定一个额外的参数select,这会减慢请求速度+增加人为因素。不幸的是,没有足够的经验来完全理解这种解决方案的优缺点以及是否值得做。

база-данных
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Мелкий
    2020-10-02T16:06:43Z2020-10-02T16:06:43Z

    PostgreSQL 不关心按日期或时间戳处理分区约束。或出于其他原因。虽然在计算表达式上。如果时区是指假设的可能问题,那么日期也取决于时区。

    但是,我想从相反的问题开始:为什么要通过 created_at 对用户进行分区?您是否在此表中有数百 GB 的用户,并且只想保留最近几年注册的用户,而从该数据库中删除其余用户?你想用分区解决什么问题?


    如果您确实有需要分区的理由,那么这里有一个包含两个分区的示例:

    CREATE TABLE users (
        id SERIAL,
        name VARCHAR(50),
        last_name VARCHAR(50),
        created_at TIMESTAMP
    ) PARTITION BY range (created_at);
    
    create table users_2019_09 partition of users for values from ('2019-09-01') TO ('2019-10-01');
    alter table users_2019_09 add primary key (id);
    create table users_2019_10 partition of users for values from ('2019-10-01') to ('2019-11-01');
    alter table users_2019_09 add primary key (id);
    

    其他的以同样的方式添加。

    我提请您注意,在 postgresql 11 中,主键可以在分区表本身中声明,但它还必须包含分区标志。例如,primary key(id,created_at)。通常这不是必需的,可以添加primary key到部分本身,我在示例中进行了演示。但是,按 id 搜索将查看所有分区。

    您每次都需要向 select 添加一个附加参数,这会减慢请求速度+增加人为因素

    使用分区表时,您必须始终指定分区参数。此外,完全符合表达式中描述特征的形式PARTITION BY。否则,数据库将被迫扫描每个分区。解析几十个字节的附加条件的成本where- 当然,在这种背景下,将等于没有。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5