Melhorar performance com índices no select?

Firebird

06/02/2012

Pessoal, como melhoro a performance deste select, criando indices dos campos envolvidos, pois do jeito que está, não consigo executar este select quando são muitos dados no banco

SELECT CAST(SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5) AS VARCHAR(5)) AS CODIGO,
           CAST(financeiro_contas.boleto_valor AS DOUBLE PRECISION) AS VALOR_SISTEMA,
           CAST(tmp_obtemdadosexcel.valor AS DOUBLE PRECISION) AS VALOR_PLANILHA,
           CAST(Valor Diferente AS VARCHAR(255)) AS STATUS
      FROM financeiro_contas,tmp_obtemdadosexcel
     WHERE financeiro_contas.BOLETO_STATUS = Em Aberto
       AND financeiro_contas.BOLETO = Sim
       AND financeiro_contas.CANCELADO <> Sim
       AND financeiro_contas.BOLETO_MODALIDADE IN (Simples,Descontada)
       AND financeiro_contas.contrato = Sim
       AND tmp_obtemdadosexcel.codigo = SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5)
       AND tmp_obtemdadosexcel.valor <> financeiro_contas.boleto_valor
 UNION ALL
    SELECT CAST(SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5) AS VARCHAR(5)) AS CODIGO,
           CAST(financeiro_contas.boleto_valor AS DOUBLE PRECISION) AS VALOR_SISTEMA,
           CAST(0 AS double PRECISION) AS VALOR_PLANILHA,
           CAST(Não Existe na Planilha AS VARCHAR(255)) AS STATUS
      FROM financeiro_contas
     WHERE financeiro_contas.BOLETO_STATUS = Em Aberto
       AND financeiro_contas.BOLETO = Sim
       AND financeiro_contas.CANCELADO <> Sim
       AND financeiro_contas.BOLETO_MODALIDADE IN (Simples,Descontada)
       AND financeiro_contas.CONTRATO = Sim
       AND SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5)
           NOT IN (SELECT tmp_obtemdadosexcel.codigo
                     FROM tmp_obtemdadosexcel)
 UNION ALL
    SELECT CAST(tmp_obtemdadosexcel.codigo AS VARCHAR(5)) AS CODIGO,
           CAST(0 AS double PRECISION) AS VALOR_SISTEMA,
           CAST(tmp_obtemdadosexcel.valor AS DOUBLE PRECISION) AS VALOR_PLANILHA,
           CAST(Não Existe no Sistema AS VARCHAR(255)) AS STATUS
      FROM tmp_obtemdadosexcel
     WHERE tmp_obtemdadosexcel.codigo NOT IN (SELECT SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5)
                                                FROM financeiro_contas
                                               WHERE financeiro_contas.BOLETO_STATUS = Em Aberto
                                                 AND financeiro_contas.BOLETO = Sim
                                                 AND financeiro_contas.CANCELADO <> Sim
                                                 AND financeiro_contas.BOLETO_MODALIDADE IN (Simples,Descontada)
                                                 AND financeiro_contas.contrato = Sim ) 




Numa tabela com muitos dados simplesmente trava.

Se alguém souber também uma maneira de melhorar este select pode ser também, o que eu não posso aqui é ficar com o sistema travado, mais creio que se conseguir indexar este select vou ganhar muito na performance.

Obrigado.
Adriano Dolce

Adriano Dolce

Curtidas 0

Respostas

Adriano Dolce

Adriano Dolce

06/02/2012

Não sei o que esta dando errado para postar o CODE no forum
Vou tentar de novo
SELECT CAST(SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5) AS VARCHAR(5)) AS CODIGO,
           CAST(financeiro_contas.boleto_valor AS DOUBLE PRECISION) AS VALOR_SISTEMA,
           CAST(tmp_obtemdadosexcel.valor AS DOUBLE PRECISION) AS VALOR_PLANILHA,
           CAST(Valor Diferente AS VARCHAR(255)) AS STATUS
      FROM financeiro_contas,tmp_obtemdadosexcel
     WHERE financeiro_contas.BOLETO_STATUS = Em Aberto
       AND financeiro_contas.BOLETO = Sim
       AND financeiro_contas.CANCELADO <> Sim
       AND financeiro_contas.BOLETO_MODALIDADE IN (Simples,Descontada)
       AND financeiro_contas.contrato = Sim
       AND tmp_obtemdadosexcel.codigo = SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5)
       AND tmp_obtemdadosexcel.valor <> financeiro_contas.boleto_valor
 UNION ALL
    SELECT CAST(SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5) AS VARCHAR(5)) AS CODIGO,
           CAST(financeiro_contas.boleto_valor AS DOUBLE PRECISION) AS VALOR_SISTEMA,
           CAST(0 AS double PRECISION) AS VALOR_PLANILHA,
           CAST(Não Existe na Planilha AS VARCHAR(255)) AS STATUS
      FROM financeiro_contas
     WHERE financeiro_contas.BOLETO_STATUS = Em Aberto
       AND financeiro_contas.BOLETO = Sim
       AND financeiro_contas.CANCELADO <> Sim
       AND financeiro_contas.BOLETO_MODALIDADE IN (Simples,Descontada)
       AND financeiro_contas.CONTRATO = Sim
       AND SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5)
           NOT IN (SELECT tmp_obtemdadosexcel.codigo
                     FROM tmp_obtemdadosexcel)
 UNION ALL
    SELECT CAST(tmp_obtemdadosexcel.codigo AS VARCHAR(5)) AS CODIGO,
           CAST(0 AS double PRECISION) AS VALOR_SISTEMA,
           CAST(tmp_obtemdadosexcel.valor AS DOUBLE PRECISION) AS VALOR_PLANILHA,
           CAST(Não Existe no Sistema AS VARCHAR(255)) AS STATUS
      FROM tmp_obtemdadosexcel
     WHERE tmp_obtemdadosexcel.codigo NOT IN (SELECT SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5)
                                                FROM financeiro_contas
                                               WHERE financeiro_contas.BOLETO_STATUS = Em Aberto
                                                 AND financeiro_contas.BOLETO = Sim
                                                 AND financeiro_contas.CANCELADO <> Sim
                                                 AND financeiro_contas.BOLETO_MODALIDADE IN (Simples,Descontada)
                                                 AND financeiro_contas.contrato = Sim )
GOSTEI 0
Adriano Dolce

Adriano Dolce

06/02/2012

Aqui pra mim aparece todo desconfigurado meu select, vou postar sem o CODE o select

SELECT CAST(SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5) AS VARCHAR(5)) AS CODIGO,
CAST(financeiro_contas.boleto_valor AS DOUBLE PRECISION) AS VALOR_SISTEMA,
CAST(tmp_obtemdadosexcel.valor AS DOUBLE PRECISION) AS VALOR_PLANILHA,
CAST(Valor Diferente AS VARCHAR(255)) AS STATUS
FROM financeiro_contas,tmp_obtemdadosexcel
WHERE financeiro_contas.BOLETO_STATUS = Em Aberto
AND financeiro_contas.BOLETO = Sim
AND financeiro_contas.CANCELADO <> Sim
AND financeiro_contas.BOLETO_MODALIDADE IN (Simples,Descontada)
AND financeiro_contas.contrato = Sim
AND tmp_obtemdadosexcel.codigo = SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5)
AND tmp_obtemdadosexcel.valor <> financeiro_contas.boleto_valor
UNION ALL
SELECT CAST(SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5) AS VARCHAR(5)) AS CODIGO,
CAST(financeiro_contas.boleto_valor AS DOUBLE PRECISION) AS VALOR_SISTEMA,
CAST(0 AS double PRECISION) AS VALOR_PLANILHA,
CAST(Não Existe na Planilha AS VARCHAR(255)) AS STATUS
FROM financeiro_contas
WHERE financeiro_contas.BOLETO_STATUS = Em Aberto
AND financeiro_contas.BOLETO = Sim
AND financeiro_contas.CANCELADO <> Sim
AND financeiro_contas.BOLETO_MODALIDADE IN (Simples,Descontada)
AND financeiro_contas.CONTRATO = Sim
AND SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5)
NOT IN (SELECT tmp_obtemdadosexcel.codigo
FROM tmp_obtemdadosexcel)
UNION ALL
SELECT CAST(tmp_obtemdadosexcel.codigo AS VARCHAR(5)) AS CODIGO,
CAST(0 AS double PRECISION) AS VALOR_SISTEMA,
CAST(tmp_obtemdadosexcel.valor AS DOUBLE PRECISION) AS VALOR_PLANILHA,
CAST(Não Existe no Sistema AS VARCHAR(255)) AS STATUS
FROM tmp_obtemdadosexcel
WHERE tmp_obtemdadosexcel.codigo NOT IN (SELECT SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5)
FROM financeiro_contas
WHERE financeiro_contas.BOLETO_STATUS = Em Aberto
AND financeiro_contas.BOLETO = Sim
AND financeiro_contas.CANCELADO <> Sim
AND financeiro_contas.BOLETO_MODALIDADE IN (Simples,Descontada)
AND financeiro_contas.contrato = Sim )
GOSTEI 0
Adriano Dolce

Adriano Dolce

06/02/2012

Resolvi criando uma tabela temporaria

Primeiro crio uma tmp e insiro os dados da tabela financeiro pra dentro dela
insert into tmp_financeiro_contas (CODIGO, VALOR_SISTEMA)
SELECT SUBSTRING(financeiro_contas.boleto_seu_numero FROM 1 FOR 5),
financeiro_contas.boleto_valor
FROM financeiro_contas
WHERE financeiro_contas.BOLETO_STATUS = Em Aberto
AND financeiro_contas.BOLETO = Sim
AND financeiro_contas.CANCELADO <> Sim
AND financeiro_contas.BOLETO_MODALIDADE IN (Simples,Descontada)
AND financeiro_contas.contrato = Sim

Ai trabalho com a TMP no select
SELECT CAST(tmp_financeiro_contas.codigo AS VARCHAR(5)) AS CODIGO,
CAST(tmp_financeiro_contas.valor_sistema AS DOUBLE PRECISION) AS VALOR_SISTEMA,
CAST(tmp_obtemdadosexcel.valor AS DOUBLE PRECISION) AS VALOR_PLANILHA,
CAST(Valor Diferente AS VARCHAR(255)) AS STATUS
FROM tmp_financeiro_contas,tmp_obtemdadosexcel
WHERE tmp_obtemdadosexcel.codigo = tmp_financeiro_contas.codigo
AND tmp_obtemdadosexcel.valor <> tmp_financeiro_contas.valor_sistema
UNION ALL
SELECT CAST(tmp_financeiro_contas.codigo AS VARCHAR(5)) AS CODIGO,
CAST(tmp_financeiro_contas.valor_sistema AS DOUBLE PRECISION) AS VALOR_SISTEMA,
CAST(0 AS double PRECISION) AS VALOR_PLANILHA,
CAST(Não Existe na Planilha AS VARCHAR(255)) AS STATUS
FROM tmp_financeiro_contas
WHERE (tmp_financeiro_contas.codigo)
NOT IN (SELECT tmp_obtemdadosexcel.codigo
FROM tmp_obtemdadosexcel)
UNION ALL
SELECT CAST(tmp_obtemdadosexcel.codigo AS VARCHAR(5)) AS CODIGO,
CAST(0 AS double PRECISION) AS VALOR_SISTEMA,
CAST(tmp_obtemdadosexcel.valor AS DOUBLE PRECISION) AS VALOR_PLANILHA,
CAST(Não Existe no Sistema AS VARCHAR(255)) AS STATUS
FROM tmp_obtemdadosexcel
WHERE tmp_obtemdadosexcel.codigo NOT IN (SELECT tmp_financeiro_contas.codigo
FROM tmp_financeiro_contas )

Parece que ficou instantâneo
GOSTEI 0
Diego Lusa

Diego Lusa

06/02/2012

Além do uso de índices, evite ao máximo utilizar as cláusulas IN e NOT IN quando o subselect retornar um conjunto muito grande de dados. Dê preferência à construção EXISTS e NOT EXISTS.
GOSTEI 0
POSTAR