我有一个SQL查询,
SELECT
col1,
col2,
col3, (
SELECT COUNT(id)
FROM B
WHERE B.aid = A.id
) AS col4
FROM A
Run Code Online (Sandbox Code Playgroud)
将select作为列有什么性能影响?是否会对返回的每一行执行该语句?
我真的只对这个查询的性能感兴趣.我知道还有其他方法可以完成计数.但在这种情况下,我只是想了解sql如何使用内联选择.
抱歉,如果这个问题是一个骗局,我已经查看了stackoverflow,我无法在任何地方找到它.
这取决于您的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
Run Code Online (Sandbox Code Playgroud)
给出计划

这基本上是一样的
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
Run Code Online (Sandbox Code Playgroud)
子查询在逻辑上表示为RIGHT OUTER JOINwith MERGE JOIN作为物理实现.合并连接处理每个输入一次,而不是嵌套循环连接的逐行行为.
| 归档时间: |
|
| 查看次数: |
5384 次 |
| 最近记录: |