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 / user-284120

St.Mauro's questions

Martin Hope
St.Mauro
Asked: 2023-12-14 17:17:47 +0800 CST

Compreendendo o baixo desempenho da verificação de heap de bitmap do PostgreSQL

  • 6

Estou tentando otimizar uma consulta lenta no PostgreSQL 15. A consulta é bastante complexa com muitos JOINs, um UNION e subconsultas, mas 99% do tempo de execução está no nó mais interno que verifica sequencialmente uma tabela de registros de 700K com uma condição LIKE. O tempo total de execução é de aproximadamente 15 segundos.

Extraindo a tabela e a condição WHERE da consulta:

SELECT * FROM orders WHERE tag ILIKE '%EJ080EJ%';

Gather  (cost=1000.00..18961.33 rows=27 width=454) (actual time=60.552..69.402 rows=0 loops=1)
Workers Planned: 3
Workers Launched: 3
->  Parallel Seq Scan on orders  (cost=0.00..17958.63 rows=9 width=454) (actual time=47.991..47.992 rows=0 loops=4)
      Filter: ((tag)::text ~~* '%EJ080EJ%'::text)
      Rows Removed by Filter: 74044
Planning Time: 0.732 ms
Execution Time: 69.439 ms

Então adicionei um índice usando a extensão GIN e pg_trgm que na minha experiência é útil com condições LIKE:

CREATE INDEX tmp_dba2 ON orders USING GIN (tag gin_trgm_ops);

Bitmap Heap Scan on orders(cost=18.91..48.84 rows=27 width=454) (actual time=0.061..0.062 rows=0 loops=1)
  Recheck Cond: ((tag)::text ~~* '%EJ080EJ%'::text)
  ->  Bitmap Index Scan on tmp_dba2  (cost=0.00..18.90 rows=27 width=0) (actual time=0.060..0.060 rows=0 loops=1)
        Index Cond: ((tag)::text ~~* '%EJ080EJ%'::text)
Planning Time: 0.947 ms
Execution Time: 0.090 ms

Até agora tudo bem. Enfim, executando toda a consulta o índice é usado mas o tempo de execução não muda tanto:

->  Bitmap Heap Scan on orders  (cost=19.22..94.62 rows=68 width=225) (actual time=13495.733..13495.740 rows=2 loops=1)
      Recheck Cond: ((tag)::text ~~* '%EJ080EJ%'::text)
      Heap Blocks: exact=2
      Buffers: shared hit=21
      ->  Bitmap Index Scan on tmp_dba2  (cost=0.00..19.21 rows=68 width=0) (actual time=0.087..0.087 rows=2 loops=1)
            Index Cond: ((tag)::text ~~* '%EJ080EJ%'::text)
            Buffers: shared hit=19

No meu (pobre) entendimento dos componentes internos do Postgres, isso significa que a varredura de índice recupera um bitmap das páginas heap que atendem à condição (2 registros) e, em seguida, a varredura heap lê as páginas para recuperar os dados (2 registros).

Não consigo entender por que a leitura de 2 registros leva 13 segundos, assim como uma varredura sequencial, então adicionar o índice parece inútil.

Alguém pode me ajudar a entender esse comportamento?

postgresql
  • 1 respostas
  • 47 Views

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