| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/06/2010 09:36:48
|
partenon
JavaChild
Membro desde: 27/06/2010 15:08:10
Mensagens: 103
Localização: Brno, Czech Republic
Offline
|
Pensando um pouco mais sobre seu problema, eu vejo tres possiveis alternativas para serem testadas:
1) Use "group by" ao inves do distinct:
2) Crie uma nova tabela chamada "DATA_ARQUIVO_FORNECEDOR", popule esta tabela com uma consulta parecida com a acima e depois crie uma trigger na tabela CADCTRL.GDD para inserir um registro na DATA_ARQUIVO_FORNECEDOR caso a data nao exista para o fornecedor em questao. Entao, na sua aplicacao, vc seleciona a partir desta nova tabela.
3) Caso nenhuma das acima seja viavel/possivel, vc pode ler sobre "query caching" no Hibernate. Mas para isso funcionar direito, voce deve ter pouco movimento na tabela CADCTRL.GDD e ela deve sofrer alteracoes apenas por sua aplicacao.
Caso nenhuma das tres seja possivel/viavel, entao realmente acho que vc precisa consultar um profissional Oracle
|
http://www.google.com/profiles/partenon |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/06/2010 17:01:05
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
entanglement wrote:Você precisa consultar o DBA Oracle da tal empresa para checar se um índice
DATA_ARQUIVO_FONTE + FORNECEDOR + sei lá o quê
ou coisa parecida pode melhorar o resultado da sua consulta. (Eu sou um zero à esquerda em SQL, portanto não sei exatamente que consulta seria boa para essa sua situação em particular.) Deve haver algum índice que não piore os resultados das inserções/atualizações em geral, e melhore sua consulta em particular.
Ok.. pensei em algumas coisas. Como limitar a consulta para o último mês somente, para ver se resolve. Se fosse necessário fazer uma consulta extensiva, o cara selecionava para buscar os registros de todos os anos. Preciso testar algum critério desse tipo.
This message was edited 1 time. Last update was at 29/06/2010 17:11:18
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/06/2010 17:09:35
|
diego_qmota
JavaEvangelist
![[Avatar]](/images/avatar/e355819c0931a90b594aeb8d6a73587f.jpg)
Membro desde: 28/09/2008 15:44:35
Mensagens: 346
Localização: Paulínia
Offline
|
partenon wrote:Pensando um pouco mais sobre seu problema, eu vejo tres possiveis alternativas para serem testadas:
1) Use "group by" ao inves do distinct:
Eu já tinha tentado essa tática mas deu na mesma...
partenon wrote:
2) Crie uma nova tabela chamada "DATA_ARQUIVO_FORNECEDOR", popule esta tabela com uma consulta parecida com a acima e depois crie uma trigger na tabela CADCTRL.GDD para inserir um registro na DATA_ARQUIVO_FORNECEDOR caso a data nao exista para o fornecedor em questao. Entao, na sua aplicacao, vc seleciona a partir desta nova tabela.
Essa idéia parece boa... na hora de atualizar, geralmente insiro 10 mil registros diários. Acho que não haverá grandes problemas em colocar um trigger.
partenon wrote:
3) Caso nenhuma das acima seja viavel/possivel, vc pode ler sobre "query caching" no Hibernate. Mas para isso funcionar direito, voce deve ter pouco movimento na tabela CADCTRL.GDD e ela deve sofrer alteracoes apenas por sua aplicacao.
Funciona dessa forma: Ao clicar em um botão, a aplicação atualiza uma lista (JList) com os nomes dos arquivos txt que preciso importar. Para esse processo, ele roda a consulta. Atualmente só a aplicação que faz a atualização e só por via de uma operação, mas eventualmente pode ser necessária carga manual (imprevistos ou quando são migrados de outra fonte). Por isso que tava querendo evitar usar algum cache - mas não estou vendo muita saída. Talvez um cache seria uma boa alternativa.
This message was edited 1 time. Last update was at 29/06/2010 17:13:27
|
"Go ahead, make my day!" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/06/2010 18:05:04
|
clone_zealot
JavaEvangelist
Membro desde: 21/11/2004 16:40:00
Mensagens: 424
Offline
|
Se eu entendi certo, somente a sua aplicação altera esta tabela, certo?
Então não há necessidade de se criar uma trigger para isso. Basta vc cuidar na sua aplicação mesmo os pontos de INSERT nessa tabela, e popular essa nova tabela.
Eu até faria de uma maneira um pouco diferente está ideia: criaria está outra tabela tabela, mas não duplicaria a informação do caminho do arquivo. Faria a tabela GDD ter uma FK apontando para a tabela DATA_ARQUIVO_FONTE e somente nesta ter a informação do caminho do arquivo. Mas isto é como eu faria. Vc deve fazer como melhor lhe convier.
|
"Não amo a espada por sua agudez,
não amo a flecha por sua rapidez,
não amo o homem por sua glória,
amo sim, tudo o que eles defendem"
Faramir, Príncipe de Ithilien |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 29/06/2010 20:18:43
|
claudiom
Thread.start()
![[Avatar]](/images/avatar/b5d01dac334459254cf227a09ea0b9eb.jpg)
Membro desde: 11/01/2010 21:11:07
Mensagens: 46
Offline
|
algumas dúvidas (e sugestões):
- que indices você criou para esta tabela?
criando um indice utilizando os campos retornados + os campos filtrados a consulta se resumiria ao indice, o que deveria retornar rapidamente (leria bem menos blocos)
- já analisou o plano de execução desta query?
possivelmente ele pode estar dando um table scan, que numa tabela desse tamanho é terrível
se for testar o plano recomendo criar uma versão menor desta tabela (100k registros), para agilizar os testes.
- você tem acesso full a este banco? tem usuário para rodar qualquer comando?
pode mandar atualizar estatísticas da tabela e fazer testes com indices.
mas isso num horário de pouco movimento, pois criar um indice nessa tabela deve demorar muito.
- que edição/ versão de oracle está utilizando?
dependendo da edição/versão você pode criar uma materialized view com esta query.
seria a mesma coisa de criar esta tabela auxiliar, mas o oracle se encarregaria de mantê-la atualizada de tempos em tempos...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 30/06/2010 06:14:29
|
pmlm
GUJ Master
Membro desde: 20/04/2009 12:20:07
Mensagens: 1199
Localização: Portugal
Offline
|
Precisas realmente de aceder a tantos milhões de registos? Não há informação a mais que deveria ir passando para histórico?
|
|
|
 |
|
|