Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

escolha do operador do otimizador de consulta - loops aninhados vs correspondência de hash (ou mesclagem)


ABSOLUTAMENTE. Uma combinação de hash seria uma grande melhoria. Criar o hash na tabela menor de 19.223 linhas e depois analisá-lo com a tabela maior de 65.991 linhas é uma operação muito menor do que o loop aninhado que exige comparações de 1.268.544.993 linhas.

A única razão pela qual o servidor escolheria os loops aninhados é que ele subestimou muito o número de linhas envolvidas. Suas tabelas têm estatísticas sobre elas e, em caso afirmativo, elas estão sendo atualizadas regularmente? As estatísticas são o que permitem ao servidor escolher bons planos de execução.

Se você abordou corretamente as estatísticas e ainda está tendo um problema, você pode forçá-lo a usar uma junção HASH da seguinte forma:
SELECT *
FROM
   TableA A -- The smaller table
   LEFT HASH JOIN TableB B -- the larger table

Observe que, no momento em que você fizer isso, também forçará a ordem de associação. Isso significa que você precisa organizar todas as suas tabelas corretamente para que a ordem de junção faça sentido. Geralmente, você examinaria o plano de execução que o servidor já possui e alteraria a ordem de suas tabelas na consulta para corresponder. Se você não estiver familiarizado com como fazer isso, o básico é que cada entrada "esquerda" vem primeiro e, em planos de execução gráfica, a entrada esquerda é a inferior 1. Uma junção complexa envolvendo muitas tabelas pode ter que agrupar junções dentro de parênteses ou usar RIGHT JOIN para obter o plano de execução ideal (troque as entradas esquerda e direita, mas introduza a tabela no ponto correto na ordem de junção).

Geralmente, é melhor evitar usar dicas de junção e forçar a ordem de junção, então faça o que puder primeiro! Você pode examinar os índices nas tabelas, fragmentação, reduzir o tamanho das colunas (como usar varchar em vez de nvarchar onde o Unicode não é necessário) ou dividindo a consulta em partes (insira primeiro em uma tabela temporária e, em seguida, junte-se a ela).