Partilhar via


Juntar dicas (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

As dicas de associação especificam que o otimizador de consulta imponha 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 cláusula FROM mais JOIN, APPLY, PIVOT.

Caution

Como o otimizador de consulta do SQL Server normalmente seleciona o melhor plano de execução para uma consulta, recomendamos que as dicas sejam usadas apenas como último recurso por desenvolvedores e administradores de banco de dados experientes.

Aplica-se a

Transact-SQL convenções de sintaxe

Syntax

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

Arguments

{ LOOP | HASH | MESCLAR }

Aplica-se a: Azure SQL Database, Azure SQL Managed Instance, endpoint de análise SQL, base de dados SQL no Microsoft Fabric, Microsoft Fabric Warehouse

Especifica que a associação na consulta deve usar looping, hash ou mesclagem. O uso de LOOP, HASHou 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, consulte Ingressa.

REMOTE

Aplica-se a: Azure SQL Database, Azure SQL Managed Instance, endpoint de análise SQL, base de dados SQL no Microsoft Fabric

Especifica que a operação de junção é executada no site da tabela correta. 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 certa 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 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 para um agrupamento diferente usando a cláusula COLLATE.

REMOTE só pode ser utilizado para operações INNER JOIN.

REDUCE

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

Reduz o número de linhas a serem movidas para a tabela no lado direito da junção para tornar duas tabelas de distribuição incompatíveis compatíveis. A dica REDUCE também é chamada de dica semi-junte.

REPLICATE

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

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

  • Usando REPLICATE com uma junção 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 associação de FULL, um plano estimado não pode ser criado.

REDISTRIBUIR [(columns_count)]

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

Força duas fontes de dados a serem distribuídas em colunas especificadas na cláusula JOIN. Para uma tabela distribuída, o Analytics Platform System (PDW) executa um movimento aleatório na primeira coluna de ambas as tabelas Para uma tabela replicada, o Analytics Platform System (PDW) executa um movimento de corte. Para entender esses tipos de movimentação, consulte a seção "Operações do plano de consulta DMS" no artigo "Noções básicas sobre planos de consulta" na documentação do produto Analytics Platform System (PDW). Essa dica pode melhorar o desempenho quando o plano de consulta está usando uma movimentação de difusão para resolver uma associação incompatível com 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 lida com várias condições de junção, especificadas pela primeira n colunas em ambas as tabelas, onde n é o argumento column_count. A redistribuição de dados otimiza o desempenho da consulta, distribuindo uniformemente os dados entre os nós durante as etapas intermediárias de execução.

O argumento (columns_count) só é suportado no Microsoft Fabric Warehouse.

Remarks

As dicas de associação são especificadas na cláusula FROM de uma consulta. As dicas de junção impõem uma estratégia de junção entre duas tabelas. Se uma dica de junção for especificada para quaisquer 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 palavras-chave ON. Quando um CROSS JOIN é usado sem a cláusula ON, parênteses podem ser usados para indicar a ordem de junção.

Examples

Os exemplos de código neste artigo usam a base de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que você pode baixar da página inicial dos Microsoft SQL Server Samples and Community Projects.

A. Usar HASH

O exemplo a seguir especifica que a operação de JOIN na consulta é executada por uma associação de 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 o LOOP

O exemplo a seguir especifica que a operação de JOIN na consulta é executada por uma associação de 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 MERGE

O exemplo a seguir especifica que a operação de JOIN na consulta é executada por uma associação de 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 REDUCE

O exemplo a seguir usa a dica de junção de REDUCE para alterar o processamento da tabela derivada dentro da consulta. Ao usar a dica de junção de REDUCE nesta consulta, o fis.ProductKey é projetado, replicado e distinto e, em seguida, unido a DimProduct durante a confusão de DimProduct em 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 REPLICATE

Este próximo exemplo mostra a mesma consulta que o exemplo anterior, exceto que uma dica de junção de REPLICATE é usada em vez da dica de junção de REDUCE. O uso da dica REPLICATE faz com que os valores na coluna ProductKey (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. Use a dica REDISTRIBUTE para garantir um movimento aleatório para uma associação incompatível com distribuição

A consulta a seguir usa a dica de consulta REDISTRIBUTE em uma associação de distribuição incompatível. Isso garante que o otimizador de consulta use uma movimentação 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 de REDISTRIBUTE força um movimento de embaralhamento 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. Use 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 a confusão ocorre nas quatro primeiras colunas de cada tabela na junção.

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