如果我有这个 SQL 查询
SELECT
(select count(*) from tableA) as cnt,
t1.*
FROM
(
SELECT t.*
FROM
(
SELECT * FROM tableA
UNION ALL
SELECT * FROM tableB
) t
ORDER BY [col1]
OFFSET 1000 ROWS --
FETCH NEXT 50 ROWS ONLY
) t1
此查询有效。问题是 - 他的子查询执行了多少次,1 次还是 50 次?
(select count(*) from tableA) as cnt
基本上,我知道如果您GETDATE()
的查询中有多个,它只执行一次并且值被重用。我想知道分析器是否足够聪明,可以知道它已经执行了这个与其他记录没有关联的子查询。
这是 执行计划
谢谢
执行计划显示对 的主键进行了 4 次扫描
[some_schema].[table_a]
,这表明 SQL Server 确实在源查询中的每个引用读取表一次。计划的这一部分显示了子句
UNION
中引用的两个表:FROM
作为
SELECT
子句的一部分出现的两个子查询显示在此处的执行计划中:我创建了一个简单的重现,它显示了如何
SET STATISTICS IO ON;
还可以向您显示该表正在被扫描 4 次:“消息”输出显示以下内容:
如您所见,它清楚地表明扫描计数为 4。