Otimização de consulta EJBQL (banco Oracle)

5 respostas
F

Pessoal,

Tenho a seguinte query:

SELECT *
  FROM tabela1 TR, tabela2 FR
 WHERE TR.CTCDTRANSACAO = FR.CTCDTRANSACAO
   AND FR.CTFLSTATUS <> 'P'
   AND TR.CTCDPARCEIRO = 2000001
   AND TR.CTDTINICIOTRANSACAO >= TO_DATE('2010-12-13 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
   AND TR.CTCDTIPOTRANSACAO = 200
 ---->>>>  AND TR.CTCDSTATUSTRANSACAO+0 = 1  <<<------ Esta clausula...
   AND TR.CTCDTRANSACAOPENDENTE IS NULL
   AND FR.CTDTALTERADOEM >= TO_DATE('2010-12-13 00:00:00', 'yyyy-mm-dd hh24:mi:ss')
   AND FR.CTNUDDDTELEFONE = '0' || TR.CTDEDDDTELEFONERECARGA
   AND FR.CTNUTELEFONE = TR.CTDETELEFONERECARGA
 ORDER BY TR.CTCDTRANSACAO;

Preciso monta-la em EJBQL e estou com problemas na linha destacada.

Vejam abaixo exemplo que não funciona:

SELECT OBJECT(O) FROM tabela1 AS O, tabela2 AS F WHERE O.CODIGO = F.CODIGO AND F.STATUS <> 'P' AND O.CODIGOPARCEIRO = ? AND O.DATAINICIO >= ? AND O.CODIGOTIPOTRANSACAO = ? AND O.CODIGOSTATUS(+0) = 1 AND O.CODIGOTRANSACAOPENDENTE IS NULL AND F.ALTERADOEM >= ? AND F.DDDTELEFONE = CONCAT('0', O.DDDTELEFONERECARGA) AND F.TELEFONE = O.TELEFONERECARGA ORDER BY O.CODIGO

A pergunta é: como fazer a clausula destacada acima usando EJBQL ?

OBS.: ela também pode ficar da seguinte forma:

AND TR.CTCDSTATUSTRANSACAO||NULL = 1

Desde já agradeço

5 Respostas

V

Vc quer a consulta retorne apenas os resultados quando a coluna TR.CTCDSTATUSTRANSACAO = 1?

explica melhor…

F

valfrido.silva,

Sim! Isso mesmo!

Porém quero usar uma das opções abaixo (ou outra se antender minha necessidade):

" AND TR.CTCDSTATUSTRANSACAO+0 = 1 “
ou
” AND TR.CTCDSTATUSTRANSACAO||NULL = 1 "

Isso ("+0" ou “||NULL”) serve para que o oracle não considere o índice definido nesta coluna.
Assim, o desempenho desta query melhora substancialmente…

Grato

G

Olá!

Não sei se vai aceitar mas tenta definir o “CTCDSTATUSTRANSACAO = 1” normalmente sem essa gambi para não utilizar o índice e tenta forçar o Oracle a usar os índices definido por você com Hints assim:

SELECT /*+ INDEX(ALIAS NOME_DO_SEU_INDICE) */
FROM ....
....
F

Granella,

Não funciona…

Veja o exception:
org.jboss.ejb.plugins.cmp.ejbql.ParseException: Encountered “/” at line 1, column 18.
Was expecting:
“FROM” …

Obrigado

G

Olá,

Esqueci me mencionar que só funciona com o Weblogic, onde o mesmo possui uma biblioteca que extende os recursos do EJB-QL, bom nunca utilizei hints assim mas você pode tentar colocá-la com o query.setComment ou fazer uma view desse select com o hint ou com essa forma que fez para “matar” o índice e chamar a view no HQL/JPA QL.

Criado 17 de dezembro de 2010
Ultima resposta 20 de dez. de 2010
Respostas 5
Participantes 3