【问题标题】:Is it possible to use postgres/psql COPY into a specific partition of a table?是否可以将 postgres/psql COPY 用于表的特定分区?
【发布时间】:2020-07-08 02:11:01
【问题描述】:

我目前正在研究一种将数据分配到分区表中的高效方法。是否可以使用 postgres/psql 将数据复制到特定的表分区(而不是使用 INSERT)?

根据 COPY here 上的文档:

COPY FROM 可用于普通表、外部表或分区表,或者用于具有 INSTEAD OF INSERT 触发器的视图。

并且根据分区here的文档:

请注意,COPY 会忽略规则。如果要使用 COPY 插入数据,则需要将数据复制到正确的分区表中,而不是复制到主表中。 COPY确实会触发触发器,所以如果你使用触发器的方式,你可以正常使用它。

根据我对上述资源的理解,似乎可以复制到分区中;但是,我在网上找不到任何示例或支持。

换句话说,我可以写这样的东西吗:

COPY some_table_partition_one FROM '/some_dir/some_file'

【问题讨论】:

    标签: postgresql postgresql-copy


    【解决方案1】:

    COPY 到一个分区表是introduced in v11:

    允许分区表上的INSERTUPDATECOPY 将行正确路由到外部分区(Etsuro Fujita、Amit Langote)

    COPY 在引入声明性分区的 v10 之后的所有版本中都是可能的。

    似乎我们忘记从文档中删除第二个引用。

    【讨论】:

    【解决方案2】:

    至少在 PG 12.2 中是可能的:

    CREATE TABLE measurement (
        city_id         int not null,
        logdate         date not null,
        peaktemp        int,
        unitsales       int
    ) PARTITION BY RANGE (logdate);
    CREATE TABLE
    CREATE TABLE measurement_y2020m03 PARTITION OF measurement
        FOR VALUES FROM ('2020-03-01') TO ('2020-03-31');
    CREATE TABLE
    CREATE TABLE measurement_y2020m04 PARTITION OF measurement
        FOR VALUES FROM ('2020-04-01') TO ('2020-04-30');
    CREATE TABLE
    insert into measurement values (1, current_date, 10,100);
    INSERT 0 1
    select * from measurement;
     city_id |  logdate   | peaktemp | unitsales 
    ---------+------------+----------+-----------
           1 | 2020-03-27 |       10 |       100
    (1 row)
    
    cat /tmp/m.dat
    4,2020-04-01,40,400
    copy measurement_y2020m04 from '/tmp/m.dat' delimiter ',';
    COPY 1
    select * from measurement;
     city_id |  logdate   | peaktemp | unitsales 
    ---------+------------+----------+-----------
           1 | 2020-03-27 |       10 |       100
           4 | 2020-04-01 |       40 |       400
    (2 rows)
    

    【讨论】:

    • 除了您已经说过的内容之外,我已经测试了您的代码,发现 COPY 甚至可以在没有指定要插入的确切分区的情况下工作。例如:copy measurement_y2020m04 from '/tmp/m.dat' delimiter ','; 会自动将数据分配到相关分区。 x86_64-apple-darwin19.3.0 上的 PostgreSQL 12.2
    猜你喜欢
    • 2017-02-22
    • 2012-05-20
    • 2020-10-22
    • 2014-08-28
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 2021-08-30
    相关资源
    最近更新 更多