来自Vertica Docs:
DROP_PARTITION ( table_name , partition_value [ , ignore_moveout_errors, reorganize_data ])
partition_value
谓词可以通过任何方法动态化吗?
我想从另一个登台表中删除基于MAX(partition_col_val)条件的分区 Vertica也不支持变量创建,我可以保留MAX(partition_col_val)。
是否有可能的解决方法?
答案 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)。
看小例子(不是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
**