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 / 106264
Accepted
Erwin Brandstetter
Erwin Brandstetter
Asked: 2015-07-08 16:25:17 +0800 CST2015-07-08 16:25:17 +0800 CST 2015-07-08 16:25:17 +0800 CST

Linha "Recheck Cond:" em planos de consulta com uma varredura de índice de bitmap

  • 772

Este é um desdobramento dos comentários da pergunta anterior:

  • A consulta do Postgres 9.4.4 leva uma eternidade

Usando o PostgreSQL 9.4, sempre parece haver uma Recheck Cond:linha após as varreduras de índice de bitmap nos planos de consulta gerados por arquivos EXPLAIN.

Como na EXPLAINsaída da pergunta referenciada:

->  Bitmap Heap Scan on table_three  (cost=2446.92..19686.74 rows=8159 width=7)
      Recheck Cond: (("timestamp" > (now() - '30 days'::interval)) AND (client_id > 0))
      ->  BitmapAnd  (cost=2446.92..2446.92 rows=8159 width=0)
            ->  Bitmap Index Scan on table_one_timestamp_idx  (cost=0.00..1040.00 rows=79941 width=0)
                  Index Cond: ("timestamp" > (now() - '30 days'::interval))
            ->  Bitmap Index Scan on fki_table_three_client_id  (cost=0.00..1406.05 rows=107978 width=0)
                  Index Cond: (client_id > 0)

Ou na saída de EXPLAIN ANALYZEuma tabela enorme e simples (com muito pouco work_mem):

EXPLAIN ANALYZE SELECT * FROM aa WHERE a BETWEEN 100000 AND 200000;
Bitmap Heap Scan on aa  (cost=107.68..4818.05 rows=5000 width=4) (actual time=27.629..213.606 rows=100001 loops=1)
  Recheck Cond: ((a >= 100000) AND (a <= 200000))
  Rows Removed by Index Recheck: 758222
  Heap Blocks: exact=693 lossy=3732
  ->  Bitmap Index Scan on aai  (cost=0.00..106.43 rows=5000 width=0) (actual time=27.265..27.265 rows=100001 loops=1)
        Index Cond: ((a >= 100000) AND (a <= 200000))

Isso significa que as condições de índice devem ser verificadas uma segunda vez após uma varredura de índice de bitmap?
O que mais podemos aprender com a EXPLAINsaída?

postgresql index
  • 2 2 respostas
  • 14161 Views

2 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2015-07-08T16:52:22+08:002015-07-08T16:52:22+08:00

    Como @Chris comentou corretamente na questão referenciada :

    uma pequena investigação parece indicar que a condição de nova verificação é sempre impressa no EXPLAIN, mas na verdade só é executada quando work_memé pequena o suficiente para que o bitmap fique com perdas. Pensamentos? http://www.postgresql.org/message-id/[email protected]

    Embora tudo isso seja verdade e o desenvolvedor central Heikki Linnakangas seja uma fonte de primeira classe, o post data de 2007 (Postgres 8.2). Aqui está uma postagem no blog de Michael Paquier com uma explicação detalhada do Postgres 9.4 , onde a saída EXPLAIN ANALYZEfoi aprimorada com mais informações.

    A Recheck Cond:linha está sempre presente para varreduras de índice de bitmap. A saída de basic EXPLAINnão nos dirá mais. Obtemos informações adicionais de EXPLAIN ANALYZEcomo pode ser visto na segunda citação na pergunta:

    Heap Blocks: exact=693 lossy=3732
    

    De um total de 4.425 páginas de dados (blocos), 693 tuplas foram armazenadas exatamente (incluindo ponteiros de tupla), enquanto as outras 3.732 páginas tiveram perdas (apenas a página de dados) no bitmap. Isso acontece quando work_memnão é grande o suficiente para armazenar todo o bitmap construído a partir da varredura de índice exatamente (sem perdas).

    A condição do índice deve ser verificada novamente para páginas do compartilhamento com perdas, pois o bitmap lembra apenas quais páginas buscar e não as tuplas exatas na página. Nem todas as tuplas na página passarão necessariamente pelas condições do índice, é necessário verificar novamente a condição.

    Este é o tópico sobre hackers pgsql onde a nova adição foi discutida . O autor Etsuro Fujita fornece uma fórmula de como calcular o mínimo work_mempara evitar entradas de bitmap com perdas e verificações de condição subsequentes. O cálculo não é confiável para casos complexos com várias varreduras de bitmap, portanto, não foi usado para gerar números reais de EXPLAIN. Ainda pode servir como estimativa para casos simples.

    Linha adicionalBUFFERS:

    Além disso, ao executar com a BUFFERSopção: EXPLAIN (ANALYZE, BUFFERS) ...outra linha é adicionada como:

    Buffers: shared hit=279 read=79
    

    Isso indica quanto da tabela subjacente (e índice) foi lido do cache ( shared hit=279) e quanto teve que ser obtido do disco ( read=79). Se você repetir a consulta, a parte "lida" normalmente desaparece para consultas não muito grandes, porque tudo é armazenado em cache agora após a primeira chamada. A primeira chamada informa quanto já foi armazenado em cache. As chamadas subseqüentes mostram quanto seu cache pode suportar (atualmente).

    Existem mais opções. O manual sobre a BUFFERSopção:

    Especificamente, inclua o número de blocos compartilhados atingidos, lidos, sujos e gravados, o número de blocos locais atingidos, lidos, sujos e gravados e o número de blocos temporários lidos e gravados.

    Leia, há mais.
    Aqui está a lista de opções de saída no código-fonte .

    • 24
  2. Chris
    2015-07-08T17:07:45+08:002015-07-08T17:07:45+08:00

    Erwin, já que essa foi a nossa discussão no tópico de comentários anterior, decidi cutucar um pouco mais...

    Eu tenho uma consulta muito simples de uma tabela de tamanho razoável. Eu normalmente tenho o suficiente work_mem, mas neste caso usei os comandos

    SET work_mem = 64;
    

    para definir um muito pequeno work_meme

    SET work_mem = default;
    

    para definir minhas work_memcostas para ser suficientemente grande para minha consulta.

    EXPLICAR e verificar novamente a condição

    Então, executando minha consulta com EXPLAINapenas

    EXPLAIN 
    SELECT * FROM olap.reading_facts
    WHERE meter < 20;
    

    Eu obtive os resultados para baixo e alto work_mem:

    Baixowork_mem

    Bitmap Heap Scan on reading_facts  (cost=898.92..85632.60 rows=47804 width=32)
      Recheck Cond: (meter < 20)
      ->  Bitmap Index Scan on idx_meter_reading_facts  (cost=0.00..886.96 rows=47804 width=0)
            Index Cond: (meter < 20)
    

    Altowork_mem

    Bitmap Heap Scan on reading_facts  (cost=898.92..85632.60 rows=47804 width=32)
      Recheck Cond: (meter < 20)
      ->  Bitmap Index Scan on idx_meter_reading_facts  (cost=0.00..886.96 rows=47804 width=0)
            Index Cond: (meter < 20)
    

    Para encurtar a história, EXPLAINapenas, como esperado, o plano de consulta indica que uma condição Recheck é possível, mas não podemos saber se será realmente computada.

    EXPLICAR ANALISAR E VERIFICAR novamente a condição

    Quando incluímos ANALYZEna consulta, os resultados nos dizem mais sobre o que precisamos saber.

    Baixowork_mem

    Bitmap Heap Scan on reading_facts  (cost=898.92..85632.60 rows=47804 width=32) (actual time=3.130..13.946 rows=51840 loops=1)
      Recheck Cond: (meter < 20)
      Rows Removed by Index Recheck: 86727
      Heap Blocks: exact=598 lossy=836
      ->  Bitmap Index Scan on idx_meter_reading_facts  (cost=0.00..886.96 rows=47804 width=0) (actual time=3.066..3.066 rows=51840 loops=1)
            Index Cond: (meter < 20)
    

    Altowork_mem

    Bitmap Heap Scan on reading_facts  (cost=898.92..85632.60 rows=47804 width=32) (actual time=2.647..7.247 rows=51840 loops=1)
      Recheck Cond: (meter < 20)
      Heap Blocks: exact=1434
      ->  Bitmap Index Scan on idx_meter_reading_facts  (cost=0.00..886.96 rows=47804 width=0) (actual time=2.496..2.496 rows=51840 loops=1)
            Index Cond: (meter < 20)
    

    Novamente, como esperado, a inclusão de ANALYZEnos revela algumas informações muito importantes. No work_memcaso baixo, vemos que há linhas removidas pela nova verificação do índice e que temos lossyblocos de heap.

    Conclusão? (ou falta dela)

    Infelizmente, parece que EXPLAINpor si só não é suficiente para saber se uma nova verificação de índice será realmente necessária porque alguns dos IDs de linha estão sendo descartados em favor da retenção de páginas durante a varredura de heap de bitmap.

    Usar EXPLAIN ANALYZEé bom para diagnosticar os problemas com consultas de comprimento moderado, mas no caso de uma consulta levar muito tempo para ser concluída, executar EXPLAIN ANALYZEpara descobrir que seu índice de bitmap está convertendo em com perdas devido a insuficiente work_memainda é uma restrição difícil. Eu gostaria que houvesse uma maneira de EXPLAINestimar a probabilidade dessa ocorrência a partir das estatísticas da tabela.

    • 12

relate perguntas

  • Quanto "Padding" coloco em meus índices?

  • Sequências Biológicas do UniProt no PostgreSQL

  • O que significa "índice" em RDBMSs? [fechado]

  • Como criar um índice condicional no MySQL?

  • 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