Pergunta

Pergunta 1:

Quando executar uma consulta, faz a mudança de plano de execução para cada um e cada vez que executar a consulta?

Se sim, qualquer impacto na performance?

Se não, então se mudar alguma coisa na mesa, ou seja adicionando um índice, como é que o know databse que há algo que pode usar para mudar o plano de execução para execução mais rápida?

Pergunta 2:

Mas o que é a ordem geral de execução durante a execução de uma consulta de junção, especialmente se houver muita junta (exterior, interior, natural, se muitos exterior).

Foi útil?

Solução

  • Para ser exato para SQL Server :

Você tem no máximo dois planos em cache (uma paralela, uma não-paralelas). Em seguida, o plano é utilizado com um Contexto de execução por utilizador. Mais informações na minha resposta aqui

  • Cadastre ordem é irrelevante em quase todos os casos

SQL é declarativa. Isto significa que você dizer o motor que você quer e o otimizador trabalha fora o melhor plano (dentro da razão, pode demorar 2 semanas para trabalhar fora o melhor). É por isso que você pode reescrever consultas muitas maneiras diferentes para obter a mesma resposta.

Como quaisquer regras sobre RDBMS, há exceções. Para consultas complexas, o otimizador não vai passar por todas as permutações de modo a ordem de junção pode ser importante: depende quando o otimizador decide que já teve o bastante ...

Outras dicas

(Assumindo SQL Server aqui, você não especificou ...)

Planos de execução são armazenados em cache, e com o grau parametrizar suas consultas, podem ser reutilizados.

Quando você modificar a tabela ou índices subjacente, SQL Server sabe a data de modificação dessas coisas contra o plano de execução em cache, e pode re-avaliar a consulta para as novas condições. A mesma coisa quando as estatísticas são atualizadas ... às vezes as unidades de dados reais do plano, não apenas o design da tabela / índice.

junta não são feitas em uma ordem baseada na interna vs exterior, mas sim com base no que o otimizador pensa resultará na consulta que está sendo executada mais rapidamente. Os detalhes podem variar entre bancos de dados. Mas, basicamente, o otimizador de consulta tenta otimizar o uso de índices.

Suponha que você tenha esta consulta:

select a.foo, b.bar
from a
join b on b.b_id=a.b_id
where a.some_number=42;

Agora, suponha que você tem um índice exclusivo na b.b_id mas nenhum índice em a.some_number.

O otimizador de consulta, em seguida, tem duas escolhas: Poderia fazer um arquivo completo seqüencial ler b, e, em seguida, para cada b fazer um arquivo completo seqüencial ler em uma procura de um jogo on b_id e some_number = 42. Isso é ler a ^ b registros. Ou poderia fazer um arquivo completo seqüencial ler em um procurando some_number = 42, em seguida, para cada um poderia usar o índice para encontrar rapidamente o registro de b com b_id correspondente. Ou seja, ler um * 2 registros. Bem, obviamente, o segundo plano é muito melhor, e é isso que ele vai escolher.

Como você adicionar mais tabelas de cálculo torna-se mais complicado, mas o princípio é o mesmo. Junta-se que resultem em um índice de leitura rápida usando valores encontrados em outras tabelas será feito mais tarde, depois as outras mesas foram lidas. Tabelas que devem ser lidos sequencialmente não importa o que, ou onde a leitura é baseada em constantes em vez de valores de outros registros, geralmente são lidos em primeiro lugar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top