35. 10での具体的なDDL
• 親表を作成
– CREATE TABLE parent(…) PARTITION BY [{RANGE|LIST}
({column|expression})];
• 子表を作成
– CREATE TABLE child_1 PARTITION OF parent FOR VALUES
FROM ({minimum value|MINVALUE}) TO ({maximum
value|MAXVALUE});
– 下限は「以上」、上限は「未満」→上限=次の下限
– 制限なしの意味で「MINVALUE」や「MAXVALUE」も指定可能
– CREATE TABLE child_1 PARTITION OF parent FOR VALUES
IN (value[ , …]);
36. 具体的なDDL(リスト)
/* まず親テーブルを作成 */
CREATE TABLE sales_item (
id int NOT NULL,
shop_id int NOT NULL,
sales_date date NOT NULL,
amount bigint,
note text
) PARTITION BY LIST(shop_id);
/* 店舗ごとに子テーブルを作成 */
CREATE TABLE sales_item_kyusyu
PARTITION OF sales_item
FOR VALUES IN (1, 11, 23,100);
37. 具体的なDDL(レンジ)
/* まず親テーブルを作成 */
CREATE TABLE sales_item (
id int NOT NULL,
shop_id int NOT NULL,
sales_date date NOT NULL,
amount bigint,
note text
) PARTITION BY RANGE (sales_date);
/* 売上年月ごとに子テーブルを作成 */
CREATE TABLE sales_item_201701
PARTITION OF sales_item
FOR VALUES FROM ('2017-01-01') TO ('2017-02-01');
38. 作成されたテーブル
postgres=# ¥d+ sales_item
Table "public.sales_item"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
------------+---------+-----------+----------+---------+----------+--------------+-------------
id | integer | | | | plain | |
shop_id | integer | | | | plain | |
sales_date | date | | | | plain | |
amount | bigint | | | | plain | |
note | text | | | | extended | |
Partition key: RANGE (sales_date)
Partitions: sales_item_201701 FOR VALUES FROM ('2017-01-01') TO ('2017-02-01'),
sales_item_201702 FOR VALUES FROM ('2017-02-01') TO ('2017-03-01'),
sales_item_201703 FOR VALUES FROM ('2017-03-01') TO ('2017-04-01')
39. 実行計画
postgres=# EXPLAIN SELECT * FROM sales_item WHERE sales_date = '2017-02-15';
QUERY PLAN
-------------------------------------------------------------------------
Append (cost=0.00..22.75 rows=5 width=52)
-> Seq Scan on sales_item_201702 (cost=0.00..22.75 rows=5 width=52)
Filter: (sales_date = '2017-02-15'::date)
(3 rows)
postgres=# EXPLAIN SELECT * FROM sales_item WHERE sales_date < '2017-02-15';
QUERY PLAN
---------------------------------------------------------------------------
Append (cost=0.00..45.50 rows=680 width=52)
-> Seq Scan on sales_item_201701 (cost=0.00..22.75 rows=340 width=52)
Filter: (sales_date < '2017-02-15'::date)
-> Seq Scan on sales_item_201702 (cost=0.00..22.75 rows=340 width=52)
Filter: (sales_date < '2017-02-15'::date)
(5 rows)