Pergunta

Atualmente, estou limpando uma mesa com 2 índices e 250 milhões de linhas ativas e aproximadamente quantas linhas mortas (ou mais). I emitiu o comando VACCUM CHEIA ANALISAR do meu computador cliente (laptop) para o meu servidor. Foi indo sobre seu negócio para os últimos 3-4 dias ou mais; Eu estou querendo saber se ele vai acabar tão cedo, pois tenho muito trabalho a fazer!

O servidor tem um quad-código Xeon 2,66 GHz, 12 GB ou RAM e um controlador RAID ligado a 2 x 10K rpm 146 GB SAS HDS em uma configuração RAID 1; ele está sendo executado Suse Linux. Eu estou querendo saber ...

Agora, em primeiro lugar o processo postmaster VÁCUO parece estar fazendo uso de apenas um núcleo. Em segundo lugar, eu não estou vendo um muito alto I / O gravações para I relação tempo / O ocioso. Em terceiro lugar, de chamar procinfo, posso extrapolar que o processo de vácuo passa a maior parte de seu tempo (88%) à espera de I / 0.

Então, por que não é utilizando mais núcleos através de tópicos, a fim de sobrecarregar o controlador RAID (obter alto I / O escreve a proporção de idle)? Por que é à espera de I / O se a carga I / O não é alta? Por que não ir mais rápido com todo esse poder / recursos em seus dedos? Parece-me que o vácuo pode e deve ser multithreaded, especialmente se ele está trabalhando em uma enorme mesa e é o único trabalho!

Além disso, é a sua maneira de postgresql.conf configure para deixá-lo multithread tais VACUUM? Eu posso matá-lo e ainda beneficiar da sua parcial clean-up? Eu preciso trabalhar nessa tabela.

[Estou usando PostgreSQL 8.1]

Thx novamente

Foi útil?

Solução

Você não diz qual a versão do PostgreSQL você está usando. É possível, é pré-8.0?

Eu tive esse mesmo cenário exato. Sua melhor melhor:

  • matar o vácuo
  • fazer backup da tabela com pg_dump -t opção
  • descartar a tabela
  • restaurar a tabela

Se você estiver usando 8.x, olhada nas opções autovacuum. Vácuo é único segmento, não há nada que você pode fazer para torná-lo usar vários segmentos.

Outras dicas

Algumas dicas rápidas:

  • Executar VACUUM FULL VERBOSE para que você possa se o que está acontecendo.
  • Retirar todos os índices antes do vácuo. É mais rápido para reconstruí-las de vácuo-los. Você também precisa reconstruir-los agora e, em seguida, porque VACUUM FULL não é bom o suficiente (especialmente em um PosgreSQL tão antiga como 8.1).
  • Defina o maintenance_work_mem muito alto.
  • Use um PostgreSQL mais recente. Btw, 8,4 terá uma grande melhoria na aspiração.

Uma alternativa para vácuo é para despejar e restaurar.

Edit: Desde 9,0 VACUUM FULL reescreve a tabela inteira. É basicamente a mesma coisa que fazer um despejo + restaurar, portanto executar REINDEX é desnecessário.

Você tem certeza que não tem nada em andamento que poderiam bloquear tabelas e evitar vácuo de correr?

(De qualquer forma, é melhor usar vacuum_cost_delay de modo que o vácuo não é prejudicial para a produção.)

vácuo velha completa é um fóssil. É muito lento também, e você tem que REINDEX depois. Não usá-lo. Se você realmente deseja desfragmentar uma tabela, uso do cluster, ou esta:

Lettssay você tem algum espaço livre em disco, isso é muito mais rápido do despejo e de recarga:

CREATE TABLE newtable AS SELECT * FROM oldtable;
CREATE INDEX bla ON newtable( ... );
ALTER TABLE oldtable RENAME TO archive;
ALTER TABLE newtable RENAME TO oldtable;

Note que este não irá copiar suas limitações. Você pode usar CREATE TABLE como ... para copiá-los.

Então, por que não está utilizando mais núcleos através de tópicos

pg não suporta isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top