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 / 302045
Accepted
Evan Carroll
Evan Carroll
Asked: 2021-11-03 16:11:22 +0800 CST2021-11-03 16:11:22 +0800 CST 2021-11-03 16:11:22 +0800 CST

O que é SFRM_Materialize_Preferred e como ele pode ser usado para escrever funções de maior desempenho?

  • 772

Pesquisando essa questão , vejo que existe um valor para SetFunctionReturnModechamado SFRM_Materialize_Preferred. O que é isto? Isso pode ser usado para escrever funções com mais desempenho?

Existem múltiplas ocorrências de SRFM_Materializein,contrib/ mas nenhuma deSRFM_Materalize_Preferred

postgresql postgresql-extensions
  • 1 1 respostas
  • 59 Views

1 respostas

  • Voted
  1. Best Answer
    Evan Carroll
    2021-11-03T16:11:56+08:002021-11-03T16:11:56+08:00

    SFRM_Materialize_Preferred permite- lhe escrever uma função que aceite uma dica do chamador que pode aceitar Materializeou ValuePerCallmode da documentação no README

    Os chamadores que podem suportar ambos ValuePerCalle o Materializemodo definirão SFRM_Materialize_Preferred, ou não, dependendo do modo que preferirem.

    Isso está documentado como dica -- uma extensão para SFRM_Materialize-- na fonte,

    SFRM_Materialize_Randome SFRM_Materialize_Preferredsão sinalizadores auxiliares sobre o SFRM_Materializemodo, em vez de modos separados.

    Você também pode ver que isso é usado no código do PostgreSQL Function Manager para SQLfmgr_sql

    lazyEvalOK = !(rsi->allowedModes & SFRM_Materialize_Preferred);
    

    Minha própria demonstração

    Eu criei minha própria demonstração muito simplificada SFRM_Materialize_Preferredpara fins de benchmarking. Você pode ver isso no meu repositório para o meu arquivopg-srf-repeat . Basicamente, o modelo se resume a isso,

    Datum myfunc(PG_FUNCTION_ARGS);
    PG_FUNCTION_INFO_V1(myfunc);
    
    typedef struct
    {
      ; your function state only used in value-per-call mode
    } myfunc_fctx;
    
    Datum
    myfunc(PG_FUNCTION_ARGS)
    {
      
        ; get variables
        
        if (SRF_IS_FIRSTCALL())
        {
            ReturnSetInfo   *rsinfo       = (ReturnSetInfo *) fcinfo->resultinfo;
    
            // If we prefer materialize, get it done
            if ( rsinfo->allowedModes & SFRM_Materialize_Preferred ) {
    
                MemoryContext   per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;
                MemoryContext   oldcontext    = MemoryContextSwitchTo(per_query_ctx);
    
                Tuplestorestate *tupstore     = tuplestore_begin_heap(false, false, work_mem);
                rsinfo->setResult             = tupstore;
                rsinfo->returnMode            = SFRM_Materialize;
        
                TupleDesc   tupdesc = rsinfo->expectedDesc;
    
                Datum values[1]             = { ;stuff };
                bool  nulls[sizeof(values)] = {0}; # no nulls
    
                while ( times-- ) {
                    tuplestore_putvalues(tupstore, tupdesc, values, nulls);
                }
    
                tuplestore_donestoring(tupstore);
                MemoryContextSwitchTo(oldcontext);
        
                PG_RETURN_NULL();
            }
    
            // Initialize for multicall
            else {
                FuncCallContext *funcctx = SRF_FIRSTCALL_INIT();
                MemoryContext oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
                myfunc_fctx *fctx = (myfunc_fctx *) palloc(sizeof(myfunc_fctx));
    
                # set myfunc_fctx
                funcctx->user_fctx = fctx;
                MemoryContextSwitchTo(oldcontext);
            }
    
        }
        
        FuncCallContext *funcctx  = SRF_PERCALL_SETUP();
        myfunc_fctx *fctx         = funcctx->user_fctx;
    
        # Call this
        SRF_RETURN_NEXT(funcctx, fctx->object);
        # Or this,
        SRF_RETURN_DONE(funcctx);
    
    }
    

    Isso geralmente parece executar o mais rápido de Materializeou ValuePerCalle a sobrecarga da implementação é menor (em comparação com uma implementação pura).

    Em Pg-Python

    Estou mantendo isso aqui por causa da escassez geral de informações pertinentes. Eu determinei que este SRF_SHOULD_MATERIALIZEcaso de macro é realmente muito bobo (eu abri um problema nele) ; o problema com a SRF_SHOULD_MATERIALIZEmacro é SFRM_Materializee SFRM_ValuePerCallsempre é verdade , então essencialmente é apenas uma versão mais lenta de SFRM_Materialize_Preferred**

    Ele também parece ser usado no pg-pythonprojeto que permite acessar o Python 3 a partir do PostgreSQL Functions , mas não há casos de uso em todo o GitHub . A pg-pythonmacro para SRF_SHOULD_MATERIALIZEé a seguinte (veja a nota acima)

    #define SRF_SHOULD_MATERIALIZE(FCINFO) (
      (
        ((ReturnSetInfo *) FCINFO->resultinfo)->allowedModes & SFRM_Materialize
      )
      && (
        !(
          ((ReturnSetInfo *) FCINFO->resultinfo)->allowedModes & SFRM_ValuePerCall
        )
        || ((
          ((ReturnSetInfo *) FCINFO->resultinfo)->allowedModes & SFRM_Materialize_Preferred
        ))
      )
    )
    

    Você pode ver a SRF_SHOULD_MATERIALIZEmacro usada uma vez no site da chamada

    • 1

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • 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