Performance em SELECT

10 respostas
bernardlcs

Galera Boa noite.

sou uma pessoa leiga nos conhecimentos de banco de dados…
o problema é o seguinte:

tenho uma tabela chamada “faturas” que tem cerca de 200 mil linhas e cada mes aumenta cerca de 10 mil.

uso uma query que busca alguns dados agrupando pela competencia do mês.
O problema que ela demora cerca de 11 segundos para processar.

a lógica do processo é o seguinte: selecionar [competencia do mes] ,[totalVidas], [totalitens - titulares], [dependentes]

segue:

select fa.competencia, 
(select count(distinct(certificado)) from faturas where competencia = fa.competencia AND substring(certificado from '.......$') != '0000/00') as totalVidas,
(select count(distinct(certificado)) from faturas where competencia = fa.competencia AND substring(certificado from '...$') = '/00') as totalitens   - 
(select count(distinct(certificado)) from faturas where competencia = fa.competencia AND substring(certificado from '.......$') = '0000/00') as titulares,
(select count(distinct(certificado)) from faturas where competencia = fa.competencia AND substring(certificado from '...$') != '/00') as dependentes


from faturas as fa


group by fa.competencia order by fa.competencia ASC

como posso aumentar minha performance nessa consulta??
obs.: meu Bando de Dados é o PostgreSQL

agradeço desde ja

10 Respostas

otaviojava

Você usa todos os dados em suas consulta ?
usa no periodo de um mês ?
A depender você pode fazer algo semelhante a um cash.

bernardlcs

posso usar todos os dados dessa tabela. só depende do usuario parametrizar o periodo.
como seria esse “cash”?

otaviojava

Deixar os dados importantes ou que se usa em um banco, ou deixar os dados já em um objeto na memória principal

otaviojava

Outra opção você pode fazer com que esse processo ocorra em um horário que ninguém use o sistema.
Se a fatura é mensal, basta você utilizar-lo uma vez na madrugada.

T

Não sei se o Postgree da suporte a isso, mas uma solução simples e eficiente pra isso é o uso de index…
Pesquisa indexada realmente melhora bastante a performance, já vi casos de uma consulta que demorava cerca de 20 minutos,
depois de “indexar” as tabelas não levar nem 2

bernardlcs

olá tiago1988

vc tem algum exemplo desse index? do banco que vc utiliza?
se tiver passa ai pra gente!
vlw

juliofsn

ìndices podem ser criados através de um comando sql comum, algo assim: CREATE INDEX nome_indice ON tabela_nome (coluna_nome);

no seu caso você deveria criar índices para as colunas “certificado” e “competencia” da tabela “faturas”. Mas existe um outro lado, os índices aumentam a performance dos selects, mas degradam a performance das operações de insert e update por conta da atualização do índice, na maioria das vezes isso nem é notado pelo usuário, mas cabe a você medir isso.

bernardlcs

Olá juliofsn

mas quando crio meu select preciso dizer qual o index? ou ja é automatico?

vlw

juliofsn

a partir do momento que você cria o índice, o select vai utilizá-lo, é automático.

bernardlcs

vlw gente pela a ajuda!

to usando o INDEX e ja ta reduzindo consideravelmente.

obrigado a todos!

Criado 4 de janeiro de 2011
Ultima resposta 4 de jan. de 2011
Respostas 10
Participantes 4