🐬

Aurora Parallel Query を特定 Session でのみ有効化する

2021/01/15に公開

Amazon Aurora MySQL において、特定の session でのみ parallel query を有効化する方法を調査した。ドキュメントの記述がやや曖昧だったので記事にしておく。検証は v2.09.1 で行った。


v2.09.0 以上なら、parameter group の aurora_parallel_queryaurora_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