I a select where the same is starting to get too slow, Would you have any solution to improve your speed?

Asked

Viewed 47 times

-2

SELECT 
  pessoafisica.PessoaFisica_Nome,
  filiados.`Filiado_MatriculaEmpresa`,
  filiados.`Filiado_RetornoSiape` AS observacoes,
  Filiado_MatriculaEmpresaDigito,
 lotacao.Lotacao_Descricao,
  (SELECT 
    contato.Contato_Valor 
  FROM
    filiadoshascontato,
    contato 
  WHERE filiadoshascontato.FiliadosHasContato_Filiados_Id = filiados.Filiado_Id 
    AND filiadoshascontato.FiliadosHasContato_Contato_Id = contato.Contato_Id 
    AND Contato_TipoContato_Id = 10 
  LIMIT 1) AS Telefone_Residencial,
  (SELECT 
    contato.Contato_Valor 
  FROM
    filiadoshascontato,
    contato 
  WHERE filiadoshascontato.FiliadosHasContato_Filiados_Id = filiados.Filiado_Id 
    AND filiadoshascontato.FiliadosHasContato_Contato_Id = contato.Contato_Id 
    AND Contato_TipoContato_Id = 11 
  LIMIT 1) AS Telefone_Celular,
  (SELECT 
    contato.Contato_Valor 
  FROM
    filiadoshascontato,
    contato 
  WHERE filiadoshascontato.FiliadosHasContato_Filiados_Id = filiados.Filiado_Id 
    AND filiadoshascontato.FiliadosHasContato_Contato_Id = contato.Contato_Id 
    AND Contato_TipoContato_Id = 9 
  LIMIT 1) AS Telefone_Comercial,
  (SELECT 
    contato.Contato_Valor 
  FROM
    filiadoshascontato,
    contato 
  WHERE filiadoshascontato.FiliadosHasContato_Filiados_Id = filiados.Filiado_Id 
    AND filiadoshascontato.FiliadosHasContato_Contato_Id = contato.Contato_Id 
    AND Contato_TipoContato_Id = 3 
  LIMIT 1) AS Fax,
  (SELECT 
    contato.Contato_Valor 
  FROM
    filiadoshascontato,
    contato 
  WHERE filiadoshascontato.FiliadosHasContato_Filiados_Id = filiados.Filiado_Id 
    AND filiadoshascontato.FiliadosHasContato_Contato_Id = contato.Contato_Id 
    AND Contato_TipoContato_Id = 4 
  LIMIT 1) AS Email_Principal,
  (SELECT 
    contato.Contato_Valor 
  FROM
    filiadoshascontato,
    contato 
  WHERE filiadoshascontato.FiliadosHasContato_Filiados_Id = filiados.Filiado_Id 
    AND filiadoshascontato.FiliadosHasContato_Contato_Id = contato.Contato_Id 
    AND Contato_TipoContato_Id = 5 
  LIMIT 1) AS Email_Secundario,
  (SELECT 
    contato.Contato_Valor 
  FROM
    filiadoshascontato,
    contato 
  WHERE filiadoshascontato.FiliadosHasContato_Filiados_Id = filiados.Filiado_Id 
    AND filiadoshascontato.FiliadosHasContato_Contato_Id = contato.Contato_Id 
    AND Contato_TipoContato_Id = 6 
  LIMIT 1) AS Email_Terciario,
  (SELECT 
    contato.Contato_Valor 
  FROM
    filiadoshascontato,
    contato 
  WHERE filiadoshascontato.FiliadosHasContato_Filiados_Id = filiados.Filiado_Id 
    AND filiadoshascontato.FiliadosHasContato_Contato_Id = contato.Contato_Id 
    AND Contato_TipoContato_Id = 8 
  LIMIT 1) AS Home_Page,
  (SELECT 
    filiadosiape.`FiliadoSiape_DataInicioPensao` 
  FROM
    filiadosiape 
  WHERE filiadosiape.`Filiados_Filiado_Id` = filiados.Filiado_Id 
  LIMIT 1) AS Data_Pensao,
  (SELECT 
    funcaoempresa.`FuncaoEmpresa_Valor` 
  FROM
    funcaoempresa 
    WHERE funcaoempresa.`FuncaoEmpresa_Id` = `lotacaofiliado`.`FuncaoEmpresa_Id`
    AND lotacaofiliado.`Filiados_Filiado_Id`    
  LIMIT 1) AS Funcao,
  (SELECT 
    profissao.`Profissao_Valor` 
  FROM
    profissao 
  WHERE profissao.`Profissao_Id` = filiados.`Filiado_Id_Profissao_Id` 
  LIMIT 1) AS Profissao,
   (SELECT 
    lotacao.`Lotacao_Descricao`
  FROM
    lotacao 
    WHERE lotacao.`Lotacao_Id` = lotacaofiliado.`Lotacao_Id` 
    AND lotacaofiliado.`Filiados_Filiado_Id`    
  LIMIT 1) AS Lotacao,
  (SELECT 
    cargoempresa.`CargoEmpresa_Valor` 
  FROM
    cargoempresa 
    WHERE cargoempresa.`CargoEmpresa_Id` = lotacaofiliado.`CargoEmpresa_Id`
    AND lotacaofiliado.`Filiados_Filiado_Id`
  LIMIT 1) AS Cargo,
 (SELECT 
    situacaoenviosiape.`SituacaoEnvioSiape_Valor` 
  FROM
    situacaoenviosiape
    WHERE `situacaoenviosiape`.`SituacaoEnvioSiape_Id` = `filiadosiape`.`SituacaoEnvioSiape_SituacaoEnvioSiape_Id`
    AND filiadosiape.`Filiados_Filiado_Id` = filiados.`Filiado_Id` 
  LIMIT 1) AS Situacao_Envio,
  (SELECT 
    sexo.`Sexo_Valor` 
  FROM
    pessoafisica 
    WHERE sexo.`Sexo_Id` = pessoafisica.`PessoaFisica_Sexo_Id`
  LIMIT 1) AS Sexo,
  (SELECT 
    endereco.`Endereco_Rua` 
  FROM
    endereco 
  WHERE endereco.`Endereco_Id` = pessoafisica.PessoaFisica_Endereco_Id 
  LIMIT 1) AS Endereco,
  (SELECT 
    predio.`Predio_Descricao` 
  FROM
    filiadoshasempresa 
  WHERE predio.`Predio_Empresa_Id` = fhe.`Filiados_Filiado_Id` 
  LIMIT 1) AS Predio,
  (SELECT 
    empresa.`Empresa_Codigo` 
  FROM
    empresa 
  WHERE empresa.`Empresa_Id` = fhe.`Empresa_Empresa_Id` 
  LIMIT 1) AS Empresa_Codigo,
  (SELECT 
    empresa.`Empresa_Nome` 
  FROM
    empresa 
  WHERE empresa.`Empresa_Id` = fhe.`Empresa_Empresa_Id` 
  LIMIT 1) AS Empresa_Nome,
  (SELECT 
    IF (
      filiados.Filiado_Filiado = 0,
      'Não',
      'Sim'
    ) 
  LIMIT 1) AS Associado,
  (SELECT 
    IF (
      dadosfinanceirosfiliado.`DadosFinanceirosFiliado_Valor` IS NULL,
      0,
      1
    ) 
  FROM
    dadosfinanceirosfiliado 
  WHERE CONCAT(
      dadosfinanceirosfiliado.`DadosFinanceirosFiliado_CompetenciaAno`,
      dadosfinanceirosfiliado.`DadosFinanceirosFiliado_CompetenciaMes`
    ) = CONCAT(YEAR(NOW()), MONTH(NOW()) - 1) 
    AND dadosfinanceirosfiliado.`Filiados_Filiado_Id` = filiados.`Filiado_Id` 
  LIMIT 1) AS Desconto,
  (SELECT 
    estadocivil.`EstadoCivil_Valor` 
  FROM
    pessoafisica 
  WHERE estadocivil.`EstadoCivil_Id` = pessoafisica.`PessoaFisica_Id` 
  LIMIT 1) AS Est_Civil,
  (SELECT 
    fatorrh.`FatorRh_Valor` 
  FROM
    pessoafisica 
  WHERE fatorrh.`FatorRh_Id` = pessoafisica.`PessoaFisica_FatorRh_Id` 
  LIMIT 1) AS Fator_Rh,
  (SELECT 
    pessoafisica.`PessoaFisica_DataNascimento` 
  FROM
    pessoafisica 
  WHERE pessoafisica.`PessoaFisica_Id` = filiados.`Filiado_Id` 
  LIMIT 1) AS Data_Nascimento,
  (SELECT 
    grauinstrucao.`GrauInstrucao_Valor` 
  FROM
    pessoafisica 
  WHERE grauinstrucao.`GrauInstrucao_Id` = pessoafisica.`PessoaFisica_GrauInstrucao_Id` 
  LIMIT 1) AS Grau_Istrucao,
  (SELECT 
    pessoafisica.`PessoaFisica_NomePai` 
  FROM
    pessoafisica 
  WHERE pessoafisica.`PessoaFisica_Id` = filiados.`Filiado_Id` 
  LIMIT 1) AS Pai,
  (SELECT 
    pessoafisica.`PessoaFisica_NomeMae` 
  FROM
    pessoafisica 
  WHERE pessoafisica.`PessoaFisica_Id` = filiados.`Filiado_Id` 
  LIMIT 1) AS Mae,
  (SELECT 
    raca.`Raca_Valor` 
  FROM
    pessoafisica 
  WHERE raca.`Raca_Id` = pessoafisica.`PessoaFisica_Raca_Id` 
  LIMIT 1) AS Raca,
  (SELECT 
    situacaoempresa.`SituacaoEmpresa_Valor` 
  FROM
    situacaoempresa 
  WHERE situacaoempresa.`SituacaoEmpresa_Id` = dadosempresa.`SituacaoEmpresa_SituacaoEmpresa_Id` 
  LIMIT 1) AS Situacao_Empresa,
  (SELECT 
    vinculoempregaticio.`VinculoEmpregaticio_Valor` 
  FROM
    vinculoempregaticio 
  WHERE vinculoempregaticio.`VinculoEmpregaticio_Id` = dadosempresa.`VinculoEmpregaticio_VinculoEmpregaticio_Id` 
  LIMIT 1) Vinculo,
  (SELECT 
    dadossindicato.`DadosSindicato_DataFiliacao` 
  FROM
    dadossindicato 
  WHERE dadossindicato.`Filiados_Filiado_Id` = filiados.`Filiado_Id` 
  LIMIT 1) AS Data_Filiacao,
  (SELECT 
    filiacaodesfiliacao.`FiliacaoDesfiliacao_Data` 
  FROM
    filiacaodesfiliacao 
  WHERE filiacaodesfiliacao.`Filiados_Filiado_Id` = filiados.`Filiado_Id` LIMIT 1) AS Data_Desfiliacao,
  (SELECT 
    urna.`Urna_Urna` 
  FROM
    urna 
  WHERE urna.`Filiados_Filiado_Id` = filiados.`Filiado_Id` LIMIT 1) AS Urna,
  (SELECT 
    urna.`Urna_UltimaVotacao` 
  FROM
    urna 
  WHERE urna.`Filiados_Filiado_Id` = filiados.`Filiado_Id` LIMIT 1) AS Urna_Votacao,
  (SELECT 
    dadossindicatocarteirinha.`Carteirinha_Emissao` 
  FROM
    dadossindicatocarteirinha 
  WHERE dadossindicatocarteirinha.`Filiados_Filiado_Id` = filiados.`Filiado_Id` LIMIT 1) AS Carteira_Emissao,
  (SELECT 
    dadossindicatocarteirinha.`Carteirinha_Validade` 
  FROM
    dadossindicatocarteirinha 
  WHERE dadossindicatocarteirinha.`Filiados_Filiado_Id` = filiados.`Filiado_Id` LIMIT 1) AS Carteira_Validade,
   (SELECT 
    cipa.`Cipa_Membro` 
  FROM
    cipa 
  WHERE cipa.`Cipa_Id` = cipahasfiliados.`Cipa_Cipa_Id` 
  AND cipahasfiliados.`Filiados_Filiado_Id` = filiados.`Filiado_Id`
  LIMIT 1) AS Membro_Cipa,
  (SELECT 
    cipa.`Cipa_Eleito` 
  FROM
    cipa 
  WHERE cipa.`Cipa_Id` = cipahasfiliados.`Cipa_Cipa_Id` 
    AND cipahasfiliados.`Filiados_Filiado_Id` = filiados.`Filiado_Id`
  LIMIT 1) AS Eleito,
  (SELECT 
    cipa.`Cipa_Mandato` 
  FROM
    cipa 
  WHERE cipa.`Cipa_Id` = cipahasfiliados.`Cipa_Cipa_Id` 
    AND cipahasfiliados.`Filiados_Filiado_Id` = filiados.`Filiado_Id`
  LIMIT 1) AS Mandato,
  (SELECT 
    cipa.`Cipa_FimMandato` 
  FROM
    cipa 
  WHERE cipa.`Cipa_Id` = cipahasfiliados.`Cipa_Cipa_Id` 
    AND cipahasfiliados.`Filiados_Filiado_Id` = filiados.`Filiado_Id`
  LIMIT 1) AS Fim_Mandato,
  (SELECT 
    documento.`Documento_Valor` 
  FROM
    documento 
    INNER JOIN filiadoshasdocumento fhd 
      ON fhd.`Documento_Documento_Id` = documento.`Documento_Id` 
  WHERE documento.`Documento_TipoDocumento_Id` = 7 
    AND filiados.Filiado_Id = fhd.`Filiados_Filiado_Id` 
  LIMIT 1) AS Identidade,
  (SELECT 
    documento.`Documento_Valor` 
  FROM
    documento 
    INNER JOIN filiadoshasdocumento fhd 
      ON fhd.`Documento_Documento_Id` = documento.`Documento_Id` 
  WHERE documento.`Documento_TipoDocumento_Id` = 6 
    AND filiados.Filiado_Id = fhd.`Filiados_Filiado_Id` 
  LIMIT 1) AS CPF,
  (SELECT 
    documento.`Documento_Valor` 
  FROM
    documento 
    INNER JOIN filiadoshasdocumento fhd 
      ON fhd.`Documento_Documento_Id` = documento.`Documento_Id` 
  WHERE documento.`Documento_TipoDocumento_Id` = 8 
    AND filiados.Filiado_Id = fhd.`Filiados_Filiado_Id` 
  LIMIT 1) AS Ctps,
  (SELECT 
    documento.`Documento_Valor` 
  FROM
    documento 
    INNER JOIN filiadoshasdocumento fhd 
      ON fhd.`Documento_Documento_Id` = documento.`Documento_Id` 
  WHERE documento.`Documento_TipoDocumento_Id` = 9 
    AND filiados.Filiado_Id = fhd.`Filiados_Filiado_Id` 
  LIMIT 1) AS PIS,
  (SELECT 
    documento.`Documento_Valor` 
  FROM
    documento 
    INNER JOIN filiadoshasdocumento fhd 
      ON fhd.`Documento_Documento_Id` = documento.`Documento_Id` 
  WHERE documento.`Documento_TipoDocumento_Id` = 13 
    AND filiados.Filiado_Id = fhd.`Filiados_Filiado_Id` 
  LIMIT 1) AS FGTS,
  (SELECT 
    documento.`Documento_Valor` 
  FROM
    documento 
    INNER JOIN filiadoshasdocumento fhd 
      ON fhd.`Documento_Documento_Id` = documento.`Documento_Id` 
  WHERE documento.`Documento_TipoDocumento_Id` = 13 
    AND filiados.Filiado_Id = fhd.`Filiados_Filiado_Id` 
  LIMIT 1) AS Data_FGTS
FROM
  filiados 
  INNER JOIN pessoafisica pessoafisica 
    ON filiados.Filiado_PessoaFisica_Id = pessoafisica.PessoaFisica_Id 
  INNER JOIN filiadoshasempresa fhe 
    ON filiados.Filiado_Id = fhe.Filiados_Filiado_Id 
  INNER JOIN empresa 
    ON fhe.Empresa_Empresa_Id = empresa.Empresa_Id 
  LEFT JOIN endereco 
    ON endereco.Endereco_Id = pessoafisica.PessoaFisica_Endereco_Id 
  LEFT JOIN cidadeestado 
    ON endereco.Endereco_CidadeEstado_Id = cidadeestado.CidadeEstado_Id 
  LEFT JOIN lotacaofiliado 
   ON lotacaofiliado.Filiados_Filiado_Id = filiados.Filiado_Id 
  LEFT JOIN predio p 
    ON p.Predio_Id = lotacaofiliado.Predio_Id 
  LEFT JOIN endereco AS enderedoPredio 
    ON enderedoPredio.Endereco_Id = p.Predio_Endereco_Id 
  LEFT JOIN dadosempresa de 
    ON de.Filiados_Filiado_Id = filiados.Filiado_Id 
  LEFT JOIN filiadosiape 
    ON filiadosiape.`Filiados_Filiado_Id` = filiados.Filiado_Id 
  LEFT JOIN funcaoempresa 
    ON lotacaofiliado.`FuncaoEmpresa_Id` = funcaoempresa.`FuncaoEmpresa_Id` 
  LEFT JOIN cargoempresa 
    ON lotacaofiliado.`CargoEmpresa_Id` = cargoempresa.`CargoEmpresa_Id`   
  LEFT JOIN situacaoenviosiape 
    ON filiadosiape.`FiliadoSiape_Id` = situacaoenviosiape.`SituacaoEnvioSiape_Id` 
  LEFT JOIN lotacao
    ON lotacaofiliado.`Lotacao_Id` = lotacao.`Lotacao_Id`
  LEFT JOIN sexo 
    ON pessoafisica.`PessoaFisica_Sexo_Id` = sexo.`Sexo_Id` 
  LEFT JOIN predio 
    ON predio.`Predio_Empresa_Id` = filiados.Filiado_Id 
  LEFT JOIN estadocivil 
    ON estadocivil.`EstadoCivil_Id` = pessoafisica.`PessoaFisica_EstadoCivil_Id` 
  LEFT JOIN fatorrh 
    ON fatorrh.`FatorRh_Id` = pessoafisica.`PessoaFisica_FatorRh_Id` 
  LEFT JOIN grauinstrucao 
    ON grauinstrucao.`GrauInstrucao_Id` = pessoafisica.`PessoaFisica_GrauInstrucao_Id` 
  LEFT JOIN raca 
    ON raca.`Raca_Id` = pessoafisica.`PessoaFisica_Raca_Id` 
  LEFT JOIN dadosempresa 
    ON dadosempresa.`Filiados_Filiado_Id` = filiados.`Filiado_Id` 
  LEFT JOIN vinculoempregaticio 
    ON vinculoempregaticio.`VinculoEmpregaticio_Id` = dadosempresa.`VinculoEmpregaticio_VinculoEmpregaticio_Id` 
  LEFT JOIN dadossindicato 
    ON dadossindicato.`Filiados_Filiado_Id` = filiados.`Filiado_Id` 
  LEFT JOIN filiacaodesfiliacao 
    ON filiacaodesfiliacao.`Filiados_Filiado_Id` = filiados.`Filiado_Id` 
  LEFT JOIN urna 
    ON urna.`Filiados_Filiado_Id` = filiados.`Filiado_Id` 
  LEFT JOIN dadossindicatocarteirinha 
    ON dadossindicatocarteirinha.`Filiados_Filiado_Id` = filiados.`Filiado_Id` 
  LEFT JOIN cipahasfiliados 
    ON cipahasfiliados.`Filiados_Filiado_Id` = filiados.`Filiado_Id` 

  • maybe for your case it is interesting to work with INDEX, but I say MAYBE, check this publication, see why and why, https://answall.com/questions/73654/para-que-serve-o-%C3%Adndice-index-no-mysql

  • I don’t think INDEX will solve the problem, because not all WHERE can use INDEX, as in CONCAT(dadosfinanceirosfiliado....) = CONCAT(YEAR(NOW()), MONTH(NOW()) - 1). First, see in EXPLAIN/PROFILE what is slow, in my kick will be the stage of "Preparing". If it is "Preparing" the reason would be the amount of subquery that exists. Not to mention that there are Selects of things that are already in INNER JOIN. I would be surprised if this query was fast, because for me it has everything to be slow.

  • What would you advise to do ???

2 answers

1

It seems to me that you make a huge and unnecessary amount of subselects. At least here:

  (SELECT 
     empresa.`Empresa_Codigo` 
  FROM
     empresa 
  WHERE empresa.`Empresa_Id` = fhe.`Empresa_Empresa_Id` 
  LIMIT 1) AS Empresa_Codigo,
  (SELECT 
     empresa.`Empresa_Nome` 
  FROM
     empresa 
  WHERE empresa.`Empresa_Id` = fhe.`Empresa_Empresa_Id` 
  LIMIT 1) AS Empresa_Nome,

and also here:

 (SELECT 
     dadossindicatocarteirinha.`Carteirinha_Emissao` 
  FROM
     dadossindicatocarteirinha 
  WHERE dadossindicatocarteirinha.`Filiados_Filiado_Id` = filiados.`Filiado_Id` LIMIT 1) AS Carteira_Emissao,
  (SELECT 
     dadossindicatocarteirinha.`Carteirinha_Validade` 
  FROM
     dadossindicatocarteirinha 
  WHERE dadossindicatocarteirinha.`Filiados_Filiado_Id` = filiados.`Filiado_Id` LIMIT 1) AS Carteira_Validade,

you make 2 subselects in the same table to pick up two fields that are related.

Apparently your query did not come out complete and yes, it can be quite optimized.

0

You have many table links using the LEFT JOIN tries to create a media for each table and makes the union only of the ID’s.

CREATE INDEX [index] ON table name ON [PRIMARY]

in almost everything has this passage:

SELECT contact.Contact_value FROM affiliated to contact, contact WHERE affiliated.Affiliatesscontact affiliates_affiliate_id = affiliates.Affiliate_id AND affiliatescontact.Affiliatesscontact Us_contact Id = contact.Contact_id AND Contacttipocontato_id = 8

You modifying the AND Contacttipocontato_id = 8 could do that as a from table. EX:

SELECT DECODE(Contacttypocontato_id ,10, contact.Contact_value ) AS Residential Phone , FROM affiliated to contact, contact WHERE affiliated.Affiliatesscontact affiliates_affiliate_id = affiliates.Affiliate_id AND affiliatescontact.Affiliatesscontact Us_contact Id = contact.Contact_id DECODE(Contact_tipocontato_id ,11, Contact_value ) AS Phone_cellular

  • Already this with index, and still getting slow

  • The problem is the subselect excess, would start by changing that select lot in the main select. I modified the answer, take a look.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.