我们可以从<tab> partition <part。>?</part。> </tab>中删除where子句

时间:2011-03-16 11:41:50

标签: sql oracle oracle10g partitioning

我有一个基于时间戳分区的表(例如partition1将有9个月的数据,partition2有6个月的数据,partition3有3个月的数据,依此类推)

我需要根据特定分区的条件删除数据。

delete from table1 partition partition3
where group id in ( select * from table1 where group_code='pilot'); 

此操作是否仅会从partiton3

中删除

2 个答案:

答案 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的数据才需要删除。

的问候,
罗布。