AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 58358
Accepted
oxfist
oxfist
Asked: 2014-02-07 04:38:19 +0800 CST2014-02-07 04:38:19 +0800 CST 2014-02-07 04:38:19 +0800 CST

Como obter o tempo de execução da consulta em PL/pgSQL para ser tão rápido quanto o tempo de execução da consulta do console?

  • 772

Basicamente, quero atribuir o resultado de uma consulta a um atributo de tipo personalizado. No entanto, notei que a consulta diretamente do console do PostgreSQL foi de cerca de 0,071 ms e dentro da função foi de 0,400 ms e 0,170 ms após algumas chamadas. explain analyzeainda mostra o uso de índices no primeiro caso, mas não no segundo.

Aqui está o que estou fazendo.

CREATE OR REPLACE FUNCTION fun_isliked(
    par_client client.id%type,
    par_feed feed.id%type
)
RETURNS boolean
AS
$$
BEGIN
    RETURN (
        EXISTS(
            SELECT
                1
            FROM
                feedlike fl
            WHERE
                fl.client = par_client
                AND fl.feed = par_feed
                AND fl.state = 1
        )
    );
END;
$$ LANGUAGE plpgsql STABLE;

Aqui estão as saídas dos explain analyzedois casos descritos acima:

postgres=# explain analyze select exists (select 1 from feedlike where client = 13 and feed = 68 and state = 1);
                                                                  QUERY PLAN                                                                  
----------------------------------------------------------------------------------------------------------------------------------------------
 Result  (cost=8.30..8.31 rows=1 width=0) (actual time=0.037..0.037 rows=1 loops=1)
   InitPlan 1 (returns $0)
     ->  Index Scan using feedlike_client_feed_unique on feedlike  (cost=0.28..8.30 rows=1 width=0) (actual time=0.034..0.034 rows=1 loops=1)
           Index Cond: ((client = 13) AND (feed = 68))
           Filter: (state = 1)
 Total runtime: 0.086 ms

postgres=# explain analyze select * from fun_isliked(13, 68);
                                                QUERY PLAN                                                
----------------------------------------------------------------------------------------------------------
 Function Scan on fun_isliked  (cost=0.25..0.26 rows=1 width=1) (actual time=0.398..0.398 rows=1 loops=1)
 Total runtime: 0.416 ms

Qual é uma possível solução alternativa para obter efetivamente o mesmo tempo de execução dentro da função? É mesmo possível? Além disso, estou executando o PostgreSQL 9.3.

Descobri que essa pergunta no SO tinha o que eu precisava, mas depois de tentar de tudo na resposta selecionada e não ter sucesso em reduzir o tempo de execução, decidi fazer uma nova pergunta.

postgresql performance
  • 1 1 respostas
  • 2370 Views

1 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2014-02-07T06:28:39+08:002014-02-07T06:28:39+08:00

    O elefante na sala é a sobrecarga de funções . Ao chamar uma função em vez de SQL bruto, o Postgres precisa procurar a função nos catálogos do sistema (possivelmente escolhendo a melhor correspondência em caso de sobrecarga de função) e considerar as configurações da função. E depois há a sobrecarga para a própria chamada de função. Isso adiciona um pequeno custo indireto.

    Isso realmente importa apenas para consultas muito simples como o seu exemplo - que deve ser implementado com uma função SQL simples. Você ainda encontra alguma (minúscula) sobrecarga de função com uma função SQL, mas pode ser "embutida" se for simples SELECTe algumas pré-condições forem atendidas .

    Como sempre, as chamadas repetidas lucram com o cache preenchido. E no caso de funções plpgsql, ele também pode começar a usar um plano genérico após algumas (normalmente 5) chamadas, se isso parecer promissor.

    Considere esta discussão relacionada em pgsql-general .

    Planos de consulta para código dentro de funções plpgsql

    Você está se perguntando:

    explain analyzeaté mostra o uso de índices no primeiro caso, mas não no segundo [função plpgsql].

    As funções plpgsql são caixas pretas para o planejador de consulta, que não examina o conteúdo da função. Eles agem como barreiras de otimização. Ao contrário das funções SQL, seu conteúdo não pode ser embutido em consultas externas.

    Esta é a razão pela qual EXPLAIN ANALYZEnão mostra o que está acontecendo dentro da função plpgsql e, portanto, você não vê nenhuma varredura de índice. O índice (provavelmente) ainda é usado. Você pode usar o módulo adicional auto_explainpara dar uma olhada nos planos de consulta para o código SQL dentro da função. Considere as respostas a esta pergunta relacionada para obter detalhes:

    • Plano de consulta Postgres de uma invocação UDF escrita em pgpsql
    • 5

relate perguntas

  • Sequências Biológicas do UniProt no PostgreSQL

  • Como determinar se um Índice é necessário ou necessário

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve