| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 08:12:36
|
antoniopopete
Virtual Machine Man
Membro desde: 27/12/2006 02:37:31
Mensagens: 712
Localização: Salvador - BA
Offline
|
Como vocês otimizam suas query SQL?Existem boas práticas na construção de querys pesadas?
Por que não criar um forum sobre Banco de dados?
|
Antonio Lazaro
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 09:40:44
|
Eduardo Bregaida
Moderador
Membro desde: 13/11/2003 14:11:35
Mensagens: 2416
Localização: São Caetano do Sul - SP
Offline
|
antoniopopete wrote:Como vocês otimizam suas query SQL?Existem boas práticas na construção de querys pesadas?
Por que não criar um forum sobre Banco de dados?
Dá uma olhada aqui:
http://www.devmedia.com.br/canais/default.asp?site=37
Otimizar uma query é complicado, n tem nenhum DBA pra te auxiliar não? tem mtos fatores para ver antes de sair mexendo.
|
Blog - Java Anywhere
@bregaida - Twitter
Flickr - Fotos
Cursos de Java?
"Você poderia me dizer, por favor, qual caminho eu devo seguir?"
"Isto depende muito de onde você deseja chegar."
-Lewis Carroll, Alice no País das Maravilhas |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 09:44:12
|
antoniopopete
Virtual Machine Man
Membro desde: 27/12/2006 02:37:31
Mensagens: 712
Localização: Salvador - BA
Offline
|
É isso cara,mas queria o relato de alguém sobre quais são esses aspectos que devemos analisar antes de mudarmos uma query.
Sei que posição da tabela na chamada do from influencia.Mas queria saber outros fatore.s..
|
Antonio Lazaro
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 09:49:03
|
Eduardo Bregaida
Moderador
Membro desde: 13/11/2003 14:11:35
Mensagens: 2416
Localização: São Caetano do Sul - SP
Offline
|
1º se vc ta dando full table scan...
2º está rodando na aplicação ou no banco...
3º se for na aplicação, tem q ver se não é mto custoso, talvez fazer uma proc.
4º se já estiver no banco, veja os passos dela e tente simplificar, algumas vezes as pessoas fazem rapido e de qq forma apenas para entregar algo q tao enchendo o saco, dai já viu...
Analise começando por isso
|
Blog - Java Anywhere
@bregaida - Twitter
Flickr - Fotos
Cursos de Java?
"Você poderia me dizer, por favor, qual caminho eu devo seguir?"
"Isto depende muito de onde você deseja chegar."
-Lewis Carroll, Alice no País das Maravilhas |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 10:09:47
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Otimização de queries?
Normalmente você precisa usar alguma ferramenta do seu banco de dados para ver se você não está precisando usar algum índice.
Coisas que tornam suas aplicações lentas:
- Índices inadequados ou falta de índices.
- Excesso de índices se sua aplicação faz muitos INSERTS ou DELETES nessa tabela.
- Falta de chaves primárias nas tabelas.
- LIKE - evite "%XXX%" como a peste. Se precisar de LIKE por algum motivo, ponha o "%" apenas no final, ou seja, "XXX%" (que será convertido pela maioria dos bancos em algo parecido com "BETWEEN XXX AND XXX_". Se isso não puder ser evitado, então veja se a tabela vai ser muito grande. Se for muito grande, use alguma solução de "full text search" do seu banco - isso vai envolver o uso de algum SQL específico do banco para efetuar as queries de "full text search".
- Criação de SELECTs dinâmicos - é preferível usar PreparedStatements para os SELECTs, pois aí o banco pode criar um plano de execução para o SELECT. (Alguns bancos são mais espertos e reconhecem os selects dinâmicos, mas não conte com isso)
- Acessar o banco sem saber o que está fazendo.
- Se estiver usando Hibernate, tente usar LAZY em vez de EAGER.
Coisas que parecem que ajudam mas não muito:
- Mexer na ordem das condições do WHERE ou dos JOINs - normalmente os bancos de dados (exceto aqueles muito simples, como o HSQLDB) ignoram a ordem das condições do WHERE ou dos JOINs e usam alguma estatística do banco de dados e alguma heurística. Você precisa fazer alguma reza braba (como aqueles comentários /*+*/ do Oracle) para fazer com que ele faça do jeito que você acha que deve ser melhor (normalmente o banco é melhor nesse ponto).
- Deixar todas as colunas com tamanhos fixos (CHAR em vez de VARCHAR) - isso só ocupa espaço em disco e não acelera o acesso; muitas vezes até deixa mais lento porque o banco fica maior e menos dados cabem no cache.
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 11:18:24
|
Rafael Steil
Administrador
![[Avatar]](/images/avatar/8e296a067a37563370ded05f5a3bf3ec.jpg)
Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline
|
antoniopopete wrote:Por que não criar um forum sobre Banco de dados?
Banco de dados já foge bastante do tema do GUJ, além de não ter tanta demanda assim por aqui.
Rafael
|
"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"
http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 12:48:31
|
antoniopopete
Virtual Machine Man
Membro desde: 27/12/2006 02:37:31
Mensagens: 712
Localização: Salvador - BA
Offline
|
Rafael Steil wrote:
antoniopopete wrote:Por que não criar um forum sobre Banco de dados?
Banco de dados já foge bastante do tema do GUJ, além de não ter tanta demanda assim por aqui.
Rafael
Beleza Rafael.
Em relação ao que o thingol falou, achei que a ordem das chamadas no From e na condição where influenciasse de alguma forma o desempenho.Nem a ordem do from interessa?No caso do Oracle (o melhor dos melhores), ele deve organizar isso, concorda?
O que você chama de select dinâmicos?
|
Antonio Lazaro
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 13:18:48
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
SELECT dinâmico (na falta de um melhor nome) é aquele que você monta "no braço" e que você vê aqui no fórum em 99% dos casos em que o cara montou incorretamente a string e está com problemas de sintaxe ou outras coisas mais sutis:
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 13:32:11
|
antoniopopete
Virtual Machine Man
Membro desde: 27/12/2006 02:37:31
Mensagens: 712
Localização: Salvador - BA
Offline
|
É isso????????????????????
E como seria não dinâmico?
|
Antonio Lazaro
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 14:04:09
|
mendigosujo
JavaEvangelist
Membro desde: 24/09/2007 08:28:23
Mensagens: 326
Offline
|
acho que seria algo como
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 14:30:55
|
maniacs
JavaGuru
![[Avatar]](/images/avatar/44d47238d7d3e17aa176019eafac82af.jpg)
Membro desde: 05/07/2005 09:04:14
Mensagens: 240
Offline
|
mendigosujo wrote:acho que seria algo como
os parametros não necessitam serem fixos
|
Yuri Nascimento
Moderador GUJS |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 15:39:18
|
RodyBr
JavaBaby
![[Avatar]](/images/avatar/4216243dc99739e1c209df67dc2cdf9f.jpg)
Membro desde: 24/01/2007 08:59:12
Mensagens: 97
Localização: São Caetano do Sul
Offline
|
antoniopopete wrote:
Como vocês otimizam suas query SQL?Existem boas práticas na construção de querys pesadas?
Por que não criar um forum sobre Banco de dados?
Creio que na net já existam fóruns mais especializados só com o tema BD, no GUJ você vai encontrar auxilio com BD voltando para o Java. Mesmo porque o que você deseja é o que chamamos de "turning no banco de dados", e realmente pelo que conheço, isso é feito por um analista ou programador só voltado para o ambiente de SGBD, capaz de realizar análise minuciosa da performance das consultas e transações, e não um profissional que tenha também contato com o desenvolvimento de aplicações de negócio.
|
"Insistir, persistir, nunca desistir."
@Java e JEE desde 2002...
Blogger: http://bluewolfbr.blogspot.com
question reality |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/04/2008 17:29:29
|
foxpv
JavaEvangelist
![[Avatar]](/images/avatar/b68c8d589e6268e7283cc8230ae8f908.jpg)
Membro desde: 11/04/2006 09:35:56
Mensagens: 343
Offline
|
Aí vai o que os acadêmicos ensinam para otimizar uma query:
Primeiro - Construir a árvore canônica da query
Segundo - Selecionar o mais rápido possível
Terceiro - substituir as seleções de junção por JOIN
Quarto - Fazer as melhores escolhas quanto aos dados que serão selecionados/juntados primeiro
Quinto - Projetar somente os dados necessários
Sexto - transformar a árvore resultante na query otimizada
Se você não entende algum desses termos, sugiro que pesquise em algum fórum de BD. Porque mal mal eu entendo heheehheeh
|
SCJP 1.5 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/04/2008 00:49:26
|
boone
JWizard
![[Avatar]](/images/avatar/6a5dfac4be1502501489fc0f5a24b667.jpg)
Membro desde: 21/09/2003 16:01:35
Mensagens: 2140
Offline
|
antoniopopete wrote:
Rafael Steil wrote:
antoniopopete wrote:Por que não criar um forum sobre Banco de dados?
Banco de dados já foge bastante do tema do GUJ, além de não ter tanta demanda assim por aqui.
Rafael
Beleza Rafael.
Em relação ao que o thingol falou, achei que a ordem das chamadas no From e na condição where influenciasse de alguma forma o desempenho.Nem a ordem do from interessa?No caso do Oracle (o melhor dos melhores), ele deve organizar isso, concorda?
O que você chama de select dinâmicos?
Infelizmente a ordem no From afeta a consulta. Não deveria, afinal você está declarando ali todas as tabelas que devem ser usadas e cabe ao banco decidir através do plano de execução qual delas selecionar primeiro.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 10/03/2010 14:52:32
|
marvsc
What is classpath?
![[Avatar]](/images/avatar/7d81e8630c670ea086c1b633c19f3721.jpg)
Membro desde: 25/12/2009 19:07:37
Mensagens: 5
Offline
|
Boa tarde,
Vi respostas muito interessante nesse forum, o passo mais correto é analisar a query fazendo a arvore canonica, depois torcar junçoes por joins, etc (ta em qualquer livro d bd). Mas não é só isso. Esta é a forma "universal" de se otimizar uma query. Mas se quiser que a query fique "perfeita", tem q fazer tudo isso e ainda tem q entender profundamente sobre o sgbd q vc ta utilizando.
Um exemplo do q eu disse é o classico caso do MySQL. O MySQL tem problemas para tratar operações inteiras na comparação, portanto um passo importante seria tirar todas as clausulas "or" e montar um novo select com o "union". Mas esse é um dos casos do MySQL. Cada SGBD tem sua especialidade.
|
|
|
 |
|
|