A documentação da cláusula From começando com o SQL Server 2008 menciona brevemente 3 dicas de junção e seus mecanismos básicos:
- Reduzir
- Replicar
- Redistribuir
No entanto, não parece haver muita informação sobre quando pode ser necessário usá-los.
Parece que eles podem ser usados em conjunto com o hash, loop e merge que já são entendidos para o propósito desta questão.
A seção relevante da documentação:
Para SQL Data Warehouse e Parallel Data Warehouse, essas dicas de junção se aplicam a junções INNER em duas colunas incompatíveis de distribuição. Eles podem melhorar o desempenho da consulta restringindo a quantidade de movimentação de dados que ocorre durante o processamento da consulta. As dicas de junção permitidas para SQL Data Warehouse e Parallel Data Warehouse são as seguintes:
REDUCE
Reduz o número de linhas a serem movidas para a tabela no lado direito da junção para tornar compatíveis duas tabelas incompatíveis de distribuição. A dica REDUCE também é chamada de dica de semijunção.REPLICATE
Faz com que os valores na coluna de junção da tabela no lado esquerdo da junção sejam replicados para todos os nós. A tabela à direita é unida à versão replicada dessas colunas.REDISTRIBUTE
Força a distribuição de duas fontes de dados em colunas especificadas na cláusula JOIN. Para uma tabela distribuída, o Parallel Data Warehouse executará uma movimentação aleatória. Para uma tabela replicada, o Parallel Data Warehouse executará uma movimentação de corte. Para entender esses tipos de movimentação, consulte a seção "Operações do Plano de Consulta DMS" no tópico "Entendendo Planos de Consulta" na documentação do produto Parallel Data Warehouse. Essa dica pode melhorar o desempenho quando o plano de consulta estiver usando uma movimentação de transmissão para resolver uma junção incompatível de distribuição.
Em termos gerais, usamos uma dica de junção para corrigir uma falha do otimizador ao identificar um melhor plano de consulta. Isso pode acontecer por muitos motivos que se resumem amplamente à otimização sendo uma abordagem "boa o suficiente" limitada por um orçamento de tempo para encontrar um plano.
Reduzir
"também chamado de dica de semi-junção". Com uma semi-junção, estamos interessados apenas em saber se existe ou não uma linha correspondente na outra tabela. Na verdade, muitas vezes é porque a consulta tem um predicado EXISTS(). Se houver uma correspondência ou um milhão, o resultado será o mesmo - a única linha da tabela esquerda (externa) será retornada.
Como exemplo, podemos querer consultar todos os Clientes que já fizeram um Pedido. Digamos que Customer é uma mesa pequena, mas Order é enorme e espalhada por muitos nós. Seria um desperdício copiar todos esses dados para onde quer que o Cliente esteja quando tudo o que precisamos é saber se existe pelo menos uma linha para cada Cliente. A dica REDUCE fornece isso. Conceitualmente, ele é
select distinct CustomerId from Order
executado em cada nó que contém Ordem, o que é relativamente rápido.Replicar
Este é o inverso de REDUZIR. Aqui, uma tabela é copiada em massa de seu nó "home" para todos os nós que contêm dados da tabela no lado direito da junção.
Para este exemplo, queremos o valor total de todos os pedidos, somado pela cidade do cliente. Temos apenas um número relativamente pequeno de clientes que se encaixam confortavelmente em um único nó. A tabela Pedidos, no entanto, é enorme e abrange muitos nós. Para satisfazer a consulta, temos que obter os dados do cliente e do pedido no mesmo nó. Será mais eficiente copiar Cliente, pois é menor. A dica REPLICATE força esse comportamento, fazendo uma cópia completa da tabela Customer em cada nó que contém as linhas Order.
Redistribuir
Essa é outra maneira de indicar como as linhas devem ser movidas de seu nó "home" para outro nó para que os predicados de junção possam ser avaliados. Desta vez, estamos pedindo ao servidor para copiar os dados e distribuir essa cópia de acordo com alguma nova função de distribuição, de modo que as linhas copiadas acabem no nó certo para concluir a junção.
Digamos que agora temos um site de comércio eletrônico de varejo com muitos clientes e muitos pedidos. Os clientes são distribuídos por CustomerId e Pedidos distribuídos por OrderDate. Se queremos agora
join on Customer.CustomerId = Order.CustomerId
o plano mais eficiente pode ser copiar Order e redistribuir de acordo com CustomerId, então passar cada nova partição para o nó correspondente. Isso difere de REPLICATE, pois toda a tabela é copiada para cada nó, enquanto aqui uma parte dos dados de cada nó é copiada para outros nós. A maneira específica como a redistribuição é tratada dependerá da distribuição atual e das cardinalidades.