4

私はSQLクエリを持っています、

SELECT 
  col1, 
  col2, 
  col3, (
    SELECT COUNT(id) 
    FROM B 
    WHERE B.aid = A.id
  ) AS col4 
FROM A

選択を列として使用すると、パフォーマンスにどのような影響がありますか?そのステートメントは、返されるすべての行に対して実行されますか?

私はこのクエリのパフォーマンスに本当に興味があります。カウントを取得する方法は他にもあると思います。しかし、この場合、私はsqlがインライン選択でどのように機能するかを理解しようとしているだけです。

この質問が重複している場合はお詫びします。stackoverflowを調べましたが、どこにも見つかりませんでした。

4

1 に答える 1

7

これは、SQLの実装によって異なります。

SQLは宣言型であり、論理仕様から物理計画を作成するのはオプティマイザー次第です。SQL Serverは、このサブクエリを非相関化して、OUTER JOIN

CREATE TABLE A(id INT PRIMARY KEY, col1 INT, col2 INT, col3 INT)

CREATE TABLE B(aid INT)

CREATE CLUSTERED INDEX ix ON B(aid)

/*Fool optimiser into thinking tables aren't empty*/
update statistics A with rowcount = 1000000, pagecount = 100000

update statistics B with rowcount = 1000000, pagecount = 100000

SELECT col1,
       col2,
       col3,
       (SELECT count( B.aid)
        FROM   B
        WHERE  B.aid = A.id) AS col4
FROM   A 

DROP TABLE A, B 

計画を立てる

プラン

これは基本的にと同じです

SELECT col1,
       col2,
       col3,
       Cnt
FROM   (SELECT COUNT(aid) AS Cnt,
               aid
        FROM   B
        GROUP  BY aid) T
       RIGHT OUTER JOIN A
         ON A.id = T.aid 

サブクエリは、物理的な実装としてのRIGHT OUTER JOINwithとして論理的に表されます。MERGE JOINマージ結合は、ネストされたループ結合の行ごとの動作ではなく、各入力を1回処理します。

于 2013-02-19T17:29:37.073 に答える