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 / 119386
Accepted
St.Antario
St.Antario
Asked: 2015-10-28 23:14:29 +0800 CST2015-10-28 23:14:29 +0800 CST 2015-10-28 23:14:29 +0800 CST

Noções básicas sobre "varredura de heap de bitmap" e "varredura de índice de bitmap"

  • 772

Vou tentar explicar meus mal-entendidos com o seguinte exemplo.

Não entendi os fundamentos do Bitmap Heap Scan Node. Considere a consulta SELECT customerid, username FROM customers WHERE customerid < 1000 AND username <'user100';cujo plano é este:

Bitmap Heap Scan on customers  (cost=25.76..61.62 rows=10 width=13) (actual time=0.077..0.077 rows=2 loops=1)
  Recheck Cond: (((username)::text < 'user100'::text) AND (customerid < 1000))
  ->  BitmapAnd  (cost=25.76..25.76 rows=10 width=0) (actual time=0.073..0.073 rows=0 loops=1)
        ->  Bitmap Index Scan on ix_cust_username  (cost=0.00..5.75 rows=200 width=0) (actual time=0.006..0.006 rows=2 loops=1)
              Index Cond: ((username)::text < 'user100'::text)
        ->  Bitmap Index Scan on customers_pkey  (cost=0.00..19.75 rows=1000 width=0) (actual time=0.065..0.065 rows=999 loops=1)
              Index Cond: (customerid < 1000)

Minha compreensão deste nó :

Conforme explicado lá , os bitmap heap scanblocos de tabela de leitura em ordem sequencial, portanto, não produz sobrecarga de acesso à tabela aleatória que acontece ao fazer apenas Index Scan.

Depois Index Scande feito, o PostgreSQL não sabe como buscar as linhas de forma otimizada, para evitar o desnecessário heap blocks reads(ou hitsse houver um hot cache). Então, para descobrir isso, ele gera a estrutura ( Bitmap Index Scan) chamada bitmapque no meu caso está sendo gerada gerando dois bitmaps dos índices e executando BITWISE AND. Uma vez que o bitmap foi gerado, ele agora pode ler a tabela de forma otimizada em uma ordem sequencial, evitando arquivos desnecessários heap I/O-operations.

Esse é o lugar onde muitas perguntas vêm.

PERGUNTA: Temos apenas um bitmap. Como o PostgreSQL sabe por apenas um bitmap qualquer coisa sobre a ordem física das linhas? Ou gera o bitmap para que qualquer elemento dele possa ser mapeado facilmente para o ponteiro de uma página? Se sim, isso explica tudo, mas é apenas minha suposição.

Então, podemos dizer simplesmente que bitmap heap scan -> bitmap index scané como uma varredura sequencial, mas apenas da parte apropriada da tabela?

postgresql index
  • 2 2 respostas
  • 37819 Views

2 respostas

  • Voted
  1. Best Answer
    Craig Ringer
    2015-10-28T23:37:24+08:002015-10-28T23:37:24+08:00

    Como o PostgreSQL sabe por apenas um bitmap qualquer coisa sobre a ordem física das linhas?

    O bitmap é um bit por página de heap. A varredura de índice de bitmap define os bits com base no endereço de página de heap para o qual a entrada de índice aponta.

    Então, quando ele vai fazer a varredura de heap de bitmap, ele apenas faz uma varredura de tabela linear, lendo o bitmap para ver se ele deve se preocupar com uma página específica ou procurá-la.

    Ou gera o bitmap para que qualquer elemento dele possa ser mapeado facilmente para o ponteiro de uma página?

    Não, o bitmap corresponde 1:1 às páginas heap.

    Eu escrevi um pouco mais sobre isso aqui .


    OK, parece que você pode estar entendendo mal o que "bitmap" significa neste contexto.

    Não é uma string de bits como "101011" que é criada para cada página de heap, ou cada leitura de índice, ou qualquer outra coisa.

    O bitmap inteiro é um array de bit único , com tantos bits quantos as páginas de heap na relação que está sendo varrida.

    Um bitmap é criado pela primeira varredura de índice, começando com todas as entradas 0 (falso). Sempre que uma entrada de índice que corresponde à condição de pesquisa é encontrada, o endereço de heap apontado por essa entrada de índice é pesquisado como um deslocamento no bitmap e esse bit é definido como 1 (verdadeiro). Portanto, em vez de procurar a página de heap diretamente, a varredura de índice de bitmap procura a posição de bit correspondente no bitmap.

    A segunda e outras varreduras de índice de bitmap fazem a mesma coisa com os outros índices e as condições de pesquisa neles.

    Em seguida, cada bitmap é combinado com AND. O bitmap resultante tem um bit para cada página de heap, onde os bits são verdadeiros somente se forem verdadeiros em todas as varreduras de índice de bitmap individuais, ou seja, a condição de pesquisa correspondida para cada varredura de índice. Essas são as únicas páginas de heap que precisamos nos preocupar em carregar e examinar. Como cada página de heap pode conter várias linhas, temos que examinar cada linha para ver se ela corresponde a todas as condições - é disso que trata a parte "recheck cond".

    Uma coisa crucial para entender com tudo isso é que o endereço da tupla em uma entrada de índice aponta para o row's ctid, que é uma combinação do número da página de heap e o deslocamento dentro da página de heap. Uma varredura de índice de bitmap ignora os deslocamentos, pois verificará a página inteira de qualquer maneira e definirá o bit se qualquer linha dessa página corresponder à condição.


    Exemplo gráfico

    Heap, one square = one page:
    +---------------------------------------------+
    |c____u_____X___u___X_________u___cXcc______u_|
    +---------------------------------------------+
    Rows marked c match customers pkey condition.
    Rows marked u match username condition.
    Rows marked X match both conditions.
    
    
    Bitmap scan from customers_pkey:
    +---------------------------------------------+
    |100000000001000000010000000000000111100000000| bitmap 1
    +---------------------------------------------+
    One bit per heap page, in the same order as the heap
    Bits 1 when condition matches, 0 if not
    
    Bitmap scan from ix_cust_username:
    +---------------------------------------------+
    |000001000001000100010000000001000010000000010| bitmap 2
    +---------------------------------------------+
    

    Depois que os bitmaps são criados, um AND bit a bit é executado neles:

    +---------------------------------------------+
    |100000000001000000010000000000000111100000000| bitmap 1
    |000001000001000100010000000001000010000000010| bitmap 2
     &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
    |000000000001000000010000000000000010000000000| Combined bitmap
    +-----------+-------+--------------+----------+
                |       |              |
                v       v              v
    Used to scan the heap only for matching pages:
    +---------------------------------------------+
    |___________X_______X______________X__________|
    +---------------------------------------------+
    

    A varredura de heap de bitmap então procura o início de cada página e lê a página:

    +---------------------------------------------+
    |___________X_______X______________X__________|
    +---------------------------------------------+
    seek------->^seek-->^seek--------->^
                |       |              |
                ------------------------
                only these pages read
    

    e cada página lida é então verificada novamente em relação à condição, pois pode haver > 1 linha por página e nem todas necessariamente correspondem à condição.

    • 93
  2. Rajeev Rastogi
    2018-02-12T20:59:17+08:002018-02-12T20:59:17+08:00

    Consulte minha postagem no blog https://rajeevrastogi.blogspot.in/2018/02/bitmap-scan-in-postgresql.html?showComment=1518410565792#c4647352762092142586 para obter uma descrição detalhada da verificação de bitmap no PostgreSQL.

    Visão geral geral da funcionalidade rápida da varredura de bitmap:

    1. A varredura de heap de bitmap solicita uma tupla da varredura de índice de bitmap.

    2. A Varredura de Índice de Bitmap varre o índice de acordo com a condição quase da mesma maneira que é feita na Varredura de Índice normal. Mas, em vez de retornar o TID (consistindo no número da página e o deslocamento dentro disso) correspondente aos dados do heap, ele adiciona esses TID em um bitmap. Para uma compreensão simples, você pode considerar que este bitmap contém hash de todas as páginas (hash com base no número da página) e cada entrada de página contém matriz de todos os deslocamentos nessa página.

    3. Em seguida, o Bitmap Heap Scan lê o bitmap para obter dados de heap correspondentes ao número da página armazenada e ao deslocamento. Em seguida, ele verifica a visibilidade, qualificação etc. e retorna a tupla com base no resultado de todas essas verificações.

    • 5

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