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 / 190156
Accepted
ldrg
ldrg
Asked: 2017-11-06 08:42:47 +0800 CST2017-11-06 08:42:47 +0800 CST 2017-11-06 08:42:47 +0800 CST

O Postgres pode usar uma varredura somente de índice para esta consulta com tabelas unidas?

  • 772

Esta é uma continuação de: A cobertura de índices no PostgreSQL ajuda as colunas JOIN?

Considere o inverso do esquema na outra pergunta em que você filtra na tabela unida:

CREATE TABLE thing_types(
   id              INTEGER PRIMARY KEY
 , first_lvl_type  TEXT
 , second_lvl_type TEXT
);

CREATE TABLE things(
   id         INTEGER PRIMARY KEY
 , thing_type INTEGER REFERENCES thing_types(id)
 , t1c1       INTEGER
);

E uma consulta assim:

SELECT things.t1c1
FROM   things
JOIN   thing_types ON things.thing_type = thing_types.id
WHERE  thing_types.first_lvl_type = 'Book'
AND    thing_types.second_lvl_type = 'Biography';

É loucura ter um índice como:

CREATE INDEX ON thing_types(first_lvl_type, second_lvl_type, id);

que cobre a chave primária para uso nessa junção? O índice será usado como um índice de cobertura para ajudar JOINna consulta acima? Devo alterar minha estratégia de indexação para cobrir a chave primária com mais frequência quando sei que a tabela será JOINeditada assim?

postgresql index
  • 2 2 respostas
  • 3262 Views

2 respostas

  • Voted
  1. Best Answer
    Erwin Brandstetter
    2017-11-06T09:08:16+08:002017-11-06T09:08:16+08:00

    Se as pré-condições adicionais para uma varredura somente de índice forem atendidas, faz todo o sentido anexar a coluna idcomo coluna final ao índice (não como coluna inicial):

    CREATE INDEX ON thing_types(first_lvl_type, second_lvl_type, id);
    

    O Postgres 11 introduz índices de cobertura reais com a palavra- INCLUDEchave .

    CREATE INDEX ON thing_types(first_lvl_type, second_lvl_type) INCLUDE (id);
    

    Apenas um pequeno benefício para o seu caso, mas é uma ótima opção para adicionar colunas a um índice ou restrição UNIQUE ou PK.

    Sobre verificações somente de índice:

    • A Wiki do Postgres
    • O manual

    A pré-condição mais importante: O mapa de visibilidade da tabela thing_typesdeve mostrar a maioria ou todas as páginas como "visíveis" para todas as transações. Ou seja, a tabela é somente leitura ou suas configurações de autovacuum são agressivas o suficiente para limpar continuamente após as gravações na tabela.

    Cada índice adicional adiciona custos. Principalmente para escrever desempenho. Mas também efeitos colaterais, como capacidades de cache esgotadas. (Várias consultas usando os mesmos índices têm uma chance melhor de residir no cache.) Portanto, também é uma questão de tamanho . idé normalmente uma coluna muito pequena integerou bigint. Torna-o um bom candidato para o caso de uso.

    Em particular, adicionar uma coluna a um índice desativa a opção de atualizações HOT envolvendo a coluna. Mas como idé indexado de qualquer maneira e normalmente não é atualizado (sendo o PK), isso não é um problema neste caso. Relacionado:

    • Dados redundantes em declarações de atualização

    Se você realmente obtém verificações somente de índice desses índices na maioria das vezes, normalmente faz sentido usá-los. Teste com EXPLAIN.

    Havia limitações para índices parciais em versões mais antigas. Citando as notas de lançamento do Postgres 9.6 :

    • Permitir o uso de uma varredura somente de índice em um índice parcial quando a WHEREcláusula do índice fizer referência a colunas não indexadas (Tomas Vondra, Kyotaro Horiguchi)

      Por exemplo, um índice definido por CREATE INDEX tidx_partial ON t(b) WHERE a > 0agora pode ser usado para uma verificação somente de índice por uma consulta que especifica WHERE a > 0e não usa de outra formaa . Anteriormente, isso não era permitido porque a não está listado como uma coluna de índice.

    • 3
  2. Evan Carroll
    2017-11-07T12:06:43+08:002017-11-07T12:06:43+08:00

    Você precisa experimentá-lo e ver o seu plano de consulta específico. Você está fazendo muitas suposições gerais sobre o conselho dado e até mesmo o potencial para que ele seja útil para sua consulta.

    • Tamanho.
    • Número principal do PostgreSQL
    • Configuração para custos.
    • Staleness e precisão das estatísticas.

    Todas essas coisas importam.

    Não quero ser vago aqui, mas eu poderia evocar alguns exemplos para mostrar isso.

    Geralmente, eu não indexaria algo que já está indexado na tabela. Se por nenhum outro motivo, porque para cada vez que um índice cobre uma coluna específica, você tem mais um índice que precisa ser atualizado quando você altera a linha.

    • 0

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