Tenho a seguinte query que está sendo executada por um sistema ERP:
SELECT Cd_c_partida,
Cd_lancamento,
Valor,
Vl_saldo,
Vl_indexado,
Vl_saldo_indexa ,
rowid
FROM LANCAM
WHERE Cd_c_partida = 0
ORDER BY Cd_lancamento ASC
Ao executá-la acaba gerando um custo muito alto para o banco de dados, pois acaba fazendo um acesso Full na tabela. Tenho a mesma tabela em outro usuário Oracle com a metade dos registros (cerca de 400000), e o select acima utiliza o índice e executa a query com custo bem baixo.
Já recriei o índice, coletei estatísticas, mas o custo alto ainda existe… Alguém saberia como auxiliar?
Que colunas o índice abrange? Meu conhecimento limitado de banco diz que vc precisa de um índice que cubra as colunas (Cd_c_partida, Cd_lancamento) nessa ordem e não um índice separado para cada coluna. Se não for isso não sei oq é. Talvez o Oracle tenha as estatísticas dele e acredite que a query será executada mais rápida fazendo um Full Scan. Você pode obrigar ele a usar o index e ver se fica mais rápido e conferir se ele tava errado mesmo em usar o Full Scan (http://www.dba-oracle.com/t_force_index.htm)
O índice foi criado com estas colunas, o estranho que que em outro usuário Oracle com a mesma tabela e índices, o índice é utilizado…
Criei um índice para todos os campos do select citado acima, reduziu umas 9 vezes o custo para o banco.