Se eu tiver essa consulta 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
Esta consulta funciona. A questão é - quantas vezes sua subconsulta é executada, 1 ou 50?
(select count(*) from tableA) as cnt
Basicamente, eu sei que se você tiver vários GETDATE()
em sua consulta, ele será executado apenas uma vez e o valor será reutilizado. Gostaria de saber se o analisador é inteligente o suficiente para saber que já executou essa subconsulta, que não tem correlação com outros registros.
Aqui está o plano de execução
Obrigado
O plano de execução mostra 4 verificações da chave primária de
[some_schema].[table_a]
, o que indica que o SQL Server está realmente lendo a tabela uma vez por referência na consulta de origem.Esta parte do plano mostra as
UNION
duas tabelas referenciadas naFROM
cláusula:As duas subconsultas que aparecem como parte da
SELECT
cláusula são mostradas no plano de execução aqui:Criei um repro simples que mostra como
SET STATISTICS IO ON;
também pode mostrar que a tabela está sendo digitalizada 4 vezes:A saída "Mensagens" mostra o seguinte:
Como você pode ver, ele afirma claramente que a contagem de varredura é 4.