Jump to content
Fivewin Brasil

lentidão num select


Luiz Fernando

Recommended Posts

Colegas veja o select abaixo

cSql="SELECT pe.produto,sum(pe.qtd),sum(pe.qtd*pe.valor),gr.codigo,gr.nome"
cSql+=",count(*),pr.descricao,pe.vendedor,vn.nome"
cSql+=" FROM pedido as pe, produto as pr, grupo as gr, vendedor as vn"
cSql+=" WHERE pe.data >= "+Any2Sql(cGet[1])
cSql+=" AND pe.data <= "+Any2Sql(cGet[2])
cSql+=" AND pe.tipo='1'"
cSql+=" AND pe.vendedor = vn.codigo"
cSql+=" AND pe.produto = pr.codigo AND pr.grupo = gr.codigo"
if cGet[3]<>'999'
   cSql+=" AND pe.vendedor ='"+cGet[3]+"'"
endif
if nOperacao=1
   cSql+=" AND pe.operacao<>2"
else
   cSql+=" AND pe.operacao<>1"
endif
cSql+=" GROUP BY pe.vendedor,pr.codigo"

se a variavel cGet[3] for igual '999' este select é exibido em 15 segundos, agora caso contrario leva 14 minutos, achei estranho um filtro a mais levar dando tempo a mais desta forma, alguém teria alguma dica.

Obrigado

Link to comment
Share on other sites

Luiz eu faria assim:

//-> antes do select

local cOper := space(1)
if nOperacao=1
cOper := "1"
else
cOper := "2"
endif


cSql := "SELECT pe.produto," +;
"SUM(pe.qtd)," +;
"SUM(pe.qtd*pe.valor) AS preco," +;
"gr.codigo," +;
"gr.nome," +;
"COUNT(*) AS algo," +;
"pr.descricao," +;
"pe.vendedor," +;
"vn.nome" +;
" FROM pedido pe" +;
" LEFT JOIN produto pr ON pe.produto = pr.codigo" +;
" LEFT JOIN grupo gr ON pr.grupo = gr.codigo" +;
" LEFT JOIN vendedor vn ON pe.vendedor = vn.codigo" +;
" WHERE pe.data BETWEEN "+Any2Sql(cGet[1])+" AND '"+Any2Sql(cGet[2])+"' " +;
" AND pe.tipo = '1' +;
" AND pe.operacao = '"+cOper+"' "

if cGet[3] <> '999'
cSql += " AND pe.vendedor ='"+cGet[3]+"' "
endif
cSql += " GROUP BY pe.vendedor,pr.codigo ;"

O que seria essa linha "COUNT(*) AS algo," o algo foi eu quem colocou...

Usei LEFT, mas pode ser INNER não sei como afetaria sua consulta ai..

Espero ajudar.

Sds,

Link to comment
Share on other sites

Olá,

A tabela PEDIDOS tem um índice pelo campo VENDEDOR? Confira se os campos de relacionamento e os que fazem parte do where estão indexados.

Ola Evandro, o campo vendedor não tem indice, ate iria criar, mais depois da reposta do Geraldo como ficou bom deixei de lado, agora aproveitando já li em algum lugar se eu tiver uma tabela com muitos registros e tiver muitos campos com indice isso pode causa uma certa perda de perfoma nos INSERT e UPDATE por isto eu tomo o cuidado de criar indice somente em alguns campos, sera que isto confere mesmo.

Obrigado

Link to comment
Share on other sites

Olá,

Não é para colocar índice a torto e a direito, mas não tenho esta informação. O que é importante, e faz uma diferença descomunal, é indexar os campos dos joins e dos wheres.

Vlw Evandro obrigado pela resposta, sei sim que faz a diferença, aqui os principais campo das tabela com maior numero de registro já estão todos com indice.

Abraços

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...