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 pelo nome_da_tabela, com base no índice especificado pelo 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 seguem o agrupamento, ou seja, não é feita nenhuma tentativa para armazenar as linhas novas ou atualizadas na ordem do índice. Se for desejado, a tabela poderá 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 para agrupar.

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 um bloco de transação.

Durante o agrupamento da tabela é obtido o bloqueio ACCESS EXCLUSIVE na mesma, 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 na tabela não é importante. Entretanto, havendo tendência a acessar alguns dados mais que outros, e havendo um índice agrupando estes dados juntos, 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árias linhas correspondendo a este valor, o comando CLUSTER ajuda, porque quando o índice identificar a página da tabela da primeira linha correspondendo, provavelmente todas as outras linhas estarão nesta mesma página, reduzindo o acesso a disco e acelerando o comando.

Durante a operação de agrupamento é criada uma cópia temporária da tabela 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 se lembra da informação de agrupamento, é possível agrupar as tabelas desejadas manualmente na primeira vez e, depois, configurar um evento programado, como no VACUUM, para as tabelas serem reagrupadas periodicamente.

Como o planejador usa 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 varrendo a mesma usando o índice especificado. Este procedimento pode ser lento para tabelas grandes, porque as linhas são lidas na tabela na ordem do índice e, se a tabela estiver desordenada, as linhas estarão em páginas aleatórias, obrigando a leitura de uma página do disco 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 uma tabela é usando

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

que utiliza o código de classificação do PostgreSQL para produzir a ordem desejada; geralmente é muito mais rápido que a varredura do índice para dados desordenados. Em seguida, a tabela original deve ser removida, e utilizado o comando ALTER TABLE...RENAME para mudar o nome da nova_tabela para o nome da tabela original, e recriados os índices da tabela. A grande desvantagem desta abordagem é que não preserva os OIDs, restrições, relacionamentos de chave estrangeira, privilégios concedidos e outras propriedades da tabela — todos estes itens deverão ser recriados manualmente. Outra desvantagem é que esta forma requer um arquivo temporário de classificação com cerca do mesmo tamanho da tabela e, portanto, o pico de utilização de disco é de cerca de três vezes o tamanho da tabela, em vez do dobro do tamanho da tabela.

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.

Consulte também

clusterdb
SourceForge.net Logo CSS válido!