Melhorar performance com índices no select?
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
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.
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
Curtidas 0
Respostas
Adriano Dolce
06/02/2012
Não sei o que esta dando errado para postar o CODE no forum
Vou tentar de novo
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
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 )
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
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
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
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