AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 294101
Accepted
HeyJude
HeyJude
Asked: 2021-06-11 13:15:30 +0800 CST2021-06-11 13:15:30 +0800 CST 2021-06-11 13:15:30 +0800 CST

O que o operador de junção de loops aninhados tem a ver com um escalar?

  • 772

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;

insira a descrição da imagem aqui

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.

sql-server execution-plan
  • 2 2 respostas
  • 134 Views

2 respostas

  • Voted
  1. Best Answer
    Charlieface
    2021-06-12T00:28:39+08:002021-06-12T00:28:39+08:00

    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.

    Observe que, em muitos casos, o cálculo não é feito diretamente por este operador, mas sim por operadores de plano posteriores, e funciona apenas como um espaço reservado. É por isso que muitas vezes não tem "Número real de linhas"

    Nesse caso, ele é usado pelo compilador para calcular os pontos inicial e final do LIKEpredicado 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:

    DECLARE 
        @Like nvarchar(50) = N'D%';
    
    SELECT 
        P.[Name]
    FROM (VALUES
        (LikeRangeStart(@Like), LikeRangeEnd(@Like), LikeRangeInfo(@Like))
    ) v(Expr1005, Expr1006, Expr1007)
    JOIN Production.Product AS P
      ON p.Name > Expr1005 AND p.Name < Expr1006
      AND LikeFunction(p.[Name], @Like, Expr1007) > 0;
    
    • 3
  2. LowlyDBA - John M
    2021-06-11T13:42:43+08:002021-06-11T13:42:43+08:00

    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:

    O operador Constant Scan introduz uma ou mais linhas constantes em uma consulta. Um operador Compute Scalar é frequentemente usado após um Constant Scan para adicionar colunas a uma linha produzida pelo operador Constant Scan.

    O operador Compute Scalar avalia uma expressão para produzir um valor escalar calculado. Isso pode ser retornado ao usuário, referenciado em outro lugar na consulta ou ambos. Um exemplo de ambos está em um predicado de filtro ou predicado de junção. Compute Scalar é um operador lógico e físico.

    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:

    • Verificação constante do SQL Server no estouro de pilha
    • Verificação constante em planos de execução por Grant Fritchey
    • 2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve