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 / 335744
Accepted
Joe
Joe
Asked: 2024-02-12 20:05:34 +0800 CST2024-02-12 20:05:34 +0800 CST 2024-02-12 20:05:34 +0800 CST

A criação do Aurora PostgreSQL TEMP TABLE consome mais CPU do que o esperado?

  • 772

Estou executando um Aurora PostgreSQL em uma db.x2g.2xlargeinstância. A simples criação de tabela temporária apareceu como a terceira maior espera, o que me surpreende, pois esperava que fosse uma das consultas mais leves.

A consulta é chamada em uma transação:

CREATE TEMP TABLE identifiers_to_resolve (  
  scheme_pk BIGINT,
  host_pk BIGINT,
  port INT NOT NULL,
  scheme_specific_part VARCHAR NOT NULL,
  index INTEGER NOT NULL
)  ON COMMIT DROP;

Quero usar a tabela temporária como um armazenamento temporário na transação durante uma consulta mais complicada.

As estatísticas dos insights de desempenho:

  • Carga por espera (AAS): 0,42
  • Chamadas/s: 123,64
  • Acertos pretos/s: 48.499,58
  • Gravações pretas/seg: 16,32
  • Latência média ms/chamada: 3,24
  • Preto atinge/liga 329,27
  • Blk escreve/chama 0,13

Todas as outras estatísticas são 0.

Os insights de desempenho registram as esperas como quase todas as "CPU". Captura de tela anexada.

39

Acho que 123 chamadas por segundo é uma taxa bastante baixa e estou surpreso que esteja sobrecarregando tanto o banco de dados e afetando tantos blocos. Pelos casos de uso que li sobre tabelas temporárias, esperava que tivessem menor impacto.

É típico que a criação de tabelas temporárias cause tanta espera na CPU?

postgresql
  • 1 1 respostas
  • 29 Views

1 respostas

  • Voted
  1. Best Answer
    bobflux
    2024-02-14T20:01:07+08:002024-02-14T20:01:07+08:00

    Resumindo meus comentários em uma resposta:

    begin; 
    create temporary table foo2( id integer primary key) on commit drop; 
    insert into foo select * from generate_series(1.100) n; 
    select count(*) from foo; 
    commit;
    
    BEGIN          0.302 ms
    CREATE TABLE   2.949 ms
    INSERT 0 100   0.897 ms
    count          0.377 ms
    COMMIT         1.773 ms
    
    Total          6.298 ms
    
    create temporary table foo( id integer primary key) on commit delete rows; 
    
    begin; 
    insert into foo select * from generate_series(1.100) n; 
    select count(*) from foo; 
    commit;
    
    BEGIN          0.276 ms
    INSERT 0 100   1.191 ms
     count         0.510 ms
    COMMIT         0.827 ms
    
    Total          2.804 ms
    

    Criar e destruir tabelas temporárias envolve operações de catálogo de arquivos e sistema que levam tempo.

    No exemplo acima, isso é visível na criação da tabela temporária, mas também no commit, quando ela é excluída.

    A tabela temporária mais "permanente" criada com "on commit delete rows" evita a maioria dessas operações, pois é simplesmente truncada no final da transação. A criação e exclusão de tabelas são ignoradas, por isso é muito mais rápido.

    Se você usar um pooler de conexões, poderá criar as tabelas temporárias quando a conexão for aberta e mantê-las para todos os usos subsequentes dessa conexão. Basta criá-los com "ON COMMIT DELETE ROWS" para que a tabela seja truncada após cada uso.

    Se o seu pool usar DISCARD ALL ao obter uma conexão já aberta e passá-la para um cliente, isso também descarta tabelas temporárias, portanto deve ser alterado. Infelizmente, não há como descartar tudo, exceto tabelas temporárias, com um comando, e geralmente não é uma boa ideia manter algum estado persistente quando as conexões são reutilizadas, portanto, isso requer um pouco de reflexão.

    Quando várias conexões criam tabelas temporárias com o mesmo nome, elas não são a mesma tabela. Eles têm o mesmo nome, mas cada tabela temporária existe apenas nos catálogos do sistema da conexão que a abriu e cada uma possui seus próprios arquivos em disco.

    Portanto, o motivo pelo qual eles não verão as linhas um do outro não é devido às regras de visibilidade da transação... mas simplesmente porque são tabelas diferentes.

    • 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