Olá amigos.
Estou com a seguinte situação:
SC 8 + PostgreSQL 9.3
Tenho uma tela de consulta que busca dados de uma tabela que atualmente está com mais de 700 mil registros (e a tendência é crescer bem mais). Nesta tabela, tenho campos timestamp, até aí tudo bem, só que o SC quando preciso filtrar por data nestes campos faz desta forma:
SELECT arc_archive_date, arc_from_clean from archiving where to_char (arc_date_clean, ‘YYYY-MM-DD hh24:mi:ss’) between ‘2015-02-21 00:00:00’ and ‘2015-02-21 23:59:59’ order by arc_archive_date desc LIMIT 17 OFFSET 0
Este to_char que ele adiciona faz com que a consulta não faça uso dos índices existentes neste campo, tornando o tempo necessário para a consulta inviável. Pois bem, procurando dar uma solução de contorno para a questão, eu tentei deixar de lado o filtro padrão do SC e criei o meu próprio, onde através deste eu poderia criar a cláusula da maneira que eu julgasse eficiente. Criei um formulário de controle, onde neste formulário eu monto minha cláusula (semelhante ao próprio filtro da consulta), salvo cláusula gerada em uma sessão e chamo a consulta, esta por sua vez no evento onScriptInit verifica a existência da cláusula (variável de sessão) e a carrega através da macro sc_select_where conforme pode ser visto abaixo:
if (empty({sc_where_atual})){
sc_select_where(add) = [clausula];
}
O que ocorre é que eu monto a cláusula da maneira correta, porém, quando a passo para a consulta via sc_select_where, o SC a modifica voltando o tal do to_char que ignora o índice. Vejam:
Cláusula preparada pela minha aplicação de controle:
WHERE arc_date_clean >= ‘2015-02-21 00:00:00’ AND arc_date_clean <= ‘2015-02-21 23:59:59’ AND arc_search_to @@ to_tsquery(‘usuario@dominio.com.br’)
Como ela é processada pelo SC (verificado via debug):
where to_char (arc_date_clean, ‘YYYY-MM-DD hh24:mi:ss’) between ‘2015-02-21 00:00:00’ and ‘2015-02-21 23:59:59’ order by arc_archive_date desc LIMIT 17 OFFSET 0
O SC além de ter modificado a parte da pesquisa da data ainda jogou fora a parte que se refere ao campo arc_search_to.
Existe alguma forma do SC não modificar o que eu passo via parâmetro da macro sc_select_where? Simplesmente executar o que eu coloco lá ?
Alguma idéia meus caros(as) ?
Grato!
Erlon