web-dev-qa-db-ja.com

postgresテーブルが分割された範囲を特定する方法は?

このようなテーブルとパーティションを作成すると...

CREATE TABLE tab1 (a int, b int) PARTITION BY RANGE(a);
CREATE TABLE tab1_p1 PARTITION OF tab1 FOR VALUES FROM (0) TO (100);
CREATE TABLE tab1_p2 PARTITION OF tab1 FOR VALUES FROM (100) TO (200);

範囲を後で確認するにはどうすればよいですか? information_schema.tablesとinformation_schema.table_constraintsを参照してみましたが、今のところうまくいきません。

2
ConanTheGerbil

_pg_class_を調べる必要があります。 pg_get_expr()を使用して、パーティション境界の読み取り可能な式を取得できます。

_select pg_get_expr(c.relpartbound, c.oid, true)
from pg_class c
where relname = 'tab1_p1';
_

1つのテーブルのすべてのパーティション(およびサブパーティション)について確認したい場合は、以下を使用できます。

_select pt.relname as partition_name,
       pg_get_expr(pt.relpartbound, pt.oid, true) as partition_expression
from pg_class base_tb 
  join pg_inherits i on i.inhparent = base_tb.oid 
  join pg_class pt on pt.oid = i.inhrelid
where base_tb.oid = 'public.tab1'::regclass;
_

パーティション指定は _pg_class.relpartbound_ 列にあります。人間が読める形式ではないので、 pg_get_expr() を使用して表示します。

_testdb=# select relname, pg_get_expr(relpartbound, oid) from pg_class where relispartition and relname~'tab1';
 relname |          pg_get_expr           
---------+--------------------------------
 tab1_p1 | FOR VALUES FROM (0) TO (100)
 tab1_p2 | FOR VALUES FROM (100) TO (200)
_
1
AdamKG