2

これに対する答えを検索するための適切なキーワードを思いつくことができなかったので、既に答えられていたら申し訳ありません。

次の SQL ビューを検討してください。

CREATE VIEW View1 AS
SELECT Column1
      ,Column2
      ,(SELECT SUM(Column3) FROM Table2 WHERE Table2.ID = Table1.ID)  -- Subquery
FROM Table1

次のクエリを実行すると、サブクエリが実行されますか、それとも SQL Server がクエリを最適化しますか?

SELECT Column1 FROM View1

私はこれをパフォーマンスの観点から見ています。たとえば、ビューにかなりの数のサブクエリがある場合です (内部選択が大きなテーブルを参照している場合、集計には時間がかかる可能性があります)。

私は SQL Server 2008 R2 を使用していますが、答えが 2012 または MySQL で異なるかどうかを知りたいです。

ありがとう。

4

2 に答える 2

4

前述のとおり、これは 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 Sorttable2の の外観と の削除からわかるようにStream Aggregate

要約すると、それは依存します。

于 2013-06-14T11:31:25.793 に答える