Можем ли мы иметь предложение where для удаления из раздела <tab>? - PullRequest
0 голосов
/ 16 марта 2011

У меня есть таблица, разделенная по отметке времени (например, partition1 будет иметь данные за 9 месяцев, partition2 будет иметь данные за 6 месяцев, partition3 будет иметь данные за 3 месяца и т. Д.)

Мне нужно удалить данные на основе условия в определенном разделе.

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

Эта операция удалит только из partiton3?

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Прежде всего, синтаксис:

delete from table1 partition(partition3)

Во-вторых, вы не должны ссылаться на имена разделов. Это создает зависимость от физического расположения таблицы. Это может быть разделено ежемесячно сегодня, но это может быть перераспределено на недели или дни когда-нибудь в будущем. Когда это произойдет, ваш код сломается. Oracle может вывести раздел просто из предиката в столбце разделения. Постарайтесь забыть о разбиении таблицы.

В-третьих, ваш подвыбор потерпит неудачу из-за того, что select * сравнивается с ID.

Заявление, которое вы ищете, скорее всего, выглядит примерно так:

delete
  from table1
 where group_code = 'pilot'
   and partition_column = 'some value';
0 голосов
/ 16 марта 2011

Разделение работает прозрачно, а это означает, что вы можете просто сделать обычный

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

Оптимизатор будет знать, что второй предикат означает, что удалять нужно только данные из раздела 3.

С уважением,
Роб.

...