Pergunta

Eu tenho uma consulta que tem 7 associações internas (porque muita da informação é distribuída em outras tabelas), alguns colegas de trabalho ter sido surpreendido.Eu queria saber se eles devem ser surpreendido ou está tendo 7 associações internas normal?

Foi útil?

Solução

não é inédito, mas eu gostaria de colocá-lo em uma visão para facilidade de uso e manutenção

Outras dicas

Duas perguntas:

  1. Será que funciona?
  2. Você pode explicar isso?

Se sim, então sete é bom. Se você não pode explicar a consulta, em seguida, sete é demais.

É normal se o esquema está no quinta forma normal :)

Dependendo do que você está tentando realizar, um grande número de associações em uma consulta não é notável.

Pessoalmente, eu estaria menos preocupado com o número de junções empregado para retornar um conjunto de resultados desejado e mais preocupado com o fato da consulta é otimizado e funcionando dentro de parâmetros aceitáveis.

Se a consulta é totalmente otimizado e não podem ser aparadas para baixo, mas a consulta em si não executa rapidamente o suficiente, então é possível que o projeto da estrutura de dados não é o ajuste certo com o que você está tentando fazer. Em que ponto você pode re-avaliar o que você está tentando realizar ou a estrutura dos dados que está alimentando o seu modelo de negócio.

Não é de todo incomum. Com um sistema como o Siebel é comum ver se juntar a contagem de dois dígitos.

Sete junta torna mais difícil para facilitar a leitura, mas o mais importante é o desempenho ea escalabilidade. Se esses são OK, vá para ele.

Provavelmente não é normal, mas certamente não é excessiva. Se você está juntando as mesmas tabelas mais e mais, criar algumas vistas.

número de junta depende do seu modelo de dados, 7 junta pode estar em sua consulta se é isso que você consulta para - Lembro-me de ter consultas semelhantes em um aplicativo em que trabalhei muito tempo atrás, o desempenho depende de muitos fatores (tabela tamanho, índices, a carga do servidor, configuração do servidor para citar alguns) e eu não acho que isso pode ser generalizado que 7 se junta são ruins.

se ele funciona para você, então eu acho que é muito bem: D

Sim, isso é normal, mas, realmente, não é uma grande idéia a partir de uma perspectiva de desempenho.Desde planos de consulta são construídos em estimado custos, há uma aumento no número de erros como você aumentar associações (ou qualquer outro operador, para que o assunto):

O Otimizador do SQL Server irá estimar um mínimo de uma linha saindo de um operador de busca.Isso é feito para evitar que o caso quando muito caro subárvore é escolhido devido a uma cardinalidade de subestimação.Se a subárvore é estimado para retornar zero linhas, muitos planos de custo sobre o mesmo e não pode haver erros no plano de seleção como um resultado.Então, você vai notar que a estimativa é de "alta" para este caso, e alguns erros podem resultar.Você também pode perceber que estamos a estimativa de 20 execuções do ramo em vez do real 10.No entanto, dado o número de associações que foram avaliados antes deste operador, por estarem fora por um fator de 2 (10 linhas) não é considerada muito ruim.(Erros podem aumentar exponencialmente com o número de junções).

Além disso, o otimizador tenta equilibrar o tempo necessário para vir acima com um plano versus o potencial de poupança - ele não vai passar o dia todo tentando encontrar o melhor plano.O mais associações, quanto maior o número de planos alternativos existem - alguns dos quais podem ser mais ideal do que o otimizador não tem tempo para se encontrar.

7 ou até mais não é de todo incomum em data warehouses, onde uma tabela de fatos poderia facilmente ter chaves estrangeiras para uma dúzia de dimensões. No cenário de data warehouse, a cardinalidade das dimensões normalmente é baixa em comparação com a tabela de fatos, de modo filtros sobre as dimensões ajudar a tabela de fato ser utilizado através de uma busca de índice ou varredura.

Para uma normalizada transacional esquema, não é normalmente um problema se a cardinalidade do conjunto de resultados é baixo na tabela base primária (isto é selecionar tudo sobre um cliente), porque as chaves estrangeiras normalmente pode simplesmente resultar em índice de procura ou varreduras de índice.

7 é bom se seu projeto de banco de dados exige. No entanto, se 7 é neccessary para atingir seu objetivo, eu reexaminar o projeto de banco de dados para certificar-se este nível de obscuridade é realmente necessário.

A título de curiosidade, é este DB2? Apenas um teste padrão que eu notei:)

é este 7 associações internas na mesma tabela, 7 junções internas em diferentes tabelas, ou 7 aninhada junta interior?

... truque pergunta! Realmente não importa, se é isso que a sua estrutura de banco de dados requer, então é correto

ressalva: se é 7 aninhada interna junta na mesma mesa, você provavelmente tem uma mesa mal-estruturada; -)

Não é certamente incomum. No entanto, pelo menos no Oracle, 7 é um número especial, como qualquer mais do que isso e o otimizador não pode mais testar cada ordem de junção (devido ao crescimento factorial no número de possibilidades). Portanto, seria prudente evitar ultrapassar 7 a menos que você está preparado para tomar conta de seu plano de execução.

Eu acho que o que você quer evitar é uma junção maior profundidade do que 7. 7 junta interna inferior a 7 junta em profundidade certamente não é inédito, mas às vezes as pessoas ouvem "7 junta" e que o não-não é 7 junta, não profundidade.

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