Pelo que entendi da documentação , o operador Nested Loops é um operador de junção , ou seja, requer duas tabelas como entrada.
Se isso estiver correto, por que o operador Nested Loops é usado com uma entrada escalar ?
Por exemplo, pegue a seguinte consulta (do site de Paul White ) e seu plano de execução. Você pode ver que as entradas para o operador Nested Loops são (1) um Scalar e (2) uma tabela (o resultado do Index Seek).
Eu sei que um escalar não pode ser unido a uma tabela, então o que isso realmente significa? O que realmente está sendo unido?
USE AdventureWorks2019;
DECLARE @Like nvarchar(50) = N'D%';
SELECT p.[Name]
FROM Production.Product AS p
WHERE p.[Name] LIKE @Like;
BTW, presumo que seja uma pergunta bastante básica, mas não consegui encontrar um bom recurso que passe por esse básico metodologicamente, portanto, uma recomendação seria muito apreciada.
Esta pergunta é baseada em um mal-entendido sobre o que esses operadores fazem:
Verificação Constante
Este operador retorna uma tabela de constantes. Isso pode ser uma ou várias linhas e pode estar em qualquer lugar de zero a várias colunas.
Neste caso específico, a varredura constante é uma linha e zero colunas. Ele é usado apenas para gerar uma linha de condução para o Compute Scalar, um pouco como
(VALUES())
se isso fosse possível.Calcular escalar
Este operador adiciona uma ou mais colunas à linha que passa por ela, cujo cálculo pode ou não depender de outras colunas. Ele não adiciona linhas, funciona em cada linha de cada vez.
Nesse caso, ele é usado pelo compilador para calcular os pontos inicial e final do
LIKE
predicado e informações internas sobre o predicado.Loops aninhados
A linha única é então alimentada através da junção e os cálculos são passados como parâmetros correlacionados (referências externas).
Efetivamente, a consulta se torna algo assim:
Uma entrada escalar também pode ser expressa como uma tabela de linha e coluna única.
Isso é exatamente o que os operadores Constant Scan e Compute Scalar fazem - transformá-lo em uma tabela para que possa ser unido:
E como os loops aninhados são usados quando uma das duas tabelas que estão sendo unidas é muito pequena (~ 10 linhas ou menos), é muito provável que você obtenha uma junção de loops aninhados ao usar entradas escalares. Mais ao ponto, apenas a junção de loops aninhados suporta parâmetros correlacionados (referências externas), também conhecido como apply .
Algumas explicações mais detalhadas: