Jump to content
Fórum Script Brasil
  • 0

Subconsulta com Limit (7segundos)


rblazio
 Share

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...