DBAtlas · データベース運用アトラス

並列クエリを実行/並列度を設定

Oracle

-- At query level with a hint:
SELECT /*+ PARALLEL(t, 4) */ * FROM big_table t;
-- Force at session level:
ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4;

PARALLEL ヒントはテーブルに並列スキャンを適用する。degree=DOP。過大な DOP はサーバーのリソースを使い果たすため、慎重に選択する。parallel_degree_policy=AUTO は自動的に管理する。

PostgreSQL

-- Set the number of parallel workers for the session:
SET max_parallel_workers_per_gather = 4;
-- The planner adds a Gather/Gather Merge node:
EXPLAIN (ANALYZE) SELECT count(*) FROM big_table;

実行計画に Gather/Parallel Seq Scan が表示されれば並列処理が有効。max_parallel_workers と min_parallel_table_scan_size も影響する。

MySQL

-- Limited InnoDB parallelism (certain operations only):
SET GLOBAL innodb_parallel_read_threads = 4;
-- Effective for COUNT(*) and primary key scans.

MySQL は汎用的な並列クエリ実行を提供しない。innodb_parallel_read_threads はクラスタ化インデックスのスキャン(例: COUNT(*))のみを並列化する。複雑な JOIN はシングルスレッド。

SQL Server

-- MAXDOP hint at query level:
SELECT * FROM dbo.big_table OPTION (MAXDOP 4);
-- Instance level: sp_configure 'max degree of parallelism', 4;

MAXDOP は並列スレッド数を制限する。MAXDOP 1 は並列処理を無効にする。「cost threshold for parallelism」を超えると実行計画が並列になる。

MongoDB

// Allow disk use for a large aggregation:
db.sale.aggregate([ { $group: { _id: "$city", t: { $sum: "$amount" } } } ], { allowDiskUse: true })
// A sharded cluster processes each shard in parallel.

シャードクラスタではクエリは各シャードで並列に実行される。単一ノードでは集計ステージはほぼ逐次。allowDiskUse はメモリ上限を超える操作を可能にする。

Redis

# Not applicable: there is no concept of query parallelism.

コマンドの実行はシングルスレッド。Cluster(シャーディング)でスケールするか、ネットワーク I/O の並列化に io-threads を使用する。

Elasticsearch

# Shard count = unit of parallelism; a query runs in parallel across shards.
# Parallelism by slicing within a single shard (with scroll/PIT):
GET <index>/_search
{ "slice": { "id": 0, "max": 4 }, "query": { "match_all": {} } }

検索は関連するすべてのシャードで同時に実行される。プライマリシャードの数が並列処理の基本レベルを決める。slices は大きな scroll/reindex 操作を分割する。

DBAtlas で開く →