Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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
Banco
de 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 deINNER
ouLEFT
, 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çãoRIGHT
, 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çãoFULL
, 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 DimProduct
e 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