🐡

パラレルクエリとは?

2024/05/28に公開

パラレルクエリとは

重いクエリを1つのプロセスで実行すると時間がかかってしまう為、
複数のプロセスに分散して処理速度を向上させる方法

クエリの実行を並列化することで複数のCPUを使用、性能向上を目指す仕組み
大量のデータに対して集計/分析を行うような場合に効果が期待できる

実行方法

  1. スキャン
    1. テーブルをいくつかの部分に分けて、それぞれの部分を同時に調べる(スキャンする)
  2. ジョイン
    2. 複数のテーブルを組み合わせる操作を、複数のプロセスで分担して同時に行う
  3. 集計
    3. データの集計を複数の部分に分けて同時に行い、最後に結果をまとめる

使い方

Oracleの場合

SELECT /*+ PARALLEL(hoge, n) */ * FROM hoge;

https://docs.oracle.com/cd/E15817_01/server.111/e05763/usingpe.htm

PostgreSQLの場合

SET max_parallel_workers_per_gather = n;
SELECT * FROM hoge;

https://www.postgresql.jp/document/9.6/html/runtime-config-resource.html#guc-max-parallel-workers-per-gather

Microsoft SQL Serverの場合

SQL Serverは自動的に並列クエリを実行するが、以下を指定することもできる

  • max degree of parallelism
    • クエリが使用できる最大のプロセッサ数を指定する
    • デフォルト値は0で、利用可能なすべてのプロセッサを使用する
  • cost threshold for parallelism
    • クエリのコストがこのしきい値を超えた場 合にのみ実行される

https://learn.microsoft.com/ja-jp/sql/database-engine/configure-windows/configure-the-max-degree-of-parallelism-server-configuration-option?view=sql-server-ver16

https://learn.microsoft.com/ja-jp/sql/database-engine/configure-windows/configure-the-cost-threshold-for-parallelism-server-configuration-option?view=sql-server-ver16

MySQLの場合

ユーザーからのクエリやDDL操作(ALTER,CREATEなど)はシングルスレッドで処理される
MySQL 8.0以降からInnoDBのクラスタインデックスのページを同時に読み取る機能がパラレルで処理されるようになった

クラスタインデックスとは?

テーブルにプライマリキーが設定されている場合、そのプライマリキーのこと

注意点

  • 並列処理にはオーバーヘッドが発生するため、常に性能が向上するわけではない
  • 多くのクエリが一度に実行されると、リソースの競合が発生することもある
    • スロークエリとか
  • 小さなデータセットや単純なクエリにはかえって逆効果となることがある

Discussion