Shakapp 0 Denunciar post Postado Janeiro 11, 2013 Amigos tenho o seguinte sql SELECT ROUND(SUM(qtd_trabalho)/60,2) FROM ONEPAGER_OP_BCK WHERE SUBSTR(cod_atividade,1,3) IN (SELECT cod_especialidade FROM recurso_manutencao r WHERE r.cod_agrupado IN ('MEC','ELE','INS/AUT')) AND cod_filial = 'AG' AND cod_subarea IN (SELECT SUBSTR(cod_area_utilidade,1,5) FROM area_utilidade a WHERE cod_area_one_pager = 'L502') AND dat_inicio_operacao BETWEEN'2007-01-01' AND '2999-01-01' Este SQL pelo Explain demonstra que foi usado 19mil linhas, se eu tirar a ultima subquery e colocar o valor que ela retorna direto, o Explain cai para 2mil linhas. SELECT ROUND(SUM(qtd_trabalho)/60,2) FROM ONEPAGER_OP_BCK WHERE SUBSTR(cod_atividade,1,3) IN (SELECT cod_especialidade FROM recurso_manutencao r WHERE r.cod_agrupado IN ('MEC','ELE','INS/AUT')) AND cod_filial = 'AG' AND cod_subarea IN ('05020') AND dat_inicio_operacao BETWEEN'2007-01-01' AND '2999-01-01' Pesquisando a respeito, notei que isso ocorre pois, por padrão o Mysql executa de fora para dentro, assim executando o sql externo, com as 20mil linhas e depois selecionado as condições do subselect, gostaria de saber se tem alguma forma de forçar o MySQL executar o subselect primeiro e usar o resultado para o select de fora, assim usando apenas 2mil linhas. Existe uma forma de forçar o Mysql executar de dentro para fora, e não de fora para dentro? Obrigado! Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Janeiro 11, 2013 tente SELECT ROUND(SUM(qtd_trabalho)/60,2) FROM ONEPAGER_OP_BCK,rea_utilidade a,recurso_manutencao r WHERE SUBSTR(cod_atividade,1,3) = r.cod_especialidade and r.cod_agrupado IN ('MEC','ELE','INS/AUT')) AND cod_filial = 'AG' AND cod_subarea = SUBSTR(cod_area_utilidade,1,5) and cod_area_one_pager = 'L502') AND dat_inicio_operacao BETWEEN'2007-01-01' AND '2999-01-01' Compartilhar este post Link para o post Compartilhar em outros sites