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 / 344499
Accepted
Purushottam Nawale
Purushottam Nawale
Asked: 2025-01-02 15:04:41 +0800 CST2025-01-02 15:04:41 +0800 CST 2025-01-02 15:04:41 +0800 CST

Criando índices e chaves primárias de forma eficiente em uma tabela grande com 70 milhões de registros

  • 772

Estou trabalhando com uma tabela que contém aproximadamente 70 milhões de registros. Preciso criar uma chave primária e vários índices nesta tabela. As consultas SQL que estou usando são as seguintes:

BEGIN;
ALTER TABLE table_name ADD CONSTRAINT table_name_pkey PRIMARY KEY (uniqueid);
CREATE INDEX IF NOT EXISTS table_name_column1_idx ON table_name (column1);
CREATE INDEX IF NOT EXISTS table_name_column2_idx ON table_name (column2);
CREATE INDEX IF NOT EXISTS table_name_column3_idx ON table_name (column3);
CREATE INDEX IF NOT EXISTS table_name_column4_idx ON table_name (column4);
CREATE INDEX IF NOT EXISTS table_name_column5_idx ON table_name (column5);
COMMIT;

No entanto, executar essas consultas leva um tempo considerável. Não tenho nenhuma restrição de recursos, então estou procurando maneiras de otimizar esse processo. Especificamente, estou considerando executar essas consultas SQL em paralelo ou simultaneamente a partir de um aplicativo Python Django.

Minhas perguntas são:

1. Quais estratégias posso usar para minimizar bloqueios e tornar o processo de indexação mais rápido?
2. Existem práticas recomendadas ou ferramentas que podem ajudar a gerenciar a criação de vários índices em uma tabela grande de forma eficiente?
3. Usar BEGIN; COMMIT; durante a criação do índice traz algum benefício de desempenho?

Qualquer conselho ou recomendação será muito apreciado.

postgresql
  • 2 2 respostas
  • 74 Views

2 respostas

  • Voted
  1. Melkij
    2025-01-02T19:19:39+08:002025-01-02T19:19:39+08:00

    No caso de CREATE INDEX, é bem simples: não escreva CREATE INDEX, sempre escreva CREATE INDEX CONCURRENTLY. CREATE INDEXé mais rápido e requer menos recursos, mas bloqueia a tabela para escrita, então, em produção, CONCURRENTLY é sempre usado.

    Mas vou anotar separadamente: sempre verifique o código de retorno do comando. Um CREATE INDEX CONCURRENTLY interrompido por qualquer motivo deixará um índice inválido que não pode ser usado em consultas, mas repetido CREATE INDEX IF NOT EXISTSnão completará sua criação.


    No caso de adicionar chave primária, há uma possibilidade de usar CONCURRENTLY, mas é menos óbvio. É necessário dividir o comando em partes.

    ALTER TABLE table_name ADD CONSTRAINT table_name_pkey PRIMARY KEY (uniqueid);
    

    isso será funcionalmente equivalente sem bloqueios longos:

    create unique index concurrently table_name_new_pkey on table_name(uniqueid);
    begin;
    set local statement_timeout to '1s';
    alter table table_name ADD CONSTRAINT table_name_pkey PRIMARY KEY USING INDEX table_name_new_pkey;
    commit;
    

    Observe que a chave primária requer implicitamente um índice exclusivo e que todos os campos de chave primária sejam declarados NOT NULL. Verifique a definição da tabela antes de migrar. Se necessário e você tiver o postgresql 12 ou mais recente, então NOT NULL sem um long lock pode ser definido dessa forma .


    Usar BEGIN; COMMIT; durante a criação do índice traz algum benefício de desempenho?

    Não, pelo contrário, não permitirá o uso de nenhuma abordagem para minimizar o bloqueio.

    • 4
  2. Best Answer
    goodfella
    2025-01-02T16:26:02+08:002025-01-02T16:26:02+08:00

    A criação de índices normalmente bloqueia todas as gravações na tabela de destino. Para evitar esses bloqueios, você pode usar a CONCURRENTLYcláusula, que permite gravações simultâneas durante a criação do índice. Embora esse método exija mais esforço e leve mais tempo para ser concluído em comparação à abordagem padrão, é a escolha preferida em ambientes de produção.

    CREATE INDEX CONCURRENTLY IF NOT EXISTS table_name_column1_idx ON table_name (column1);
    

    Para reduzir o tempo gasto na criação do índice, considere aumentar o maintenance_work_meme max_parallel_maintenance_workers. Essa configuração pode ser ajustada no nível do servidor ou no nível da sessão. No entanto, criar vários índices simultaneamente pode sobrecarregar os recursos de E/S e memória do seu sistema, então é melhor criá-los sequencialmente.

    Definir explicitamente uma instrução de criação de índice é desnecessário, pois o CONCURRENTLYmétodo manipula inerentemente múltiplas transações para evitar bloqueios.

    Considere também criar compound indexesou covering indexessubstituir um índice individual se for adequado para as cargas de trabalho de consulta.

    • 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

    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