代码改变世界

Vertica删除历史分区数据

2014-09-18 23:40  AlfredZhao  阅读(2934)  评论(2编辑  收藏  举报
假设test用户下创建的t_jingyu表
vsql -Utest -wtestpwd
create table t_jingyu(
col1 int,
col2 varchar,
col3 timestamp not null)
PARTITION BY (date_part('doy', t_jingyu.col3));
 
需求:删除doy分区表t_jingyu的历史分区数据(8月份)
$vi /tmp/jingyu/del_part08_01-31.sql
\timing
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-01'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-02'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-03'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-04'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-05'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-06'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-07'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-08'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-09'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-10'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-11'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-12'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-13'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-14'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-15'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-16'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-17'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-18'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-19'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-20'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-21'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-22'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-23'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-24'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-25'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-26'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-27'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-28'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-29'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-30'::date)); 
SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-31'::date)); 
$vsql -Utest -wtestpwd -f /tmp/jingyu/del_part08_01-31.sql
Timing is on.
  DROP_PARTITION   
-------------------
 Partition dropped
(1 row)

Time: First fetch (1 row): 12732.105 ms. All rows formatted: 12732.215 ms
  DROP_PARTITION   
-------------------
 Partition dropped
(1 row)

Time: First fetch (1 row): 71796.168 ms. All rows formatted: 71796.237 ms
……
Time: First fetch (1 row): 16020.296 ms. All rows formatted: 16020.362 ms
[dbadmin@Vertica01 jingyu]$ 

数据库表有入库时,drop历史分区会有锁等待,如下:

dbadmin=> SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-04'::date)); 
 ERROR 5157:  Unavailable: [Txn 0xa000000005fb08] O lock table - timeout error Timed out O locking Table:test.t_jingyu. I held by [user dbadmin (copy test.t_jingyu(col1,col2,col3)
from '/home/dbadmin/bin/vertica97/data/t_jingyudat1411006284757/*' on any node 
delimiter E'~' NULL '' NO ESCAPE DIRECT;)], I held by [user dbadmin (copy test.t_jingyu(col1,col2,col3)
from '/home/dbadmin/bin/vertica101/data/t_jingyudat1411006351418/*' on any node 
delimiter E'~' NULL '' NO ESCAPE DIRECT;)]. Your current transaction isolation level is SERIALIZABLE
dbadmin=>   
同时关注数据库的队列,发现同时有drop_partition和copy入库。
dbadmin=> select substr(current_statement, 1, 200), count(1) 
dbadmin-> from sessions 
dbadmin-> where not current_statement is null and (transaction_id, statement_id)<>(current_trans_id(), current_statement()) 
dbadmin-> group by 1; 
                                                                                                  substr                                                                                                  | count 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------
                                                                                                                                                                                                          |    10
 SELECT DROP_PARTITION('test.t_jingyu', EXTRACT('doy' FROM '2014-08-04'::date));                                                                                                                |     1
 copy test.t_jingyu(col1,col2,col3) f |     1
(3 rows)

在没有copy入库时,drop_partition 大概20s内就可以删除一个历史分区(50亿左右数据量)。