Pergunta

A partir artigo de Joel Spolsky em abstrações vazamento:

consultas [C] ertain SQL são milhares de vezes mais lento do que outras consultas logicamente equivalentes. Um exemplo famoso disto é que alguns servidores SQL são dramaticamente mais rápido se você especificar "onde a = b e b = c e a = c" do que se você só especificar "onde a = b e b = c" mesmo que o conjunto de resultados é o mesmo.

Alguém sabe os detalhes desta?

Foi útil?

Solução

Obviamente, a = b e b = c => a = c - isto está relacionado com fechamento transitivo. O ponto Joel estava fazendo é que alguns servidores SQL forem ruins em consultas otimizando, assim, algumas das consultas SQL pode ser escrito com qualificadores "extras", como no exemplo.

Neste exemplo, lembre-se que a, b e c como acima frequentemente se referem a diferentes tabelas e operações como a = b são realizados como se junta. Suponha que o número de entradas na tabela a é 1000, b é de 500 e C é 20. Em seguida, juntar de a, b precisa 1000x500 comparações linha (este é o meu exemplo mudo; na prática, poderia ser muito melhor se juntar algoritmos que reduzam a complexidade muito), e b, c precisa 500x20 comparações. Um compilador optimização irá determinar que a junção de b, c deve ser efectuado em primeiro lugar e, em seguida, o resultado deve ser unidas, a = b uma vez que existem menos linhas esperadas com b = c. No total, há cerca de 500x20 + 500x1000 comparações para (b = c) e (a = b), respectivamente. Depois que as intersecções tem de ser calculado entre as linhas retornadas (acho que também através de junta, mas não tenho certeza).

Suponha que o servidor Sql poderia ter um módulo de inferência lógica que também inferir que isso significa que a = c. Em seguida, ele provavelmente iria realizar junção de b, c e, em seguida, juntar-se de um, c (novamente este é um caso hipotético). Isso levaria 500x20 + 1000x20 comparações e depois que os cálculos de interseção. Se # esperado (a = c) é menor (devido a algum conhecimento de domínio), em seguida, a segunda consulta será muito mais rápido.

No geral a minha resposta tornou-se muito tempo, mas isso significa que a otimização de consultas SQL não é uma tarefa trivial, e é por isso que alguns servidores SQL não pode fazê-lo muito bem.

Mais podem ser encontradas em http://en.wikipedia.org/wiki/Query_optimizer ou de algum esperar em bancos de dados que lêem este.

Mas filosoficamente falando, SQL (como uma abstração) era para esconder todos os aspectos da implementação. Ele foi concebido para ser declarativa (um servidor SQL em si pode usar técnicas de otimização de consulta SQL para reformular a consulta para torná-los mais eficientes). Mas no mundo real não é assim -. Muitas vezes, as consultas de banco de dados tem que ser reescrito por seres humanos para torná-los mais eficientes

No geral, o ponto do artigo é que uma abstração só pode ser tão bom, e nenhuma abstração é perfeito.

Outras dicas

Aqui está uma explicação mais simples, onde tudo é tudo em uma mesa.

A Suponha e C são ambos indexados, mas B não é. Se o optimizador não pode perceber que A = C, então ele tem que utilizar a B não indexada para ambos ONDE condições.

Mas se você, em seguida, dizer ao servidor que a = c, que pode eficientemente aplicar esse filtro de primeira e reduzir o tamanho do conjunto de trabalho.

Eu acho que o "certo" palavra é o termo-chave aqui. Para que o otimizador para realmente entender que a = c, ele teria que analisar e, em seguida, conectar-se a igualdade do tudo da maneira de "c" em um relacionamento transitivo, a fim de deduzir a relação.

Eu acho que, no futuro, otimizadores de SQL pode obter este inteligente (se eles já não estão), de modo IMO isso não é realmente uma declaração geral da parte de Joel.

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