| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/01/2009 01:50:33
|
Jokabeludoido
JavaEvangelist
Membro desde: 23/08/2008 15:34:07
Mensagens: 305
Offline
|
Olá...
Esses dias, analisando a estruturação de uma aplicação da qual participei do processo de desenvolvimento, surgiu uma dúvida...
Os BD's mais amplamente utilizados fazem otimização de redundância de consultas? Algo do tipo:
Percebam que utilizo a cláusula where restringindo os resultados que satisfaçam determinados critérios. Todavia, os meus 2 critérios (ligados pelos operador AND) são, na verdade, o mesmo critério duplicado. Parece uma situação estúpida, mas na aplicação que vi, esta situação pode ocorrer, pois temos um sistema que gera buscas dinâmicas, em que um usuário sem atenção pode fazer algo assim.
De qualquer forma, eu queria saber se o BD faz um pré-processamento disso para detectar esse tipo de redundância, para finalidades de otimização, ou se, neste caso, ele executa cegamente a operação definida. Se for o segundo caso, imagino que ele verifica os registros que satisfaçam o primeiro critério, depois os que satisfaçam o segundo critério e, por fim, retorne os elementos comuns entre ambos os conjuntos. Essa busca pelo crit'rio específico seria redundante...
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/01/2009 05:57:08
|
cmoreira
Thread.start()
Membro desde: 12/06/2007 17:41:10
Mensagens: 28
Localização: São Paulo
Offline
|
Olá,
Acredito que não seja feita qualquer otimização pelo banco, caso contrário seria necessário que ele mesmo fizesse uma análise dos conjuntos de dados gerados em cada uma das consultas, o que me parece extrapolar a sua própria função, além do overhead.
Como exemplo, temos um DBA na empresa, e volta e meia pedimos auxílio a ele para que sejam feitas otimizações em consultas mais complexas (as tabelas são MUITO grandes), posso afirmar que a diferença é, algumas vezes, espantosa.
Abs,
|
Carlos Moreira
Visite Aulas Particulares e Cursos Java, JEE, Struts, Hibernate, etc. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 28/01/2009 20:52:40
|
Jokabeludoido
JavaEvangelist
Membro desde: 23/08/2008 15:34:07
Mensagens: 305
Offline
|
Não teria que comparar conjuntos de dados não...Falo de um pré-processamento da instrução submetida em SQL. Uma análise semântica poderia detectar certas "coisas estúpidas" nas consultas...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/01/2009 16:11:02
|
Jokabeludoido
JavaEvangelist
Membro desde: 23/08/2008 15:34:07
Mensagens: 305
Offline
|
Então devo assumir que o BD não faz esse tipo de pré-análise?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 09:18:52
|
lucao
Java Ninja
![[Avatar]](/images/avatar/d5036c64412973d610202be8dce2b82a.jpg)
Membro desde: 20/12/2004 11:38:33
Mensagens: 298
Localização: Santos/SP
Offline
|
Cara, ele executa com esse 'where' a mais sim e consequentemente consome mais também.
O que é possível fazer é rodar um advisor em cima dessa query, ele vai indicar a redundância.
Estou falando no caso de Oracle.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 09:29:54
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Jokabeludoido wrote:Olá...
Esses dias, analisando a estruturação de uma aplicação da qual participei do processo de desenvolvimento, surgiu uma dúvida...
Os BD's mais amplamente utilizados fazem otimização de redundância de consultas? Algo do tipo:
Percebam que utilizo a cláusula where restringindo os resultados que satisfaçam determinados critérios. Todavia, os meus 2 critérios (ligados pelos operador AND) são, na verdade, o mesmo critério duplicado. Parece uma situação estúpida, mas na aplicação que vi, esta situação pode ocorrer, pois temos um sistema que gera buscas dinâmicas, em que um usuário sem atenção pode fazer algo assim.
De qualquer forma, eu queria saber se o BD faz um pré-processamento disso para detectar esse tipo de redundância, para finalidades de otimização, ou se, neste caso, ele executa cegamente a operação definida. Se for o segundo caso, imagino que ele verifica os registros que satisfaçam o primeiro critério, depois os que satisfaçam o segundo critério e, por fim, retorne os elementos comuns entre ambos os conjuntos. Essa busca pelo crit'rio específico seria redundante...
Os otimizadores dos bancos de dados costumam fazer esse tipo de análise sim, mas algumas coisas podem atrapalhar. Se, em vez de você ter algo como:
você tivesse algo como (que é uma coisa muito comum):
pode ser que o otimizador veja que foi aplicada uma função sobre o argumento, e isso faz com que ele já não consiga mais otimizar a consulta, porque não sabe o comportamento da função. Por exemplo, poderíamos ter uma função que a cada vez que fosse aplicada retornasse um resultado diferente. O fato de converter uma data do banco de dados com "TO_DATE" ou coisa parecida já atrapalha a otimização.
This message was edited 1 time. Last update was at 02/02/2009 09:54:11
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 12:19:20
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
Jokabeludoido wrote:Olá... Esses dias, analisando a estruturação de uma aplicação da qual participei do processo de desenvolvimento, surgiu uma dúvida... Os BD's mais amplamente utilizados fazem otimização de redundância de consultas? Algo do tipo:
Faz muito tempo que Joins não são feitos assim. São feitos assim: A instrução ON é mais eficiente que WHERE por acontecer em tempos diferentes da pesquisa O where é apenas usado para filtrar os dados e nunca para casar as tabelas. Com ON o compilador/processador de queries sabe o que significa , com Where ele não sabe e fará a filtragem apenas depois de pegar todos os itens de cada tabela e comparar. É claro que cada fornecedor de SGBD tem as suas gambiarras para otimizar as consultas, mas o fato de vc escrever a consulta da formam ais correta(moderna/legivel) sempre ajudará o compilador de qualquer SGDB.
This message was edited 1 time. Last update was at 02/02/2009 12:20:11
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 02/02/2009 15:11:34
|
louds
Moderador
![[Avatar]](/images/avatar/1e48c4420b7073bc11916c6c1de226bb.jpg)
Membro desde: 29/04/2003 23:09:15
Mensagens: 4061
Localização: São Paulo
Offline
|
Todos bancos de dados modernos possuem engines de otimização muito avançadas.
Isso é a norma a quase uma década, por sinal.
|
http://www.kumpera.net/blog/
http://www.mono-project.com/
"Each individual should work for himself. People will not sacrifice themselves for the company. They come to work at the company to enjoy themselves."
Soichiro Honda |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/02/2009 17:21:38
|
Jokabeludoido
JavaEvangelist
Membro desde: 23/08/2008 15:34:07
Mensagens: 305
Offline
|
louds wrote:Todos bancos de dados modernos possuem engines de otimização muito avançadas.
Isso é a norma a quase uma década, por sinal.
Pois é, eu realmente achei que tivesse ouvido falar disso em Bancos de dados 2, hehehe...O problema é que fz tempo e eu já não sabia se era coisa da minha cabeça. De qaulquer forma, tinha certeza que otimizavam, mas não em relação a que...No meu caso, por exemplo, não sabia se eles eram poderosos o suficiente para identificar essas redundâncias...
Valeu pelas respostas pessoal...Foram muito esclarecedoras. Essa da cláusula ON, por exemplo, é algo novo pra mim. Passei tempo demais trabalhando com computação científica, na qual boa parte do tempo eu precisava ler arquivos estruturados em formados específicos e trabalhar com tudo em memória...
|
|
|
 |
|
|
|
|