ネストされたサブクリーリーとしても知られる相関サブ征服は、外側のクエリに依存するサブ征服です。それらは、外部クエリで処理された各行に対して1回、繰り返し実行されます。重要な特徴は、内側クエリが節から外側のクエリのSELECT
列を参照していることです。 FROM
、またはWHERE
。
例で説明しましょう。 Employees
とDepartments
2つの表があるとします。 Employees
にはcolumns employee_id
、 employee_name
、およびdepartment_id
があり、 Departments
はdepartment_id
およびdepartment_name
があります。各従業員の名前と部門の名前を見つけたいと思います。
相関したサブクエリアプローチは次のようになります。
<code class="sql">SELECT e.employee_name, (SELECT d.department_name FROM Departments d WHERE d.department_id = e.department_id) AS department_name FROM Employees e;</code>
このクエリでは、内側のsubquery (SELECT d.department_name FROM Departments d WHERE d.department_id = e.department_id)
は、外側クエリのEmployees
テーブルのe.department_id
を使用するため、外部クエリと相関しています。 Employees
テーブルの各行について、対応する部門名を見つけるために内側クエリが実行されます。
相関サブ征服は、特に大きなデータセットでは、他のアプローチよりも効率が著しく低くなります。これは、外部クエリの各行に対して内部クエリが繰り返し実行されるためです。これにより、ネストされたループ実行計画につながります。これにより、O(n*m)のパフォーマンスが発生する可能性があり、nは外側クエリの行数、mは内部クエリの行数です。これは、大きなテーブルでは非常に遅い場合があります。
データベースオプティマイザーは、内側クエリと外側のクエリ間の依存関係のために、結合として効果的に相関サブクエリを最適化できない場合があります。データベースエンジンは、場合によってはインデックスを効率的に使用できず、パフォーマンスにさらに影響を与える可能性があります。処理時間とリソースの消費量の増加は、クエリの実行が遅くなり、データベース全体のパフォーマンスに影響を与える可能性があります。
一般的に効率が低いですが、特定の状況では相関サブ征服が望ましい場合があります。
JOIN
が直接処理できないもの)、相関したサブクエリが必要になる場合があります。ほとんどの場合、相関するサブクエリに代わる最も効率的な代替品はJOIN
です。 JOIN
により、データベースは最適化されたアルゴリズムを使用してより効率的に操作を実行できます。上記の同じ例は、次のようにJOIN
を使用して書き直すことができます。
<code class="sql">SELECT e.employee_name, d.department_name FROM Employees e JOIN Departments d ON e.department_id = d.department_id;</code>
データベースは単一のパスで操作を実行できるため、このJOIN
バージョンは大幅に高速です。多くの場合、インデックスを使用してルックアップを高速化します。特定のクエリに応じて、その他の代替品には、パフォーマンスと読みやすさを改善するために、ウィンドウ関数または共通テーブル式(CTE)を使用することが含まれる場合があります。これらの手法により、相関サブ征服と比較して、より効率的なクエリプランが可能になります。
以上がSQLで相関サブ征服を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。