Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cavallari74

Otimizar Select

Recommended Posts

Pessoal,

 

tenho uma tabela com pouco menos de 5 mil registros e a seguinte consulta:

select DATE_FORMAT(dataCCL, '%m-%Y') AS periodo,
(select count(ostbs) from cadastro_os where gerente = 'SME' and DATE_FORMAT(dataCCL, '%m-%Y') = periodo and servico = 'CONTRATO FECHADO') as SME,
(select count(ostbs) from cadastro_os where gerente = 'Carrier' and DATE_FORMAT(dataCCL, '%m-%Y') = periodo and servico = 'CONTRATO FECHADO') as CARRIER,
(select count(ostbs) from cadastro_os where gerente = 'Corporate' and DATE_FORMAT(dataCCL, '%m-%Y') = periodo and servico = 'CONTRATO FECHADO') as CORPORATE
from cadastro_os WHERE YEAR(dataCCL) = '2009' and servico = 'CONTRATO FECHADO' and status = 'Aprovado'
GROUP BY periodo;

Esta consulta leva mais de 1 minuto pra retornar o resultado, como posso otimizar?

Desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie indices nos campos "dataCCL" e "servico".

Indices nao numericos sao lentos, mas vai melhorar bastante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie indices nos campos "dataCCL" e "servico".

Indices nao numericos sao lentos, mas vai melhorar bastante.

Fiz isso amigo, ganhei em torno de 15 segundos, mas ainda está levando ao total uns 50 segundos pra executar.

Apesar do resultado do select retornar poucas informações ele fica pesado demais, fiz um teste criando uma view pra cada select depois juntar tudo em outra view para apresentar o resultado e ficou ótimo, 6 segundos pra processar.

Mas sinceramente, 4 views pra representar o select acima é muita coisa, com certeza estou errando por falta de conhecimento, mas deve haver uma solução mais simples.

Valeu pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pesquisas em campos texto são mesmo muito lentas. Strings também, embora não tanto quanto datas.

O ideal é você fazer pesquisa por campos inteiros. Você ainda utiliza manipulação de data na pesquisa, o que torna mais pesado...

Crie um campo com o inteiro do mês, ano e dia, e utilize eles apenas para pesquisa. Remova os indices criados e crie indices nestes novos campos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse select eh uma imbecilidade interplanetaria por si soh pois gira a tabela 3 vezes e no final ainda tem um group by pra terminar de engordar a consulta, como uma cereja num sorvete.

 

 

 

select DATE_FORMAT(dataCCL, '%m-%Y') AS periodo,

gerente

count(ostbs) from cadastro_os

where

gerente IN('SME','Carrier','Corporate')

and DATE_FORMAT(dataCCL, '%m-%Y') = periodo

and servico = 'CONTRATO FECHADO'

and YEAR(dataCCL) = '2009'

and status = 'Aprovado'

GROUP BY periodo, periodo;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse select eh uma imbecilidade interplanetaria por si soh pois gira a tabela 3 vezes e no final ainda tem um group by pra terminar de engordar a consulta, como uma cereja num sorvete.

 

 

 

select DATE_FORMAT(dataCCL, '%m-%Y') AS periodo,

gerente

count(ostbs) from cadastro_os

where

gerente IN('SME','Carrier','Corporate')

and DATE_FORMAT(dataCCL, '%m-%Y') = periodo

and servico = 'CONTRATO FECHADO'

and YEAR(dataCCL) = '2009'

and status = 'Aprovado'

GROUP BY periodo, periodo;

beleza amigo, gostei da "imbecibilidade interplanetaria", mas é assim mesmo quando se está começando, buscamos resultados por caminhos mais complicados.

A consulta retorna dizendo que não existe a coluna "periodo" na clausula where.

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

A se foi você q fez, me desculpe , mas isso tem mta cara de query feita por programinha

 

 

 

select DATE_FORMAT(dataCCL, '%m-%Y') AS periodo,

gerente

count(ostbs) from cadastro_os

where

gerente IN('SME','Carrier','Corporate')

and servico = 'CONTRATO FECHADO'

and YEAR(dataCCL) = '2009'

and status = 'Aprovado'

GROUP BY periodo, gerente;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sem estresse, to aqui pra aprender mesmo.

O select funcionou perfeitamente, mas de uma forma diferente do que estou querendo mostrar.

A intenção é mostrar os campos SME, CARRIER e CORPORATE em colunas, abaixo um comparativo:

Com o seu select o resultado retorna assim:

 

periodo | gerente | count

-----------------------------

01-2009 carrier 10

01-2009 corporate 20

01-2009 sme 30

 

Preciso assim:

periodo | carrier | corporate | sme

--------------------------------------------

01-2009 10 20 15

02-2009 20 30 10

03-2009 30 15 20

 

Valeu pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal,

encontrei outra alternativa, que me retorna o mesmo resultado e ainda consigo puxar as informações de todos os anos, este select executa em menos de 2 segundos:

 

select DATE_FORMAT(dataCCL, '%m-%Y') as periodo, month(dataCCL) as mes, year(dataCCL) as ano,
sum(case when servico = 'CONTRATO FECHADO' and status = 'APROVADO' and GERENTE = 'SME' then 1 else 0 end) as sme,
sum(case when servico = 'CONTRATO FECHADO' and status = 'APROVADO' and GERENTE = 'carrier' then 1 else 0 end) as carrier,
sum(case when servico = 'CONTRATO FECHADO' and status = 'APROVADO' and GERENTE = 'corporate' then 1 else 0 end) as corporate
from cadastro_os
group by ano, mes;

Alem de substituir a subconsulta por "case" adicionei outros filtros que precisei, o resultado foi excelente.

Se alguém timer uma idéia mais resumida por favor poste aqui, se tudo der certo amanhã fecho este tópico.

Abç a todos e obrigado pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.