Estou fazendo uma rotina para preencher algumas tabelas com dados de outras tabelas (de bancos diferentes). E gostaria de saber se o java (jdbc puro) ficara muito mais lento que um script pl/sql. Lembrando que existem loops dentro de loops nessa rotina.
Mas nem sempre, tem até um artigo aqui no GUJ que retrata um caso desses onde o java foi mais rápido.
Teria que analisar com mais calma para poder ter certeza.
Os dois “bancos” que vc diz representam dois bancos mesmo? Ou dois usuários diferentes ?
Dois bancos em mesma máquina, ou maquina remota ?
Tudo depende, tem até estratégias para poder relacionar tabelas de diferentes bancos remotos com maior performance.[/quote]
são 2 bancos diferentes…o de origem e o de destino…estou fazendo alguns testes e ele esta demorando bem mais que um script pl/sql…e estou usando somente DAO e jdbc puro. Eu já verifiquei e não estou instanciando classes desnecessáriamente. A parte onde demora muito é onde tem um loop dentro de outro loop, q por sua vez, tem outro loop dentro. O estranho é que no pl/sql não demora muito para fazer a mesma lógica.
Muitas vezes, de acordo com as maquinas fisicas, o job pl/sql fica mais rapido prq ele evita comunicação via socket entre a rede. Já que este estara na mesma maquina do banco de dados.
Na verdade a criação de um, dois três objetos a mais não não ter qualquer diferença significativa para seu processo.
O que conta realmente é a quantidade de I/O executada tanto no processo de busca nos bancos de dados (busca feito em disco físico pelo oracle - dados que não estão em memória), quanto no transporte de dados entre o banco e o cliente.
O oracle tentará ao máximo diminuir esses I/Os em um pl/sql, enquanto em um processo java isso é ditado pelo desenvolvedor.
Muitas vezes, de acordo com as maquinas fisicas, o job pl/sql fica mais rapido prq ele evita comunicação via socket entre a rede. Já que este estara na mesma maquina do banco de dados.[/quote]
Acho que talvez seja isso, pois estou na minha máquina testanto através de um conexão via nat e talvez pelo pl/sql seja mais inteligente nesse sentido.
Aqui, em um das maiores companias de telecom do Brasil, o pl/sql é nosso padrão de desenvolvimento para jobs do tipo ETL, justamente por já estar comprovado a diferença de performance pela comunicação via socket. Obviamente o comentario do nbluis é bem valido, pois otimizações utilizando as funções use_order, use_hash do oracle são sempre bem vindas, ou mesmo a troca de possições das clausulas where pode aumentar consideravelmente a performance, pois uma query no oracle é lida de baixo para cima, logo o que for gerar um full scan deve ficar por como as primeiras clausulas para que o scan seja feito em dados filtrados.
Registrando.
Com o Oracle trabalhando por análise de custo, é indiferente a ordenação das colunas, junções e filtros de um comando sql.
Esta opção é a default a partir da versão Oracle 9i(se não me engano).