CLUSTER

Name

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

Synopsis

CLUSTER nome_do_índice ON nome_da_tabela
  

Entradas

nome_do_índice

O nome de um índice.

nome_da_tabela

O nome de uma tabela.

Saídas

CLUSTER

O agrupamento foi realizado com sucesso.

ERROR: relation <numero_tabelarelação> inherits "nome_da_tabela"

ERROR: Relation nome_da_tabela does not exist!

Descrição

O comando CLUSTER instrui o PostgreSQL para agrupar a tabela especificada por nome_da_tabela baseado no índice especificado por nome_do_índice. É necessário que o índice tenha sido criado anteriormente na tabela nome_da_tabela.

Quando a tabela é agrupada, ela é fisicamente reordenada baseado na informação do índice. O agrupamento é estático. Em outras palavras, assim que a tabela for atualizada as modificações não serão agrupadas. Nenhuma tentativa é feita para manter as novas instâncias ou as tuplas atualizadas agrupadas. Se for desejado, a tabela pode ser reagrupada manualmente executando-se o comando novamente.

Notas

Na realidade a tabela é copiada para uma tabela temporária ordenada pelo índice e, em seguida, renomeada para o seu nome original. Por esta razão, todas as permissões de acesso concedidas e os outros índices são perdidos quando o agrupamento é realizado.

No caso de se estar acessando uma única linha da tabela aleatoriamente, a ordem física dos dados da tabela não é importante. Entretanto, havendo uma tendência para acessar alguns dados mais do que outros, se existir um índice que agrupa estes dados haverá benefício se o comando CLUSTER for utilizado.

Outra situação em que o comando CLUSTER é útil são os casos em que se usa o índice para acessar várias linhas da tabela. Se for solicitada uma faixa de valores indexados de uma tabela, ou um único valor indexado possuindo muitas linhas que correspondam a este valor, o comando CLUSTER ajuda porque quando o índice identifica a página da primeira linha todas as outras linhas estarão provavelmente nesta mesma página, reduzindo o acesso ao disco e acelerando a consulta.

Existem duas maneiras de se agrupar os dados. A primeira é com o comando CLUSTER, que reordena a tabela original na ordem do índice especificado. Este procedimento pode ser lento para tabelas grandes porque as linhas são lidas da tabela 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.

Outra maneira de agrupar a tabela é usar

SELECT lista_de_colunas INTO TABLE nova_tabela
     FROM nome_da_tabela ORDER BY lista_de_colunas
    

que usa o código de ordenação do PostgreSQL da cláusula ORDER BY para fazer o papel do índice, o que é muito mais rápido 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 os índices da tabela devem ser recriados. O único problema é que o OID não é preservado. Deste momento em diante o comando CLUSTER deverá ser rápido, porque a maior parte dos dados da tabela estará ordenada, e o índice existente é usado.

Utilização

Agrupar a relação empregados baseado no atributo salário:

CLUSTER emp_ind ON emp;
  

Compatibilidade

SQL92

Não existe o comando CLUSTER no SQL92.