| 版 | 改訂日 | 変更内容 |
|---|---|---|
| 1.0 | 2020/03/17 | 新規作成 |
本作品はCC-BYライセンスによって許諾されています。 ライセンスの内容を知りたい方は こちら でご確認ください。 文書の内容、表記に関する誤り、ご要望、感想等につきましては、PGEConsのサイト を通じてお寄せいただきますようお願いいたします。
本資料は、以下の参考資料として利用されることを想定しています。
| 機能分類 | 比較機能 | Oracle12c | PostgreSQL | |||||
|---|---|---|---|---|---|---|---|---|
| SE | EE | 9.5 | 9.6 | 10 | 11 | 12 | ||
| クエリ | Seq Scan | - | 〇 | - | 〇 | 〇 | 〇 | 〇 |
| Hash Join | - | 〇 | 〇 | 〇 | 〇 | |||
| Nested Loop Join | - | 〇 | 〇 | 〇 | 〇 | |||
| 集約(Aggregation) | - | 〇 | 〇 | 〇 | 〇 | |||
| ヒント句 | - | 〇*1 | 〇*1 | 〇*1 | 〇*1 | |||
| IndexScan(B-tree) | - | - | 〇 | 〇 | 〇 | |||
| Merge Join | - | - | 〇 | 〇 | 〇 | |||
| Bitmap Heap Scan | - | - | 〇 | 〇 | 〇 | |||
| サブクエリ | - | - | 〇 | 〇 | 〇 | |||
| ソート | - | - | 〇 | 〇 | 〇 | |||
| Parallel Hash Join*2 | - | - | - | 〇 | 〇 | |||
| パラレルアペンド | - | - | - | 〇 | 〇 | |||
| SELECT INTO | - | - | - | 〇 | 〇 | |||
| 分離レベルがSERIALIZABLE | - | - | - | - | 〇 | |||
| 外部表(PostgreSQLはFILE_FDW) | - | - | - | - | - | |||
| DML | INSERT,UPDATE,DELETE | - | 〇 | - | - | - | - | - |
| DDL | CREATE TABLE ~ AS SELECT | - | 〇 | - | - | - | 〇 | 〇 |
| CREATE MATERIALIZED VIEW | - | - | - | 〇 | 〇 | |||
| CREATE INDEX(B-tree) | - | - | - | 〇 | 〇 | |||
| ALTER INDEXまたはREINDEX | - | - | - | 〇 | 〇 | |||
| その他 | 統計取得(DBMS_STATS,ANALYZE) | - | 〇 | - | - | - | - | - |
| バックアップ(rman,PITR) | 〇*3 | 〇*3 | 〇*3 | 〇*3 | 〇*3 | |||
| 論理バックアップ(DataPump,pg_dump) | 〇*4 | 〇*4 | 〇*4 | 〇*4 | 〇*4 | |||
| データロード | 〇*5 | 〇*5 | 〇*5 | 〇*5 | 〇*5 | |||
1. パラレル処理の指定箇所
| RDBMS | パラレル処理の指定箇所 | 説明 |
|---|---|---|
| Oralce (EEのみ) | 初期化パラメータ | 自動、手動含め様々なワークロードに対応 |
| リソースマネージャ | ||
| 表・索引 | パラレル実行の有無、パラレル度の指定 | |
| セッション単位 | ||
| ヒント句 | ||
| PostgeSQL | postgresql.conf(パラメータ) | パラレル度の制限、実行計画の調整要素を指定 |
| 表 | parallel_workersで制限(テーブルサイズ依存なし) | |
| ロール | set句でpostgresql.confのパラメータを上書き | |
| セッション | set文でpostgresql.confのパラメータを上書き | |
| ヒント句(pg_hint_plan 1.2.0~) | ヒント句でパラレル度を指定 |
2. パラメータの指定
| パラメータ | 指定可能バージョン | 説明 |
|---|---|---|
| max_worker_processes | 全て | ・インスタンス内のバックグラウンドプロセスの最大値。サーバ内でデータベースインスタンスに割り当てるCPUコア数を指定する。このパラメータはパラレル動作させるためのパラメータではなくパラレルクエリで使うCPUコアを制限するものと考えてよい。
・ロール、セッション指定でも上書きすることはできない。
|
| max_parallel_workers | 9.6以降 | ・インスタンス内のパラレルクエリ操作用のワーカー数の最大値。max_worker_processes以下を指定する。
・ロール、セッション指定で上書きできてしまうため、インスタンスでのパラレルクエリで使うCPUコアの制限値とすることはできない。
|
| max_parallel_workers_per_gather | 9.6以降 | GatherまたはGather Mergeノードに対して起動できるワーカー数の最大値。SQL内での1つの処理で動作するパラレル度と考えた方が分かりやすい。複数ユーザが接続し複数のSQLが同時に動作する場合などmax_parallel_workersの限界に達しパラレル実行できないケースもある。 |
| max_parallel_maintenance_workers | 11以降 | create index,reindexなどメンテナンス処理で使用するワーカー数の最大値。
|
| min_parallel_index_scan_size | 10以降 | パラレルスキャンが考慮されるために、スキャンされなければならないインデックスデータの最小量。インデックスサイズのではないことに注意。
|
| min_parallel_table_scan_size | 10以降 | パラレルスキャンを考慮する最小のテーブルデータのサイズ。SEQ SCANの場合はテーブルサイズと同じです。 |
| min_parallel_relation_size | 9.6 | min_parallel_table_scan_sizeと役割は同じ。 |
3. 表、ロール、セッション、pg_dump、pg_restoreでのパラレル度指定方法例
alter table pgbench_accounts set ( parallel_workers = 3 );
alter role postgres set max_parallel_workers_per_gather = 4;
set max_parallel_workers_per_gather = 4;
/*+ Parallel(pgbench_accounts 4) */
select count(*) from pgbench_accounts;
pg_dump -Fd -v -j 4 -f /home/postgres/backup/test01_d test01
pg_restore -c -v -j 4 -d test01 /home/postgres/backup/test01_d
①基本的な指定優先度
②テーブルのパラレル度を指定した場合
例1 セッション指定のパラレル度よりテーブルのパラレル指定が低いケース
test01=# alter table pgbench_accounts set ( parallel_workers = 3 );
ALTER TABLE
test01=# set max_parallel_workers_per_gather = 4;
SET
test01=# explain select count(*) from pgbench_accounts;
QUERY PLAN
------------------------------------------------------------------------------------------------------
Finalize Aggregate (cost=409514.48..409514.49 rows=1 width=8)
-> Gather (cost=409514.16..409514.47 rows=3 width=8)
Workers Planned: 3
-> Partial Aggregate (cost=408514.16..408514.17 rows=1 width=8)
-> Parallel Seq Scan on pgbench_accounts (cost=0.00..392385.13 rows=6451613 width=0)
(5 行)
例2 テーブルのパラレル指定よセッション指定のパラレル度が低いケース
test01=# alter table pgbench_accounts set ( parallel_workers = 6 );
ALTER TABLE
test01=# set max_parallel_workers_per_gather = 4;
SET
test01=# explain select count(*) from pgbench_accounts;
QUERY PLAN
------------------------------------------------------------------------------------------------------
Finalize Aggregate (cost=391369.42..391369.43 rows=1 width=8)
-> Gather (cost=391369.00..391369.41 rows=4 width=8)
Workers Planned: 4
-> Partial Aggregate (cost=390369.00..390369.01 rows=1 width=8)
-> Parallel Seq Scan on pgbench_accounts (cost=0.00..377869.00 rows=5000000 width=0)
(5 行)
③テーブルのパラレル度を指定しない場合
④パラレル処理の方が早いと想定される実行計画のとき
| リストアでの処理 | pg_restore*1 | パラレルクエリの機能*2 | 自動バキュームの機能*3 |
|---|---|---|---|
| コピー処理 | 複数の表を同時にコピー | ||
| 索引の作成 | 複数の索引を同時に処理 | 1つの索引を複数のプロセスで処理 | |
| 表のANALYZE | 複数の表を同時にANALYZE |
$ pg_restore -c -j 4 -d test01 backup/test01.dmp
| DB規模 | 前提条件 | 指針 | 考え方 |
|---|---|---|---|
| 小規模 | ・DBサイズは50GB未満
・DBに割り当てられるCPU(コア)が4以下
・接続ユーザ数は10未満
・性能要件は規定されない
|
指針なし。postgresql.confのデフォルトのまま | ・管理コストは減らす(管理しない)
|
| 中規模 | ・DBサイズは50GB~1TB
・DBに割り当てられるCPU(コア)が32以下
・接続ユーザ数は50未満
・性能要件が規定される
|
パラレル化方式を規定し、ワークロードに合せて指定 | ・優先度の高い処理の性能を確保
|
| 大規模 | ・DBサイズは1TB以上
・DBに割り当てられるCPU(コア)が潤沢
・接続ユーザ数は50以上
・性能要件が規定される
|
中規模と同様+必要に応じてパーティショニング含め性能確保を検討 | ・優先度の高い処理の性能を確保
・パラレル化のみでは性能を確保できない可能性あり。運用が成立するための追加方式を検討
|