Fórum Ajuda em Reformulação para ganho de performace #421630

15/08/2012

0

Galera eu estou com um grande problema agora em um select, uns dos mais importantes, o de Clientes. Vou tentar explicar as regras de negocio para melhor compreenção de todos;

Cada cliente ele pertence a uma rota x, e cada rota x pertencence a um setor x, mas cada setor tem um conjunto de rotas, e cada setor x pertence a uma area.

Então eu fiz assim:


Link do DER ... [url]http://www.7master.com.br/DER.gif[/url]




e o meu select eu fiz assim:

select distinct
clientes.cli_id,
clientes.cli_nome,
clientes.cli_endereco,
clientes.cli_numero,
clientes.cli_bairro,
clientes.cli_cidade,
clientes.cli_cep,
clientes.cli_uf,
clientes.cli_ibge,
clientes.cli_fone1,
clientes.cli_fone2,
clientes.cli_fone3,
clientes.cli_fax,
clientes.cli_rg,
clientes.cli_cpf_cnpj,
clientes.cli_mail,
clientes.cli_site,
clientes.cli_limite,
clientes.cli_saldo,
clientes.cli_tipo,
clientes.cli_tabela,
case clientes.status
when 0 then ATIVO
when 1 then INATIVO
when 2 then BLOQUEADO
end as STATUS,
clientes.cli_foto,
clientes.cli_obs,
clientes.data_cad,
clientes.data_alt,
clientes.cli_nascimento,
clientes.cli_creditoconsumo,
clientes.cli_creditotipo,
clientes.cli_razao,
clientes.cli_validadecartao,
clientes.cli_complemento,
clientes.cli_contato,
clientes.cli_categoria,
clientes.cli_classe,
clientes.cli_login,
clientes.cli_senha,
clientes.cli_vendas,
clientes.cli_suframa,
clientes.usu_id,
usuarios.usu_login,
clientes.loj_id,
clientes.data_bloqueio,
clientes.motivo_bloqueio,
clientes.data_desbloqueio,
clientes.motivo_desbloqueio,
clientes.rot_id,
rotas.rot_descricao,
areas.are_descricao,
clientes.cli_intinerario,
clientes.isento_icms,
clientes.sintegra_situacao,
clientes.sintegra_data_consulta,
setores.set_descricao,
clientes.imprimir,
clientes.ASSINATURA_PDA
from clientes
inner join setores
on (setores.rota1 = clientes.rot_id)
or (setores.rota2 = clientes.rot_id)
or (setores.rota3 = clientes.rot_id)
or (setores.rota4 = clientes.rot_id)
or (setores.rota5 = clientes.rot_id)
or (setores.rota6 = clientes.rot_id)
or (setores.rota7 = clientes.rot_id)
left join rotas on rotas.rot_id = clientes.rot_id
inner join areas on areas.are_id = setores.are_id
left join usuarios on usuarios.usu_id = clientes.usu_id
order by clientes.cli_id


mas esta muito lento, alguem tem alguma idéia de como posso melhorar?
Sidney Abreu

Sidney Abreu

Responder

Posts

15/08/2012

Bruno Leandro

uma sugestão é criar indices para os campos na amarração e no where voce pode começar com esses do comando que voce passou e verificar o desempenho

on (setores.rota1 = clientes.rot_id)
or (setores.rota2 = clientes.rot_id)
or (setores.rota3 = clientes.rot_id)
or (setores.rota4 = clientes.rot_id)
or (setores.rota5 = clientes.rot_id)
or (setores.rota6 = clientes.rot_id)
or (setores.rota7 = clientes.rot_id)
left join rotas on rotas.rot_id = clientes.rot_id
inner join areas on areas.are_id = setores.are_id
left join usuarios on usuarios.usu_id = clientes.usu_id
order by clientes.cli_id

ou seja crie indices nestas tabela com os campo utilizados para unir as mesmas
como clientes.cli_id, clientes.usu_id, clientes.rot_id
em setores.rota1...rota7
em rotas.rot_id
em areas.are_id
e por fim usuarios.usu_id
Responder

Gostei + 0

15/08/2012

Sidney Abreu

já fiz mas continua lento, mas criei os indices separados,uma pra cada, esta correto?

são 17.959 registros
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar