相関と無相関は一般的なSubqueriesの種類です。多くの場合(常にではありませんが)、相関のあるSubqueryと相関のないSubqueryで同じ結果を得ることができます。しかし、相関のないサブクエリの方が相関のあるサブクエリよりも一般的に性能が良くなります。相関のあるサブクエリと相関のないサブクエリの例を示します:
1. 相関するサブクエリ:
SELECT
*
FROM
source1.table1 a
WHERE
a.id
IN
(
SELECT
id
FROM
source2.table2
WHERE
date
>NOW()
AND
a.id=id)
2. 無相関のサブクエリ:
SELECT
*
FROM
source1.table1 a
JOIN
(
SELECT
id
FROM
source2.table2
WHERE
date
>NOW()) b
ON
a.id=b.id
上記のクエリは同等の結果を提供します。しかし、CData Virtuality は2つのソースクエリだけで最適化されたJOIN オペレーションを使用できるため、無相関の方がはるかにパフォーマンスが高くなります。最初のケースでは、CData Virtuality はメインテーブルの行の数だけサブクエリを実行させられます。多くの場合、PreparedStatement
を使用することでパフォーマンスを多少最適化することができますが、それでもUncorrelated Subqueryと比較すると遅くなります。
相関のあるSubqueries と相関のないSubqueries のパフォーマンスの違いは、CData Virtuality Server 特有のものではありません。代わりに、これは多くのRDBEMシステムに共通するものです。MS SQL ServerSQL in generalの関連ディスカッションのリンクをご参照ください。