Jump to content
  • 0
vanderlei_nucash

[Resolvido] Consulta a partir de View lenta - RESOLVIDO ! - A solução é super simples e funcional.

Question

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''  ')

 

Share this post


Link to post
Share on other sites

0 answers to this question

Recommended Posts

There have been no answers to this question yet

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By MateusOFCZ
      Olá, estou desenvolvendo um projeto de registro de clientes em java no netbeans e usando o MySQL Workbench e Xampp, gostaria de saber se é possível fazer com que o programa fique verificando se está conectado com o banco de dados, e caso não esteja ele mostra uma mensagem pedindo para o usuário se conectar em uma rede, caso ele se conecte o programa irá esconder essa mensagem e funcionará normalmente.

      Eu consegui fazer com que ele mostre se está conectado ou não, porém se eu desligar o servidor ele não atualiza mostrando que está offline, ele continua como online...
    • By wesleycsilva
      Tem uma tabela que relaciona os produtos de uma determinada compra, onde preciso consultar diversos produtos e retornar os ids das compras que tenham todos os produtos que consultei, em uma estrutura parecida com o exemplo abaixo:
       
      SELECT  * FROM  produtos_has_compras WHERE (idProduto = 6 AND idProduto = 77 AND idProduto = 11) GROUP BY idCompra;
       
      Alguém teria uma solução que possa me ajudar?
    • By bradry
      Olá galera !
       
      Tenho uma dúvida referente aos operadores de pesquisa. Tenho uma  tabela com a seguinte estrutura
       
      id integer, CPF varchar ( 20 ), SCORE_CUSTOM varchar ( 20 ),  SCORE varchar ( 20 ), SCORE_CCOG varchar ( 20 ), RESTRITIVO varchar ( 20 ) );
       
      Quando faço uma pesquisa da maneira a baixo colocando aspas simples no ZERO retorna erro, agora quando faço a mesma pesquisa sem aspas me retorna o resultado esperado.
       
      select * from score
      where RESTRITIVO ='0' 
      and SCORE_CUSTOM >=100
      and SCORE_CUSTOM <=200;
       
      Só queria entender se esse funcionamento de aspas vale para tudo que vou pesquisa ou se tem que ser usado em casos específicos. Não consegui encontrar nada sobre na web.
    • By Sapinn
      Salve quebrada, firmesa? É o seguinte estou desenvolvendo um web site em que os aluno enviam textos para o professor corrigir. O que eu quero é que quando o professor corrigir o texto e aluno for ver mostrar o que foi corrigido. 
      Por exemplo se o aluno digitar a seguinte frase:
      Eu gosta mas de você.
      Quando ele for ver a correção terá:
      Eu gosto mas(o correto seria "mais") de você.
       
      Alguém pode me ajudar aqui?
       
    • By jeanzinsousa
      Salve, Galera estou com uma dúvida estudando banco de dados e programação.
       
      escrevi a seguinte query:
       
      SELECT data_pg as diaria, SUM(valor_pg) as valor_diario, SUM(valor_despesa) as valor_despesa, (SELECT SUM(valor_pg) as dinheiro FROM pagamento WHERE tipo = 5 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_dinheiro, (SELECTSUM(valor_pg) as debito FROM pagamento WHERE tipo = 25 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) as total_debito, (SELECT SUM(valor_pg) as credito FROM pagamento WHERE tipo = 15 AND MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019) astotal_credito FROM pagamento WHERE MONTH(data_pg) = 06 AND YEAR(data_pg) = 2019 GROUP BY diaria ORDER BY `diaria`
       
      resultado:
      diaria  1 valor_diario valor_despesa total_dinheiro total_debito total_credito   2019-06-10 818.70 0 288.40 586.95 113.30 2019-06-11 169.95 0 288.40 586.95 113.30
       
       
       
       
      Como podem ver meu objetivo e separar por dia o resultado dos valores divididos por tipo de pagamento.
      porém o mesmo mostra a soma total nas subquery.
      quando coloco o group by order by dentro das subquerys apresenta a seguinte mensagem de erro: #1242 - Subquery returns more than 1 row 
       
       
      como resolver?
×

Important Information

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