前述のとおり、これは DBMS (バージョンとプロバイダー) によって異なるため、実行計画を確認してください。これは、SQL-Server 2008 でサブクエリが実行されていないことを示しています。
が選択されていない上のプランでわかるようにColumn3
、プランは単純に table1 から選択されていColumn3
ます。
SQL-Server 2008 R2では実行されません。
SQL-Server 2012では実行されません。
MySQLでは実行され、両方のクエリが同じプランを生成します。
さらに詳しく説明すると、正確なクエリと DBMS にも依存します。例えば:
CREATE VIEW View2
AS
SELECT t.ID, t.Column1, t.Column2, t2.Column3
FROM Table1 t
LEFT JOIN
( SELECT ID, Column3 = SUM(Column3)
FROM Table2
GROUP BY ID
) t2
ON t2.ID = t.ID
GO
SELECT Column1, Column2
FROM View2;
SELECT Column1, Column2, Column3
FROM View2;
この場合、相関サブクエリと同様の結果が得られます。列 3 が選択されていない場合、プランは table1 からの選択のみを示します。これは、サブクエリが table1 からの選択に関係がなく、列が使用されていないLEFT JOIN
ことをオプティマイザが認識しているためです。t2
だから気にしない。ただし、LEFT JOIN を INNER JOIN に変更した場合、たとえば
CREATE VIEW View3
AS
SELECT t.ID, t.Column1, t.Column2, t2.Column3
FROM Table1 t
INNER JOIN
( SELECT ID, Column3 = SUM(Column3)
FROM Table2
GROUP BY ID
) t2
ON t2.ID = t.ID
GO
SELECT Column1, Column2
FROM View3;
SELECT Column1, Column2, Column3
FROM View3;
これら 2 つのクエリのクエリ プランは、集計列が 2 番目のクエリで使用されていないため、オプティマイザーが基本的にビューを次のように変更することを示しています。
SELECT t.ID, t.Column1, t.Column2
FROM Table1 t
INNER JOIN
( SELECT DISTINCT ID
FROM Table2
) t2
ON t2.ID = t.ID;
Distinct Sort
table2の の外観と の削除からわかるようにStream Aggregate
。
要約すると、それは依存します。