porque esta declaração no oracle é muito mais lenta que ms sql

1

Eu tentei executar um teste simples para ver como a velocidade justa entre oracle e Ms Sql da seguinte forma: preencha duas tabelas com 2 milhões de registros, cruze-as, filtre por um intervalo e faça uma soma. Ambos estrutura de mesa como companheiro:

create table t (
record number,
name , varchar(50),
num number //--random
)

SQL como:

select sum(a.record) 
from test a cross join test b 
where a.num between 50001 and 80000 and b.num between 80001 and 110000

De alguma forma, a mesma consulta em execução no oracle tem um desempenho ruim quando comparada com o Ms sql. No oracle, o tempo de cerca de 20s, mas em Ms Sql, o resultado retorna dentro de 1s. À medida que eu aumentei o range, o tempo no oracle se degradou enquanto o sql ainda estava bem.

Configuração do Oracle: instância única de 11g em uma máquina de red hat Configuração do Ms sql: 2008 no win7

Tente a declaração em oracles xe, ganhe 7, o resultado também varia em torno de 20s. Todas as consultas feitas em uma única máquina.

A declaração no oracle deve ser escrita de forma diferente? Gostaria de saber se alguém pode fornecer alguma visão?

Obrigado

    
por sysadmin1138 30.09.2010 / 04:25

4 respostas

3

Tem certeza de que seus índices estão sendo usados? O que o EXPLAIN PLAN informa sobre a consulta com os índices em vigor? Só porque existe um índice não significa que o Oracle irá usá-lo. Se as estatísticas não forem criadas / atualizadas, o índice provavelmente não será usado.

Veja o pacote DBMS_STATS , em particular GATHER_TABLE_STATS para mais informações.

Algo tão simples quanto

BEGIN
  dbms_stats.gather_table_stats('<schema_owner>', 'TEST');
END;
/

Poderia resolver seu problema.

Observe que '<schema_owner>' faz distinção entre maiúsculas e minúsculas. A menos que você tenha feito o contrário, será maiúsculo.

    
por 30.09.2010 / 22:07
0
Presumivelmente, o Oracle está jogando bem e ficando dentro de sua sandbox, enquanto o MSSQL está assumindo o controle de sua máquina. Ou seja, o MSSQL está trabalhando quase inteiramente fora da memória RAM / cache, enquanto a Oracle precisa acessar o disco. Tente aplicar algumas otimizações básicas para ambos e aposto que o problema desaparece.

    
por 30.09.2010 / 07:47
0

Você poderia perguntar ao Oracle via 'Metalink'. Ou, se você não tiver uma conta do Metalink, provavelmente haverá uma forma de os clientes em potencial fazerem esse tipo de pergunta, especialmente se você se tornar um grande usuário.

O desempenho é o fator mais importante para você na escolha do DBMS e que tipo de carga de trabalho você provavelmente executará na produção? Você pode achar que a escolha do hardware tem um impacto maior no desempenho do que a escolha do DBMS.

    
por 30.09.2010 / 11:16
0

Aqui está a saída depois de executar gather_table_stats e explicar plano

SQL> BEGIN
  2   dbms_stats.gather_table_stats('hr', 'TEST');
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL>explain plan for select count(*) from hr.test a join hr.test b 
on a.noofrecord between 50001 and 60000 and b.noofrecord between 80001 and 90000;

[IMG] link

parece que nenhum filtro foi feito antes da junção?

    
por 04.10.2010 / 04:31