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 JOINMERGE JOIN物理实现一样。合并连接处理每个输入一次,而不是嵌套循环连接的逐行行为。

于 2013-02-19T17:29:37.073 回答