あなたの質問は本当に完了していません。クエリは最初の1000行のみをフェッチしますが、SQLDeveloperはそれらの1000行の最初の50行のみをフェッチします。最後の行までスクロールするまで、IDEはカーソルを閉じません。すべてのデータを取得すると、それらの並列プロセスは表示されなくなります。 「「Y秒で50行をフェッチ」」ではなく、「すべての行がフェッチされました:X秒で1000」が表示されていることを確認してください(SQL Developerで、待機中の行が追加されていることが視覚的にわかりやすくなることを願っています)。 SQL * Plusは常にすべての行を取得するため、SQL*Plusでこの問題を確認してください。
最初のN行のみがフェッチされると、それらの並列プロセスは「アクティブ」になりますが、何も実行しません。 すべき 重要なリソースを使用していないため、これらのセッションを無視できます。
並列セッションの数だけが心配な場合は、期待値を調整することをお勧めします。私は以前あなたと同じ状況にありました-彼らの(不完全な)クエリがすべての並列セッションを占有していることをユーザーに絶えず伝えていました。やがて、人工的に希少な資源を作ったからこそ問題だと気づきました。 Oracleの並列プロセスは通常軽量であり、データベースはほとんどの人が考えているよりもはるかに多くの並列プロセスをサポートできます。
PARALLEL_MAX_SERVERS、PARALLEL_THREADS_PER_CPU、およびCPU_COUNTのパラメーター値は何ですか? PARALLEL_MAX_SERVERS
。マニュアルによると、デフォルトの番号は次のとおりです。PARALLEL_MAX_SERVERS = PARALLEL_THREADS_PER_CPU * CPU_COUNT * concurrent_parallel_users * 5
。
ほとんどのDBAは、数百の並列スレッドの最大数を確認し、パニックに陥り、その数を減らします。そして、人為的に制限された重要でないリソースを使用したことで開発者に怒鳴り始めます。代わりに、数値をデフォルトに戻し、ランダムな並列セッションを無視する必要があります。ユーザーがIOまたはCPUの制限を超えていない場合は、使用する並列スレッドの数は関係ありません。
(大規模の防止を除いて 並列クエリセッションの使用。ユーザーを別のプロファイルに配置し、SESSIONS_PER_USERを数十に設定します。 1または2に制限しないでください。IDEには、複数のタブ用の追加のセッション、メタデータを取得するバックグラウンドプロセス、およびデバッグセッションが必要です。制限を2に設定すると、開発者はIDEを適切に使用できなくなります。)
編集(コメントへの返信)
クエリコーディネーター 。 QCはいくつかのことを行いますが、理想的には、並列セッションがほとんどの作業を処理している間、ほとんどの時間アイドル状態になります。
プロデューサー/コンシューマーモデルでは、並列セッションの半分がデータを受信している可能性がありますが、実際には何も実行していません。たとえば、一部の操作では単なるメモリ構造です。すべてのステップで同じ数のセッションが必要になるわけではないため、並列セッションはアクティブと非アクティブの間で切り替わる場合があります。ただし、後で必要になる可能性があり、セッションの開始と終了に時間を浪費したくないため、Oracleがセッションを途中で終了することは望ましくありません。
並列処理の程度に影響を与える要因は数十ありますが、私が知る限り、PARALLEL_MAX_SERVERSを増やしても、1つのステートメントに要求される並列サーバーの数には影響しません。 (ただし、ステートメントがすでに最大数よりも多くのサーバーを要求している場合は、パラメーターを増やすと、割り当てられるセッションの数に影響する可能性があります)。
SQLステートメントがすべての並列セッションをランダムに取得しているように感じるかもしれませんが、最終的にDOP計算はほとんどの場合決定論的なルールに従います。ルールが非常に複雑で、それがどのように機能するかを判断するのは難しいというだけです。たとえば、よくある混乱の1つは、クエリで並べ替えやグループ化を追加するたびに、並列セッションの数が2倍になることです。