パラレルクエリとは
重いクエリを1つのプロセスで実行すると時間がかかってしまう為、
複数のプロセスに分散して処理速度を向上させる方法
クエリの実行を並列化することで複数のCPUを使用、性能向上を目指す仕組み
大量のデータに対して集計/分析を行うような場合に効果が期待できる
実行方法
- スキャン
- テーブルをいくつかの部分に分けて、それぞれの部分を同時に調べる(スキャンする)
- ジョイン
2. 複数のテーブルを組み合わせる操作を、複数のプロセスで分担して同時に行う - 集計
3. データの集計を複数の部分に分けて同時に行い、最後に結果をまとめる
使い方
Oracleの場合
SELECT /*+ PARALLEL(hoge, n) */ * FROM hoge;
PostgreSQLの場合
SET max_parallel_workers_per_gather = n;
SELECT * FROM hoge;
Microsoft SQL Serverの場合
SQL Serverは自動的に並列クエリを実行するが、以下を指定することもできる
- max degree of parallelism
- クエリが使用できる最大のプロセッサ数を指定する
- デフォルト値は0で、利用可能なすべてのプロセッサを使用する
- cost threshold for parallelism
- クエリのコストがこのしきい値を超えた場 合にのみ実行される
MySQLの場合
ユーザーからのクエリやDDL操作(ALTER,CREATEなど)はシングルスレッドで処理されます
MySQL 8.0以降からInnoDBのクラスタインデックスのページを同時に読み取る機能がパラレルで処理されるようになりました
クラスタインデックスとは?
テーブルにプライマリキーが設定されている場合、そのプライマリキーのこと
注意点
- 並列処理にはオーバーヘッドが発生するため、常に性能が向上するわけではない
- 多くのクエリが一度に実行されると、リソースの競合が発生することもある
- スロークエリとか
- 小さなデータセットや単純なクエリにはかえって逆効果となることがある