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?
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
Curtir tópico
+ 0
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
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
são 17.959 registros
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)