版 | 改訂日 | 変更内容 |
---|---|---|
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以上
・性能要件が規定される
|
中規模と同様+必要に応じてパーティショニング含め性能確保を検討 | ・優先度の高い処理の性能を確保
・パラレル化のみでは性能を確保できない可能性あり。運用が成立するための追加方式を検討
|