sql - How to optimize select sum() on mysql? -
i have sql, it´s taking 2,5 seconds run.
select sum(valorlanca0_.valor_previsto) col_0_0_ cf_valor_lancado_detalhado valorlanca0_ inner join cf_valor_lancado valorlanca1_ on valorlanca0_.id_valor_lancado=valorlanca1_.id_valor_lancado inner join cf_lancamento lancamento2_ on valorlanca1_.id_lancamento=lancamento2_.id_lancamento inner join cf_administracao administra12_ on lancamento2_.id_administracao=administra12_.id_administracao inner join cf_empresa empresa13_ on lancamento2_.id_empresa=empresa13_.id_empresa inner join cf_usuario usuario14_ on lancamento2_.id_usuario_criou=usuario14_.id_usuario left outer join cf_forma_pagamento formapagam9_ on valorlanca1_.id_forma_pagamento=formapagam9_.id_forma_pagamento inner join cf_conta conta10_ on valorlanca1_.id_conta=conta10_.id_conta left outer join cf_fatura fatura11_ on valorlanca1_.id_fatura=fatura11_.id_fatura left outer join cf_categoria categoria3_ on valorlanca0_.id_categoria=categoria3_.id_categoria left outer join cf_centro_custo centrocust4_ on valorlanca0_.id_centro_custo=centrocust4_.id_centro_custo left outer join cf_fav_fonte_pagadora favfontepa5_ on valorlanca0_.id_fav_fonte_pagadora=favfontepa5_.id_fav_fonte_pagadora left outer join cf_conta_contabil contaconta6_ on valorlanca0_.id_conta_contabil=contaconta6_.id_conta_contabil left outer join cf_contato contato7_ on valorlanca0_.id_contato=contato7_.id_contato left outer join cf_marca marca8_ on valorlanca0_.id_marca=marca8_.id_marca administra12_.id_administracao=406 , lancamento2_.tipo_conta=2 , (conta10_.id_conta in (2060, 404, 405, 4291, 406, 410, 4292, 403, 4355, 402, 407)) , conta10_.tipo<>9 , lancamento2_.tipo_transacao=10 , (valorlanca1_.situacao in (1)) , ((valorlanca1_.data_prevista<='2015-07-22' , valorlanca1_.situacao=1 or valorlanca1_.data_baixa<='2015-07-22' , valorlanca1_.situacao=3) , conta10_.tipo<>2 or fatura11_.data_vencimento<='2015-07-22' , conta10_.tipo=2 , valorlanca1_.situacao=1 or valorlanca1_.data_baixa<='2015-07-22' , conta10_.tipo=2 , valorlanca1_.situacao=3) , ((empresa13_.id_empresa in (422, 3643)) , usuario14_.id_usuario=574 or empresa13_.id_empresa in (422, 3643))
and explain command
1 simple administra12_ const primary primary 8 const 1 using index 1 simple empresa13_ range primary primary 8 2 using where; using index 1 simple lancamento2_ ref primary,fke50fd2d68ac234ec,fke50fd2d6574fcef7,fke50fd2d628d2eae8,idxempresa idxempresa 8 controlese.empresa13_.id_empresa 225 using index condition; using 1 simple valorlanca1_ ref primary,fk49527eeb12ddd0da,fk49527eebddd55138,idx_vl_idl,idx_vl_ivl fk49527eeb12ddd0da 8 controlese.lancamento2_.id_lancamento 1 using 1 simple conta10_ eq_ref primary primary 8 controlese.valorlanca1_.id_conta 1 using 1 simple usuario14_ eq_ref primary primary 8 controlese.lancamento2_.id_usuario_criou 1 using index 1 simple fatura11_ eq_ref primary primary 8 controlese.valorlanca1_.id_fatura 1 using 1 simple formapagam9_ eq_ref primary primary 8 controlese.valorlanca1_.id_forma_pagamento 1 using index 1 simple valorlanca0_ ref fk60a3c74ea9a01ac3,idx_vld_idvl fk60a3c74ea9a01ac3 8 controlese.valorlanca1_.id_valor_lancado 1 1 simple categoria3_ eq_ref primary primary 8 controlese.valorlanca0_.id_categoria 1 using index 1 simple centrocust4_ eq_ref primary primary 8 controlese.valorlanca0_.id_centro_custo 1 using index 1 simple favfontepa5_ eq_ref primary primary 8 controlese.valorlanca0_.id_fav_fonte_pagadora 1 using index 1 simple contaconta6_ eq_ref primary primary 8 controlese.valorlanca0_.id_conta_contabil 1 using index 1 simple contato7_ eq_ref primary primary 8 controlese.valorlanca0_.id_contato 1 using index 1 simple marca8_ eq_ref primary primary 8 controlese.valorlanca0_.id_marca 1 using index
the biggest table cf_valor_lancado(855m records) , cf_valor_lancado_detalhado (860m records).
what can optimize select?
that 1 hell of query :)
you can start removing tables not used in this:
select sum(valorlanca0_.valor_previsto) col_0_0_ cf_valor_lancado_detalhado valorlanca0_ inner join cf_valor_lancado valorlanca1_ on valorlanca0_.id_valor_lancado=valorlanca1_.id_valor_lancado inner join cf_lancamento lancamento2_ on valorlanca1_.id_lancamento=lancamento2_.id_lancamento inner join cf_administracao administra12_ on lancamento2_.id_administracao=administra12_.id_administracao inner join cf_empresa empresa13_ on lancamento2_.id_empresa=empresa13_.id_empresa inner join cf_usuario usuario14_ on lancamento2_.id_usuario_criou=usuario14_.id_usuario inner join cf_conta conta10_ on valorlanca1_.id_conta=conta10_.id_conta left outer join cf_fatura fatura11_ on valorlanca1_.id_fatura=fatura11_.id_fatura administra12_.id_administracao=406 , lancamento2_.tipo_conta=2 , (conta10_.id_conta in (2060, 404, 405, 4291, 406, 410, 4292, 403, 4355, 402, 407)) , conta10_.tipo<>9 , lancamento2_.tipo_transacao=10 , (valorlanca1_.situacao in (1)) , ((valorlanca1_.data_prevista<='2015-07-22' , valorlanca1_.situacao=1 or valorlanca1_.data_baixa<='2015-07-22' , valorlanca1_.situacao=3) , conta10_.tipo<>2 or fatura11_.data_vencimento<='2015-07-22' , conta10_.tipo=2 , valorlanca1_.situacao=1 or valorlanca1_.data_baixa<='2015-07-22' , conta10_.tipo=2 , valorlanca1_.situacao=3 ) , ((empresa13_.id_empresa in (422, 3643)) , usuario14_.id_usuario=574 or empresa13_.id_empresa in (422, 3643))
hope helps abit :)
and 1 more (the sql-server may self)
and ((empresa13_.id_empresa in (422, 3643)) , usuario14_.id_usuario=574 or empresa13_.id_empresa in (422, 3643))
is equivalent just
and empresa13_.id_empresa in (422, 3643)
and can try change (95% sure equivalent) - there no nested "or", , helps performance in experience.
and ( (valorlanca1_.data_prevista<='2015-07-22' , valorlanca1_.situacao=1 or valorlanca1_.data_baixa<='2015-07-22' , valorlanca1_.situacao=3 ) , conta10_.tipo<>2 or fatura11_.data_vencimento<='2015-07-22' , conta10_.tipo=2 , valorlanca1_.situacao=1 or valorlanca1_.data_baixa<='2015-07-22' , conta10_.tipo=2 , valorlanca1_.situacao=3 )
to:
and ( valorlanca1_.data_prevista <='2015-07-22' , valorlanca1_.situacao=1 , conta10_.tipo<>2 or fatura11_.data_vencimento <='2015-07-22' , valorlanca1_.situacao=1 , conta10_.tipo=2 or valorlanca1_.data_baixa <='2015-07-22' , valorlanca1_.situacao=3 )
Comments
Post a Comment