2017-01-03 9 views
1

Из Vertica Docs:
DROP_PARTITION (table_name , partition_value [ , ignore_moveout_errors, reorganize_data ])HPE Vertica: DROP_PARTITION динамическое значение предиката

Может partition_value предикат быть динамическим любым способом?

Я хочу удалить раздел на основе MAX (partition_col_val) из другой промежуточной таблицы.
Vertica также не поддерживает создание переменных как таковых, где я могу сохранить MAX (partition_col_val).

Возможно ли обходное решение?

ответ

2

Вы не можете использовать подзапросы для генерации динамического предиката для 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).

  1. создать стоп-лоток из базовой таблицы (включая выступы).
  2. генерировать динамические MOVE_PARTITIONS_TO_TABLE ('source', 'from раздел', 'to partition', 'target/dummy table').
  3. падение макет стола.

см небольшой пример (не 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

**

+0

Большое спасибо. Это делает трюк. Интересно, есть ли способ удалить более одного раздела на основе методов, которыми вы делились. Это будет глазурь на торте. – minatverma

+1

@minatverma - я добавил, что вы запросили обледенение :) –

+0

Спасибо тонну. Действительно полезно. – minatverma