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 / 1937
Accepted
Adam Matan
Adam Matan
Asked: 2011-03-29 03:57:24 +0800 CST2011-03-29 03:57:24 +0800 CST 2011-03-29 03:57:24 +0800 CST

REINDEX é perigoso?

  • 772

Estou tentando COUNT(*)uma tabela com 150.000 linhas que possui uma chave primária. Demorou cerca de 5 minutos, então descobri que é um problema de indexação.

Citando o manual do PostgreSQL :

REINDEX é semelhante a descartar e recriar o índice, pois o conteúdo do índice é reconstruído do zero. No entanto, as considerações de bloqueio são bastante diferentes. REINDEX bloqueia gravações, mas não leituras da tabela pai do índice. Ele também requer um bloqueio exclusivo no índice específico que está sendo processado, o que bloqueará as leituras que tentarem usar esse índice (...) O CREATE INDEX subsequente bloqueia as gravações, mas não as leituras; como o índice não está lá, nenhuma leitura tentará usá-lo, o que significa que não haverá bloqueio, mas as leituras podem ser forçadas a varreduras sequenciais caras.

De sua própria experiência, você pode dizer:

  • é REINDEXINGperigoso? Isso pode prejudicar a consistência dos dados?
  • Pode levar muito tempo?
  • É uma solução provável para o meu cenário?

Atualizar:

A solução que funcionou para nós foi recriar o mesmo índice com um nome diferente e, em seguida, excluir o índice antigo.

A criação do índice é muito rápida e reduzimos o tamanho do índice de 650 MB para 8 MB. Usar um COUNT(*)with betweenleva apenas 3 segundos.

postgresql
  • 2 2 respostas
  • 17569 Views

2 respostas

  • Voted
  1. Best Answer
    BillThor
    2011-03-29T05:56:21+08:002011-03-29T05:56:21+08:00

    A reindexação não é perigosa e não pode prejudicar a consistência dos dados. No entanto, se você tiver gravações críticas de tempo, poderá perder dados se a tabela estiver bloqueada e o DML for abortado.

    A reindexação não deve levar muito tempo, mas geralmente envolve a leitura de toda a tabela, a classificação dos campos de índice e a gravação de um novo índice. Dado o tempo para COUNT(*)isso, provavelmente levará cinco minutos ou mais.

    É improvável que seja um problema de indexação. COUNT(*)deve usar uma varredura de tabela, caso em que nenhum índice é lido. Eu esperaria que você tivesse algum tipo de problema de IO.

    Tente usar COUNT(1)ou COUNT(pk_field)que pode usar o índice.

    Se você estiver executando em uma plataforma Unix ou Linux, talvez queira monitorar a atividade do disco com sar. Você também pode ter um disco com falha que pode reduzir drasticamente as taxas de E/S.

    Tabelas com objetos grandes também podem aumentar significativamente o IO para construir os registros para COUNT(*).

    • 15
  2. Jim Dennis
    2011-03-29T16:34:45+08:002011-03-29T16:34:45+08:00

    Não tenho certeza da melhor resposta para você. No entanto, este tópico parece oferecer algumas boas sugestões:n http://postgresql.1045698.n5.nabble.com/count-performance-issue-td2067873.html

    Uma observação é que você pode implementar um TRIGGER para manter as contagens de linhas em uma tabela separada (se COUNT(*) for chamado com frequência por seus aplicativos).

    Algumas das respostas sugerem que isso é sintomático de um banco de dados que não foi aspirado recentemente (sugerindo que o autovacuum está desativado em seu servidor ou para esse banco de dados em particular)?

    Outra sugestão se parece com:

    ANALYZE tablename;
    SELECT reltuple FROM pg_class WHERE relname = 'tablename';
    

    E alguém identificado como A. Kretschmer observa:

    Não. A implementação do índice atual não contém informações sobre a visibilidade da linha na transação atual. Você precisa verificar toda a tabela de dados para obter se a linha atual está visível na transação atual.

    ... apoiando meu comentário sobre as permissões em nível de linha serem uma preocupação de desempenho.

    Minha pesquisa também revelou WikiVS: MySQL vs. PostgreSQL: COUNT(*) .

    Você pode examinar os outros resultados que encontrei usando Google:postgresql count(*) performance

    • 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

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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