Compartilhar via


Dicas de junção (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Ponto de extremidade de análise de SQL no Microsoft Fabric Warehouse no Microsoft Fabric Bancode dados SQL no Microsoft Fabric

Dicas de junção especificam que o otimizador de consulta força uma estratégia de junção entre duas tabelas no SQL Server. Para obter informações gerais sobre junções e sintaxe de junção, consulte a cláusula FROM mais JOIN, APPLY, PIVOT.

Cuidado

Como o otimizador de consulta do SQL Server normalmente seleciona o melhor plano de execução para uma consulta, é recomendável que desenvolvedores e administradores de banco de dados experientes usem as dicas apenas como um último recurso.

Aplicável ao

Convenções de sintaxe de Transact-SQL

Sintaxe

<join_hint> ::=
     { LOOP | HASH | MERGE | REMOTE | REDUCE | REPLICATE | REDISTRIBUTE [(columns count)]}

Argumentos

{ LOOP | HASH | MESCLAR }

aplica-se a: Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, ponto de extremidade de análise de SQL, banco de dados SQL no Microsoft Fabric, Microsoft Fabric Warehouse

Especifica que a junção na consulta deve usar loop, hash ou mesclagem. Usar LOOP, HASH, ou MERGE JOIN impõe uma junção específica entre duas tabelas. LOOP não pode ser especificado junto com RIGHT ou FULL como um tipo de junção. Para obter mais informações, confira as Junções.

REMOTE

aplica-se a: Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, ponto de extremidade de análise de SQL, banco de dados SQL no Microsoft Fabric

Especifica que a operação de junção é executada no site da tabela direita. Isso é útil quando a tabela esquerda é uma tabela local e a tabela direita é uma tabela remota. REMOTE deve ser usado somente quando a tabela da esquerda tiver menos linhas do que a tabela da direita.

Se a tabela direita for local, a junção será executada localmente. Se ambas as tabelas forem remotas, mas de fontes de dados diferentes, REMOTE fará com que a junção seja executada no site da tabela correta. Se ambas as tabelas forem tabelas remotas da mesma fonte de dados, REMOTE não será necessário.

REMOTE não pode ser usado quando um dos valores que estão sendo comparados no predicado de junção é convertido em um agrupamento diferente usando a COLLATE cláusula.

REMOTE pode ser usado apenas para INNER JOIN operações.

REDUCE

aplica-se a: PDW (Azure Synapse Analytics and Analytics Platform System)

Reduz o número de linhas a serem movidas para a tabela no lado direito da junção, a fim de tornar compatíveis as duas tabelas incompatíveis com a distribuição. A dica REDUCE também é chamada de uma dica de semijunção.

REPLICATE

aplica-se a: Azure Synapse Analytics, PDW (Analytics Platform System), Microsoft Fabric Warehouse

Faz com que uma operação de movimentação de difusão, em que uma tabela específica seja replicada em todos os nós de distribuição.

  • Usando REPLICATE com uma junção de INNER ou LEFT, a operação de movimentação de difusão replicará o lado direito da junção para todos os nós.
  • Da mesma forma, ao usar REPLICATE com uma junção RIGHT, a operação de movimentação de difusão replicará o lado esquerdo da junção para todos os nós.
  • Ao usar REPLICATE com uma junção FULL, não é possível criar um plano estimado.

REDISTRIBUIR [(columns_count)]

aplica-se a: PDW (Azure Synapse Analytics and Analytics Platform System)

Força duas fontes de dados a serem distribuídas nas colunas especificadas na cláusula JOIN. Para uma tabela distribuída, o PDW (Analytics Platform System) executa um movimento de embaralhamento na primeira coluna de ambas as tabelas Para uma tabela replicada, o PDW (Analytics Platform System) executa um movimento de corte. Para entender esses tipos de movimentação, veja a seção "Operações de plano de consulta DMS" no artigo "Noções básicas sobre planos de consulta" na Documentação do produto PDW (Analytics Platform System). Essa dica pode melhorar o desempenho quando o plano de consulta usa uma movimentação de difusão para resolver uma junção incompatível com a distribuição.

aplica-se a: Microsoft Fabric Warehouse

A dica REDISTRIBUTE garante que duas fontes de dados sejam distribuídas com base em colunas de cláusula JOIN. Ele manipula várias condições de junção, especificadas pela primeira n colunas em ambas as tabelas, em que n é o argumento column_count. Redistribuir dados otimiza o desempenho da consulta espalhando dados uniformemente entre nós durante etapas intermediárias de execução.

O argumento (columns_count) só tem suporte no Microsoft Fabric Warehouse.

Comentários

As dicas de junção são especificadas na FROM cláusula de uma consulta. Dicas de Junção forçam uma estratégia de junção entre duas tabelas. Se uma dica de junção for especificada para duas tabelas, o otimizador de consulta aplicará automaticamente a ordem de junção para todas as tabelas unidas na consulta, com base na posição das ON palavras-chave. Quando a CROSS JOIN é usado sem a ON cláusula, os parênteses podem ser usados para indicar a ordem de junção.

Exemplos

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2022 ou AdventureWorksDW2022, que você pode baixar na página inicial Microsoft SQL Server Samples and Community Projects.

R. Usar HASH

O exemplo a seguir especifica que a operação JOIN na consulta é executada por uma junção HASH.

SELECT p.Name,
    pr.ProductReviewID
FROM Production.Product AS p
LEFT OUTER HASH JOIN Production.ProductReview AS pr
    ON p.ProductID = pr.ProductID
ORDER BY ProductReviewID DESC;

B. Usar LOOP

O exemplo a seguir especifica que a operação JOIN na consulta é executada por uma junção LOOP.

DELETE
FROM Sales.SalesPersonQuotaHistory
FROM Sales.SalesPersonQuotaHistory AS spqh
INNER LOOP JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO

C. Usar MESCLAR

O exemplo a seguir especifica que a operação JOIN na consulta é executada por uma junção MERGE.

SELECT poh.PurchaseOrderID,
    poh.OrderDate,
    pod.ProductID,
    pod.DueDate,
    poh.VendorID
FROM Purchasing.PurchaseOrderHeader AS poh
INNER MERGE JOIN Purchasing.PurchaseOrderDetail AS pod
    ON poh.PurchaseOrderID = pod.PurchaseOrderID;
GO

D. Exemplo de dica de junção de REDUCE

O exemplo a seguir usa a dica de junção REDUCE para alterar o processamento da tabela derivada dentro da consulta. Ao usar a dica de junção REDUCE nesta consulta, a fis.ProductKey é projetada, replicada e diferenciada e, em seguida, unida ao DimProduct durante a ordem aleatória de DimProduct no ProductKey. A tabela derivada resultante é distribuída em fis.ProductKey.

-- Uses AdventureWorks
  
SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REDUCE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

E. Exemplo de dica de junção de REPLICATE

Este próximo exemplo mostra a mesma consulta como no exemplo anterior, exceto que uma dica de junção REPLICATE é usada, em vez da dica de junção REDUCE. O uso da dica REPLICATE faz com que os valores na coluna ProductKey (de junção) da tabela FactInternetSales sejam replicados para todos os nós. A tabela DimProduct é unida à versão replicada desses valores.

-- Uses AdventureWorks

SELECT SalesOrderNumber
FROM (
    SELECT fis.SalesOrderNumber,
        dp.ProductKey,
        dp.EnglishProductName
    FROM DimProduct AS dp
    INNER REPLICATE JOIN FactInternetSales AS fis
        ON dp.ProductKey = fis.ProductKey
    ) AS dTable
ORDER BY SalesOrderNumber;

F. Usar a dica REDISTRIBUTE para assegurar uma movimentação de Ordem Aleatória para uma junção incompatível com a distribuição

A consulta a seguir usa a dica de consulta REDISTRIBUTE em uma junção incompatível de distribuição. Isso garante que o otimizador de consulta use uma movimentação de Ordem Aleatória no plano de consulta. Isso também garante que o plano de consulta não usará uma movimentação de Difusão, que move uma tabela distribuída para uma tabela replicada.

No exemplo a seguir, a dica REDISTRIBUTE força um movimento shuffle na tabela FactInternetSales porque ProductKey é a coluna de distribuição para DimProducte não é a coluna de distribuição para FactInternetSales.

-- Uses AdventureWorks
  
SELECT dp.ProductKey,
    fis.SalesOrderNumber,
    fis.TotalProductCost
FROM DimProduct AS dp
INNER REDISTRIBUTE JOIN FactInternetSales AS fis
    ON dp.ProductKey = fis.ProductKey;

G. Usar o argumento de contagem de colunas com a dica REDISTRIBUTE

A consulta a seguir usa a dica de consulta REDISTRIBUTE com o argumento de contagem de colunas e o embaralhamento ocorre nas quatro primeiras colunas de cada tabela na junção.

SELECT * FROM DA
INNER REDISTRIBUTE (4) JOIN DB
ON DA.a1 = DB.b1