TRIM NA FRASE SQL DO ORACLE CAUSA LENTIDÃO

F001E 22/01/2016 12:10:54
#456386
Bom dia para todos.

tenho esse simples select mas com TRIM em COD_EMPRESA e COD_ITEM.
SELECT PRE_UNIT_ULT_COMPR FROM ITEM_SUP IT WHERE TRIM(COD_EMPRESA) = [ô]45[ô] AND TRIM(COD_ITEM) = [ô]1485AB[ô]
esse SQL demora 10 segundos para ser executado.

Se eu tirar os TRIM
SELECT PRE_UNIT_ULT_COMPR FROM ITEM_SUP IT WHERE COD_EMPRESA) = [ô]45[ô] AND COD_ITEM = [ô]1485AB[ô]
esse SQL leva 0,15 segundos para executar, ou seja, um raio.

Pergunta: é normal isso ?
Porque o uso do TRIM ?
R: Porque faço consulta em um ERP (Logix) onde pode acontecer desse ERP grava espaço em branco junto com o valor e já peguei um caso assim.
SINCLAIR 22/01/2016 14:34:00
#456392
Colega,

Não conheço a sintaxe no SQL Server, mas no PostGreSQL há o CAST para converter a string em número (no seu caso).

Problema é que o CAST provavelmente vai considerar como 0 (zero) algum código de empresa que tenha espaço em branco no início.

Se puderes, faz um teste.

Tudo de bom.
KERPLUNK 22/01/2016 18:04:05
#456404
Seu caso é mais complicado do que pode parecer à primeira vista. Quando você usa uma função como o trim, ela é aplicada à coluna inteira da tabela e não somente ao produto cartesiano. Ou seja, você está selecionando uma ou duas linhas, mas você precisa aplicar a função trim à coluna inteira. E quanto maior a tabela mais vai demorar. Quando passei por uma situação dessas, o que fiz foi recompor a cláusula where usando o espaço normalmente, ou seja, sem o trim, especificando as colunas e nelas sim aplicando o trim:

select trim(coluna1), coluna2, trim(coluna3) from tabela where (coluna1 = [ô] abc[ô] or coluna1 = [ô]abc[ô]) and (coluna3 = [ô] xyz[ô] or coluna3 = [ô]xyz[ô])
SINCLAIR 24/01/2016 09:45:57
#456448
Colega,

Em complemento ao que o colega Kerplunk escreveu, tente aplicar o Trim somente no resultado, usando uma subquery, ou seja, você seleciona sem o TRIM e apenas no resultado aplica a função de remoção de espaços.

Eu NÃO testei aqui, mas veja se funciona algo como...

SELECT Query01.* from
(SELECT PRE_UNIT_ULT_COMPR, COD_EMPRESA as C_EMP FROM ITEM_SUP IT WHERE COD_EMPRESA) = [ô]45[ô] AND COD_ITEM = [ô]1485AB[ô]) as Query01
WHERE
TRIM(C_EMP)=[ô]45[ô]


Tudo de bom.
F001E 25/01/2016 14:14:23
#456509
Estranho e eu não consigo entender. O TRIM esta no campo (COD_EMPRESA) e (COD_ITEM) e com isso o Select fica lerdo.
Se eu retirar o TRIM somente do campo (COD_EMPRESA) fica rápido, mas o (COD_EMPRESA) sempre e será 2 caracteres, tipo: 01,02,AB,A1, então não sei o porque desse TRIM no campo (COD_EMPRESA).
Tópico encerrado , respostas não são mais permitidas