2017-01-03 19 views
1

にVerticaドキュメントから:
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の動的述語値を生成することはできません。

通常、私は動的関数の欠落を、.sqlファイルにdrop_partitionの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他のデータセットから導出される。あなたはパーティション・キーまたはあなたが動的に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) 
  • を使用して、ドロップパーティションを実行しますこれは:)

TAから多くのパーティションをドロップする簡単な方法を助けましたであろう(データベースに対して、これはメインテーブルにはロックを必要としないであろうとダミーテーブルをドロップ安価タスクである - コードの一行がダミーテーブルにMOVE_PARTITIONS_TO_TABLEを用いてダミーテーブル を落とすことになる使用BLEバルクdrop_partitionの)。

  1. ベーステーブル(投影を含む)からダミーテーブルを作成します。
  2. ( 'ターゲット/ダミーテーブル' '分割する'、 ' パーティションから' 源 ')動的MOVE_PARTITIONS_TO_TABLEを生成します。
  3. ドロップダミーテーブル。あなたが見れば -

が小さい例を参照してください が

\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 

**

BTW(&が実行生成)と同じアプローチである(100はあなたがそれを適応させることができcomplete-ではありません)時間 から時間へのVerticaデータベースの記事やスクリプトのために私はhttp://wwww.aodba.com

に投稿します

**

+0

どうもありがとうございました。これはトリックです。共有した方法に基づいて複数のパーティションを削除する方法があるかどうか疑問に思っていました。それはケーキのアイシングになります。 – minatverma

+1

@minatverma - 私はあなたにアイシングをリクエストしました:) –

+0

Thanks a ton。本当に役に立ちました。 – minatverma