Ir para conteúdo
Fórum Script Brasil
  • 0

Subconsulta com Limit (7segundos)


rblazio

Pergunta

Prezados,

Procuro idéias de como diminuir o tempo de resposta dessa consulta:

SELECT     "Pessoa"."CodigoPessoa",
        "Pessoa"."NomePessoa", 
        "Pessoa"."Apelido",
        "Pessoa"."SexoPessoa", 
        "DadosPessoa"."Matricula",
        "DadosPessoa"."EstadoCivil", 
        "DadosPessoa"."Nacionalidade",
        "DadosPessoa"."Naturalidade",
        "DadosPessoa"."DataNascimento",
        "DadosPessoa"."NomePai", 
        "DadosPessoa"."NomeMae",
        "DadosPessoa"."DataCasamento",
        "TipoTitulo"."Titulo",
        "TipoPosicao"."NomePosicao",
        "Grupo"."NomeGrupo",
        "TipoTitulo"."FK_CodigoGrupoTitulo" AS "CodigoGrupoTitulo"         
        
FROM "Pessoa"

LEFT JOIN "DadosPessoa" ON "DadosPessoa"."FK_CodigoPessoa" = "Pessoa"."CodigoPessoa"

JOIN "TituloPessoa"
    ON "TituloPessoa"."FK_CodigoPessoa" = "Pessoa"."CodigoPessoa"
    AND "TituloPessoa"."CodigoTituloPessoa" IN (SELECT "TituloPessoa"."CodigoTituloPessoa" FROM "TituloPessoa" WHERE "TituloPessoa"."FK_CodigoPessoa" = "Pessoa"."CodigoPessoa" ORDER BY "TituloPessoa"."DataTitulo" DESC LIMIT 1)

JOIN "TipoTitulo" ON "TipoTitulo"."CodigoTipoTitulo" = "TituloPessoa"."FK_CodigoTipoTitulo"

JOIN "HistoricoPosicao"
    ON "HistoricoPosicao"."FK_CodigoPessoa" = "Pessoa"."CodigoPessoa"
    AND "HistoricoPosicao"."CodigoHistoricoPosicao" IN (SELECT "HistoricoPosicao"."CodigoHistoricoPosicao" FROM "HistoricoPosicao" WHERE "HistoricoPosicao"."FK_CodigoPessoa" = "Pessoa"."CodigoPessoa" ORDER BY "HistoricoPosicao"."DataPosicao" DESC LIMIT 1)

JOIN "TipoPosicao" ON "TipoPosicao"."CodigoTipoPosicao" = "HistoricoPosicao"."FK_CodigoTipoPosicao" 

LEFT JOIN "GrupoPessoa"
    ON "GrupoPessoa"."FK_CodigoPessoa" = "Pessoa"."CodigoPessoa"
    AND "GrupoPessoa"."CodigoGrupoPessoa" IN (SELECT "GrupoPessoa"."CodigoGrupoPessoa" FROM "GrupoPessoa" WHERE "GrupoPessoa"."FK_CodigoPessoa" = "Pessoa"."CodigoPessoa" ORDER BY "GrupoPessoa"."DataGrupoPessoa" DESC LIMIT 1)

LEFT JOIN "Grupo" ON "Grupo"."CodigoGrupo" = "GrupoPessoa"."FK_CodigoGrupo"

 

 

O resultado de retorno para 4mil registros é de 7,800 segundos, já não tenho mais idéia de como diminuir o tempo, ou montar essa consulta de outra forma.

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

A primeira coisa a se fazer seria descobrir qual parte da consulta está deixando-a lenta, assim você foca no que realmente vai fazer diferença:

http://www.postgresql.org/docs/9.1/static/sql-explain.html
https://www.datadoghq.com/blog/100x-faster-postgres-performance-by-changing-1-line/ (exemplo de uso do EXPLAIN)

Mas a princípio:

1 - Você pode criar índice para algumas colunas, como TituloPessoa.DataTitulo, HistoricoPosicao.DataPosicao e GrupoPessoa.DataGrupoPessoa (talvez até para as colunas FK_ utilizadas no WHERE dessas tabelas) e ver se faz diferença:

CREATE INDEX idx_DataTitulo ON TituloPessoa (DataTitulo);
CREATE INDEX idx_DataPosicao ON HistoricoPosicao (DataPosicao);
CREATE INDEX idx_DataGrupoPessoa ON GrupoPessoa (DataGrupoPessoa);

2 - Essa consulta é para pegar TODOS os registros da tabela Pessoa mesmo? Caso contrário, se você tiver o ID da pessoa que você precisa em uma variável fora da consulta, você pode filtrar os registros das tabelas antes de fazer os JOINs (usando o WITH por exemplo).

4 - Existe a possibilidade de você usar paginação? Ao invés de trazer todos registros, pode trazer, por exemplo, de 100 em 100.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...