我有一个基于时间戳分区的表(例如partition1
将有9个月的数据,partition2
有6个月的数据,partition3
有3个月的数据,依此类推)
我需要根据特定分区的条件删除数据。
delete from table1 partition partition3
where group id in ( select * from table1 where group_code='pilot');
此操作是否仅会从partiton3
?
答案 0 :(得分:1)
首先,语法是:
delete from table1 partition(partition3)
其次,不应该引用分区名称。它创建了对表的物理布局的依赖。它可能会在今天每月进行分区,但可能会在将来某个时间的几周或几天重新分区。发生这种情况时,您的代码将会中断。 Oracle可以从分区列上的谓词推断出分区。试着忘记要分区的表。
第三,由于select *
与ID进行比较,您的子选择将失败。
您正在寻找的陈述可能如下所示:
delete
from table1
where group_code = 'pilot'
and partition_column = 'some value';
答案 1 :(得分:0)
分区工作透明,这意味着你可以简单地做一个常规的
delete table1
where group_id in (select group_id from table2 where group_code = 'pilot')
and your_date_column
between trunc(sysdate,'mm') - interval '3' month
and trunc(sysdate,'mm') - interval '2' month
优化器会知道第二个谓词意味着只有来自partition3的数据才需要删除。
的问候,
罗布。