Jump to content

vanderlei_nucash

Members
  • Content count

    1
  • Joined

  • Last visited

Community Reputation

0 Comum

About vanderlei_nucash

  1. Tenho verificado que muitas pessoas ao redor do mundo têm esbarrado em uma falha do MySQL em não trabalhar corretamente com Views, quando estas possuem consultas complexas com muitos joins entre muitas tabelas. O link abaixo faz referência a uma dúvida do ano de 2011, mas já vi casos de 2005, 2006, 2007, 2012, 2013, 2015,2016,2017 e 2018. Afirmo que está questão é antiga, pois me deparei com o mesmo problema busquei soluções em diversos fóruns no Brasil e exterior e nada funcionava, pois é de fato um problema do MySQL, que até o momento na versão 8, não foi resolvido. O problema é que o Mysql ignora todos os indices em consultas dentro de uma VIEW. https://forum.imasters.com.br/topic/438365-consulta-a-partir-de-view-lenta/ Verifiquei que muitas tentativas em passar parâmetros para as consultas dentro da view, em busca de solucionar o problema. RESOLVI O PROBLEMA através de uma procedure, com um único parâmetro de varchar(300) suficiente para para uma string "where <condições...>" ou "having <condições...>" que funcionam bem de acordo com a complexidade da View. Coloquei o exemplo com o HAVING como parâmetro, devido este cenário ser mais complicado de solucionar para a grande maiorias das pessoas. OU SEJA, quando a consulta possui muitas tabelas, cada delas com colunas com nomes diferentes, padronizadas na VIEW com apelidos nas colunas, o HAVING é a solução ideal. A solução é super simples e funcional. Se alguém tiver outra solução favor compartilhar, enquanto isso vou usando esta aqui. DELIMITER ;; CREATE PROCEDURE `SP_QUERY_VIEW_WITH_PARAMETERS`(IN p_having VARCHAR(300)) COMMENT 'Executes the statement' BEGIN SET @v_having = p_having; SET @v_sql=CONCAT('SELECT id AS id_emp , user AS emp_name, . . . FROM table1 UNION ALL SELECT idtifier_us AS id_emp , description AS emp_name, . . . FROM table2'); SET @v_sql2 = CONCAT(@v_sql,@v_having); PREPARE stmt FROM @v_sql2; EXECUTE stmt; DEALLOCATE PREPARE stmt; END ;; DELIMITER ; CALL `SP_QUERY_VIEW_WITH_PARAMETERS`('having id_emp=63 and emp_name like ''VANDERLEI%'' and created_at between ''2019-05-01'' and ''2019-05-17'' ')
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.