Вы не можете использовать подзапросы для генерации динамического предиката для drop_partition.
Обычно я рассматриваю отсутствие динамической функции со сценарием, который будет генерировать выражение drop_partition sql в файле .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);
Это когда у вас есть раздел, основанный на не датах и данных, которые должны быть b e, полученных из других наборов данных.
В случае, если у вас есть дата в качестве ключа секционирования или выведенного значения из столбца данных вы можете использовать внутреннюю функцию для динамического заполнения ключа 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 в таблицу фиктивных файлов, а затем отбросить таблицу фиктивных данных - для этого не требуется блокировка основной таблицы, а удаление фиктивной таблицы - дешевая задача для базы данных (будет bulk drop_partition).
- создать стоп-лоток из базовой таблицы (включая выступы).
- генерировать динамические MOVE_PARTITIONS_TO_TABLE ('source', 'from раздел', 'to partition', 'target/dummy table').
- падение макет стола.
см небольшой пример (не 100 complete- вы можете адаптировать его) тот же подход (генерировать & выполнить)
\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
**
КСТАТИ - если вы смотрите для статей и сценариев Vertica Database с момента времени до времени, которое я публикую в http://wwww.aodba.com
**
Большое спасибо. Это делает трюк. Интересно, есть ли способ удалить более одного раздела на основе методов, которыми вы делились. Это будет глазурь на торте. – minatverma
@minatverma - я добавил, что вы запросили обледенение :) –
Спасибо тонну. Действительно полезно. – minatverma