Melhorando uma Consulta SQL em FireBird
16/01/2016
0
Tenho um SQL que está demorando muito para mostra o resultado na tabela que mais vai ser utiliza tem mais de 50.000 de registros e preciso de uma consulta que me retorne o processo e os 10 últimos andamentos desse processo (Tabela de Andamentos com index "IDX_ANDAMENTOS_PROCESSUAIS") segue abaixo o SQL
SELECT T1.NUMERO_PROCESSO, T1.DATA_ESCRITORIO, T1.STATUS, T1.TITULO_DESCRICAO, T2.NOME_CLIENTE, T2.NOME_UNIDADE, T1.PARTE_CONTRARIA, T1.ADVOGADO_DILIGENTE, T1.ADVOGADO_PARTE_CONTRARIA, T1.TIPO_ACAO1 AS TIPO_ACAO, T1.FASE_PROCESSO, T1.OBSERVACAO, T3.CODIGO_ANDAMENTO, T3.DATA, T3.HORA, T3.ATO_FATURAVEL, T3.DESCRICAO_ANDAMENTO, T3.OBSERV_ANDAM FROM PROCESSOS T1 LEFT JOIN (SELECT FIRST 10 V1.NUMERO_PROCESSO, V1.CODIGO_ANDAMENTO, V1.DATA, V1.HORA, V1.ATO_FATURAVEL, V1.DESCRICAO_ANDAMENTO, V1.OBSERVACAO AS OBSERV_ANDAM FROM ANDAMENTOS_PROCESSUAIS V1, PROCESSOS V2 WHERE V1.NUMERO_PROCESSO = V2.NUMERO_PROCESSO ORDER BY V1.CODIGO_ANDAMENTO DESC) T3 ON T1.NUMERO_PROCESSO = T3.NUMERO_PROCESSO, CLIENTES T2 WHERE T1.COD_CLIENTE = T2.COD_CLIENTE
ele leva de 10 a 20 minutos e as vezes trava tudo teria como melhorar essa SQL? Como?
Eduardo Mendonça
Posts
17/01/2016
Ruy Salles
SELECT
FIRST 10 T1.NUMERO_PROCESSO,
T1.DATA_ESCRITORIO,
T1.STATUS,
T1.TITULO_DESCRICAO,
T2.NOME_CLIENTE,
T2.NOME_UNIDADE,
T1.PARTE_CONTRARIA,
T1.ADVOGADO_DILIGENTE,
T1.ADVOGADO_PARTE_CONTRARIA,
T1.TIPO_ACAO1 AS TIPO_ACAO,
T1.FASE_PROCESSO,
T1.OBSERVACAO,
V1.CODIGO_ANDAMENTO,
V1.DATA,
V1.HORA,
V1.ATO_FATURAVEL,
V1.DESCRICAO_ANDAMENTO,
V1.OBSERV_ANDAM
FROM
PROCESSOS T1
LEFT JOIN ANDAMENTOS_PROCESSUAIS V1
ON V1.NUMERO_PROCESSO = T1.NUMERO_PROCESSO
INNER JOIN CLIENTES T2
ON T1.COD_CLIENTE = T2.COD_CLIENTE
ORDER BY V1.CODIGO_ANDAMENTO DESC
espero ter ajudado
18/01/2016
Eduardo Mendonça
19/01/2016
Ruy Salles
SELECT
T1.NUMERO_PROCESSO,
T1.DATA_ESCRITORIO,
T1.STATUS,
T1.TITULO_DESCRICAO,
T2.NOME_CLIENTE,
T2.NOME_UNIDADE,
T1.PARTE_CONTRARIA,
T1.ADVOGADO_DILIGENTE,
T1.ADVOGADO_PARTE_CONTRARIA,
T1.TIPO_ACAO1 AS TIPO_ACAO,
T1.FASE_PROCESSO,
T1.OBSERVACAO,
V1.CODIGO_ANDAMENTO,
V1.DATA,
V1.HORA,
V1.ATO_FATURAVEL,
V1.DESCRICAO_ANDAMENTO,
V1.OBSERV_ANDAM
FROM
PROCESSOS T1
LEFT JOIN ANDAMENTOS_PROCESSUAIS V1
ON V1.NUMERO_PROCESSO = T1.NUMERO_PROCESSO
AND V1.CODIGO_ANDAMENTO IN (SELECT FIRST 1O CODIGO_ANDAMENTO
FROM ANDAMENTOS_PROCESSUAIS V2
WHERE V2.CODIGO_ANDAMENTO = V1.CODIGO_ANDAMENTO
ORDER BY V2.CODIGO_ANDAMENTO DESC)
INNER JOIN CLIENTES T2
ON T1.COD_CLIENTE = T2.COD_CLIENTE
Espero ter ajudado
19/01/2016
Marcos P
Tente adaptar sua consulta a algo mais direto, conforme sugerido pelo Ruy, ou utilize uma tabela temporária para auxiliá-lo.
Outra coisa que pode ajudar é revisar a estrutura de índices que atende essa sua consulta.
Eventualmente, criar índices específicos para suportar esse consulta, pode ser uma boa estratégia.
19/01/2016
Alex Lekao
Ou usar um select que traz os dados principais e depois um outro select para manipular os dados para o resultado final(esqueci o nome dado a isso. rsrsr).
Basicamente Assim:
SELECT T1.CAMPO, T1.CAMPO2, T1.CAMPO*CAMPO2 AS TOTAL FROM (SELECT CAMPO, CAMPO2, CAMPO3, CAMPO4 FROM TABELA WHERE X = Y ) AS T1 WHERE Z > 1
nao sei se me fiz entender, desculpe se atrapalhei.
20/01/2016
Huidemar Costa
with t3 as ( SELECT FIRST 10 V1.NUMERO_PROCESSO, V1.CODIGO_ANDAMENTO, V1.DATA, V1.HORA, V1.ATO_FATURAVEL, V1.DESCRICAO_ANDAMENTO, V1.OBSERVACAO AS OBSERV_ANDAM FROM ANDAMENTOS_PROCESSUAIS V1 inner join PROCESSOS V2 on (V1.NUMERO_PROCESSO = V2.NUMERO_PROCESSO) ORDER BY V1.CODIGO_ANDAMENTO DESC ) SELECT T1.NUMERO_PROCESSO, T1.DATA_ESCRITORIO, T1.STATUS, T1.TITULO_DESCRICAO, T2.NOME_CLIENTE, T2.NOME_UNIDADE, T1.PARTE_CONTRARIA, T1.ADVOGADO_DILIGENTE, T1.ADVOGADO_PARTE_CONTRARIA, T1.TIPO_ACAO1 AS TIPO_ACAO, T1.FASE_PROCESSO, T1.OBSERVACAO, T3.CODIGO_ANDAMENTO, T3.DATA, T3.HORA, T3.ATO_FATURAVEL, T3.DESCRICAO_ANDAMENTO, T3.OBSERV_ANDAM FROM PROCESSOS T1 LEFT JOIN T3 ON (T1.NUMERO_PROCESSO = T3.NUMERO_PROCESSO) inner join CLIENTES T2 on (T1.COD_CLIENTE = T2.COD_CLIENTE)
Clique aqui para fazer login e interagir na Comunidade :)