HPE Vertica:DROP_PARTITION动态谓词值

时间:2017-01-03 14:26:29

标签: vertica database-partitioning

来自Vertica Docs:
DROP_PARTITION ( table_name , partition_value [ , ignore_moveout_errors, reorganize_data ])

partition_value谓词可以通过任何方法动态化吗?

我想从另一个登台表中删除基于MAX(partition_col_val)条件的分区 Vertica也不支持变量创建,我可以保留MAX(partition_col_val)。

是否有可能的解决方法?

1 个答案:

答案 0 :(得分:2)

您无法使用子查询为drop_partition生成动态谓词值。

通常情况下,我会使用一个脚本来处理动态特性的缺失,该脚本会将drop_partition sql expresion生成为.sql文件,并在下一步执行。

查看此处的示例:

create table tblone (id int not null) partition by id;

insert into tblone values (1);
commit;

- 将查询的输出刷新到文件

\o /tmp/file.sql
select 
'SELECT DROP_PARTITION(''public.tblone'','||
max(id)||
');' from tblone;

- 执行文件的内容

\i /tmp/file.sql
--this is the content.
SELECT DROP_PARTITION('public.tblone',1);

这是基于非日期和需要从其他数据集派生的数据的分区。

如果您将日期作为分区键或数据列中的派生值,则可以使用内部函数动态填充drop_partition键值:

    drop table tblone cascade;
create table tblone (id date not null) partition by 
 (((date_part('year', id) * 100) + date_part('month', id)));

insert into tblone values (getdate());
commit;

dbadmin=> select * from tblone;
     id
------------
 2017-01-04
(1 row)


dbadmin=> SELECT DROP_PARTITION('tblone',(date_part('year', getdate()) * 100) + date_part('month', getdate()));
  DROP_PARTITION
-------------------
 Partition dropped
(1 row)

dbadmin=> select * from tblone;
 id
----
(0 rows)

- 您可以随时使用getdate()来获取当前或上个月或您希望的任何时段。

另一种选择是使用vsql cmd行变量 实施例

dbadmin=> drop table tblone cascade;
DROP TABLE
dbadmin=> create table tblone (id int not null) partition by id;
CREATE TABLE
dbadmin=> insert into tblone values (1);
      1

dbadmin=> commit;
COMMIT
dbadmin=> select * from tblone;
 id
----
  1
(1 row)

- 仅显示元组

dbadmin=> \t
Showing only tuples.

- 将最大值吐入文件

dbadmin=> \o /tmp/file
dbadmin=> select max(id) from tblone;
dbadmin=> \o
dbadmin=> \t
Tuples only is off.

- 将变量的值设置为文件内容(最大值)

dbadmin=> \set maxvalue `cat /tmp/file`
dbadmin=> \echo :maxvalue
       1

- 使用变量

运行放置分区
dbadmin=> SELECT DROP_PARTITION('tblone',:maxvalue);
  DROP_PARTITION
-------------------
 Partition dropped
(1 row)

dbadmin=> select * from tblone;
 id
----
(0 rows)
  • 我希望这有帮助:)

使用单行代码从表中删除多个分区的简单方法是将 MOVE_PARTITIONS_TO_TABLE 用于虚拟表,然后删除虚拟表 - 这将不需要主表上的锁定,并且删除虚拟表是数据库的一个廉价任务(将是一个批量drop_partition)。

  1. 从基表创建虚拟表(包括投影)。
  2. 生成动态MOVE_PARTITIONS_TO_TABLE('source','from 分区','分区','目标/虚拟表')。
  3. drop dummy table。
  4. 看小例子(不是100完成 - 你可以调整它) 是相同的方法(生成和执行)

        \o /tmp/file.sql
    select 'create dummy table as source table including projections;';
    select 
        'SELECT MOVE_PARTITIONS_TO_TABLE(''source'','''||
        :minpartition()||
        ''','''||
        :maxpartition()||
        ''',''target/dummy table'')'
          from tblone;
    select 'drop table dummy cascade';
    
    -- execute the content of the file
    
        \i /tmp/file.sql
    --make sure the content of the file is correct content
    

    **

      

    BTW - 如果您从时间上查找Vertica数据库文章和脚本   到时间我发表在http://wwww.aodba.com

    **