1

テーブルをtimestamp with timezone列で分割しました。次に、パーティションを追加し、そのパーティションにインデックスを追加しました。現在、Greenplumは の後にのみそのインデックスを使用しているようですvacuum analyze TABLENAME。それ以外の場合は、順次スキャンを使用します。

の欠点vacuum analyze TABLENAMEは、かなり時間がかかることです。vacuum analyze PARTITIONTABLENAME先月の毎日のパーティションが変更されていないことを知っているので、それを実行したいと考えています。

問題は、次のような特定の値のパーティション テーブル名を取得するにはどうすればよいかということcurrent_timestampです。つまり、Greenplum が新しいエントリを配置するパーティションを決定するために使用する関数にアクセスしたいと考えています。

4

1 に答える 1

1

Greenplum のパーティションは、他のテーブルと同様に扱われます。psql にアクセスできる場合は、「\d」コマンドを使用して、search_path でアクセスできるすべてのテーブルを表示できるはずです。大きなテーブルの各パーティションがその中に表示されます。明示的にパーティションに名前を付けない限り、greenplum は自動インクリメント パーティション番号を持つ親テーブル名に基づいて名前を付けるだけです。

gpadmin=# create table testtab (testcol varchar(10),
gpadmin(#  test_time timestamptz)
gpadmin-# distributed by (testcol)
gpadmin-#  partition by range (test_time)
gpadmin-# ( START (date '2013-10-01') INCLUSIVE
gpadmin(#   END  (date '2013-11-25') EXCLUSIVE
gpadmin(# EVERY (INTERVAL '1 week'));
NOTICE:  CREATE TABLE will create partition "testtab_1_prt_1" for table "testtab"
NOTICE:  CREATE TABLE will create partition "testtab_1_prt_2" for table "testtab"
NOTICE:  CREATE TABLE will create partition "testtab_1_prt_3" for table "testtab"
NOTICE:  CREATE TABLE will create partition "testtab_1_prt_4" for table "testtab"
NOTICE:  CREATE TABLE will create partition "testtab_1_prt_5" for table "testtab"
NOTICE:  CREATE TABLE will create partition "testtab_1_prt_6" for table "testtab"
NOTICE:  CREATE TABLE will create partition "testtab_1_prt_7" for table "testtab"
NOTICE:  CREATE TABLE will create partition "testtab_1_prt_8" for table "testtab"
CREATE TABLE
Time: 252.080 ms
gpadmin=#

最新のパーティションのみをバキュームするには、最大のパーティション番号を持つテーブルを返す関数を作成できます。

gpadmin=# select tablename from pg_tables
gpadmin-# where tablename like 'testtab_1_prt_%' 
gpadmin-# order by tablename desc limit 1;
    tablename    
-----------------
 testtab_1_prt_8
(1 row)

Time: 89.151 ms

そして、それを真空分析に渡します。

于 2013-10-10T00:12:36.667 に答える