CLUSTER

Nome

CLUSTER -- agrupa a tabela de acordo com um índice

Sinopse

CLUSTER nome_do_índice ON nome_da_tabela
CLUSTER nome_da_tabela
CLUSTER

Descrição

O comando CLUSTER instrui o PostgreSQL para agrupar a tabela especificada por nome_da_tabela, com base no índice especificado por nome_do_índice. O índice deve ter sido definido anteriormente na tabela nome_da_tabela.

Ao ser agrupada, a tabela é fisicamente reordenada com base na informação do índice. O agrupamento é feito uma única vez: ao ser posteriormente atualizada, as modificações feitas na tabela não são agrupadas, ou seja, nenhuma tentativa é feita para manter as tuplas novas ou atualizadas na ordem do índice. Se for desejado, a tabela pode ser reagrupada periodicamente executando este comando novamente.

Quando a tabela é agrupada, o PostgreSQL registra qual foi o índice utilizado para agrupar. A forma CLUSTER nome_da_tabela reagrupa a tabela utilizando o mesmo índice utilizado anteriormente.

O comando CLUSTER sem nenhum parâmetro reagrupa todas as tabelas do banco de dados corrente pertencentes ao usuário que está executando o comando, ou todas as tabelas se for executado por um superusuário (As tabelas que nunca foram agrupadas não são incluídas). Esta forma do comando CLUSTER não pode ser chamada dentro de uma transação ou de uma função.

Durante o agrupamento da tabela é obtido o bloqueio ACCESS EXCLUSIVE, que não permite realizar qualquer outra operação de banco de dados na tabela (tanto de leitura quanto de escrita) até o comando CLUSTER terminar.

Parâmetros

nome_do_índice
O nome do índice.
nome_da_tabela
O nome da tabela (opcionalmente qualificado pelo esquema).

Observações

No caso do acesso aleatório a uma única linha da tabela, a ordem física dos dados da tabela não é importante. Entretanto, havendo tendência para acessar alguns dados mais que outros, e havendo um índice agrupando estes dados, a utilização do comando CLUSTER trará benefícios. Se for acessada uma faixa de valores indexados de uma tabela, ou um único valor indexado possuindo vária linhas correspondendo a este valor, o comando CLUSTER ajuda, porque quando o índice identifica a página da primeira linha, provavelmente todas as outras linhas estarão nesta mesma página, reduzindo o acesso ao disco e acelerando a consulta.

Durante a operação de agrupamento, uma cópia temporária da tabela é criada contendo os dados da tabela na ordem do índice. Também são criadas cópias temporárias de cada índice da tabela. Portanto, é necessário um espaço livre em disco pelo menos igual à soma do tamanho da tabela com os tamanhos de seus índices.

Como o comando CLUSTER guarda a informação de agrupamento, é possível agrupar as tabelas desejadas manualmente na primeira vez e, depois, configurar um evento periódico, como no VACUUM, para que as tabelas sejam periodicamente reagrupadas.

Como o planejador registra estatísticas sobre a ordem das linhas nas tabelas, é aconselhável executar o comando ANALYZE na tabela recém agrupada, senão o otimizador poderá fazer escolhas ruins no planejamento dos comandos.

Existe outra forma de agrupar os dados. O comando CLUSTER reordena a tabela original usando a ordem do índice especificado. Este procedimento pode ser lento para tabelas grandes, porque as linhas são lidas no disco na ordem do índice e, se a tabela não estiver ordenada, as linhas estarão em páginas aleatórias, fazendo uma página do disco ser lida para cada linha movida; o PostgreSQL possui um cache, mas a maioria das tabelas grandes não cabem no cache. A outra forma de agrupar a tabela é usar

CREATE TABLE nova_tabela AS
    SELECT lista_de_colunas FROM tabela ORDER BY lista_de_colunas;

que utiliza o código de ordenação da cláusula ORDER BY do PostgreSQL para criar a ordem desejada; geralmente é muito mais rápido que a varredura do índice para dados não ordenados. Em seguida, a tabela original deve ser removida, o comando ALTER TABLE...RENAME deve ser utilizado para mudar o nome da nova_tabela para o nome da tabela original, e recriados os índices da tabela. Entretanto, esta abordagem não preserva os OIDs, restrições, relacionamentos de chaves estrangeiras, privilégios concedidos e outras propriedades da tabela — todos estes itens deverão ser recriados manualmente.

Exemplos

Agrupar a tabela empregados baseado no seu índice idx_emp:

CLUSTER idx_emp ON empregados;

Agrupar a tabela empregados utilizando o mesmo índice especificado anteriormente:

CLUSTER empregados;

Agrupar todas as tabelas de um banco de dados que foram agrupadas anteriormente:

CLUSTER;

Compatibilidade

Não existe o comando CLUSTER no padrão SQL.

Veja também

clusterdb
SourceForge.net Logo