🐬
Aurora Parallel Query を特定 Session でのみ有効化する
Amazon Aurora MySQL において、特定の session でのみ parallel query を有効化する方法を調査した。ドキュメントの記述がやや曖昧だったので記事にしておく。検証は v2.09.1 で行った。
v2.09.0 以上なら、parameter group の aurora_parallel_query
と aurora_disable_hash_join
をデフォルト値に設定した上で、次のようにシステム変数を設定すればよい。
set session aurora_parallel_query='on'
set session optimizer_switch='hash_join=on'
EXPLAIN の Extra に Using parallel query (...)
と出ていれば parallel query が効いている。
※ Parallel query を有効化するだけならば、optimizer switch の設定は必ずしも必要ない。これは記事下部の例からわかる。ただ、ドキュメントが次のように述べている以上、設定するに越したことはないだろう。なお、aurora_disable_hash_join=on
であっても、optimizer switch で hash_join=on
すれば、 hash join が有効化されるようだ。
並列クエリは通常、ハッシュ結合の最適化による利点がある、大量のリソースを使用する種類のクエリに使用されます。そのため、並列クエリを使用するクラスターでハッシュ結合を有効にしておくと役立ちます。
mysql> select aurora_version();
+------------------+
| aurora_version() |
+------------------+
| 2.09.1 |
+------------------+
1 row in set (0.00 sec)
mysql> select @@aurora_parallel_query;
+-------------------------+
| @@aurora_parallel_query |
+-------------------------+
| 0 |
+-------------------------+
1 row in set (0.00 sec)
mysql> select @@aurora_disable_hash_join;
+----------------------------+
| @@aurora_disable_hash_join |
+----------------------------+
| 1 |
+----------------------------+
1 row in set (0.00 sec)
mysql> select @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,hash_join=off,hash_join_cost_based=on
1 row in set (0.00 sec)
mysql> explain select count(*) from t where a = 5 and id > 5000000000\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t
partitions: NULL
type: range
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: NULL
rows: 5879332
filtered: 10.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
mysql> set session aurora_parallel_query='on';
Query OK, 0 rows affected (0.00 sec)
mysql> select @@aurora_parallel_query;
+-------------------------+
| @@aurora_parallel_query |
+-------------------------+
| 1 |
+-------------------------+
1 row in set (0.00 sec)
mysql> explain select count(*) from t where a = 5 and id > 5000000000\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t
partitions: NULL
type: ALL
possible_keys: PRIMARY
key: NULL
key_len: NULL
ref: NULL
rows: 405074076
filtered: 0.15
Extra: Using where; Using parallel query (2 columns, 2 filters, 0 exprs; 0 extra)
1 row in set, 1 warning (0.00 sec)
Discussion