O comando REINDEX reconstrói o índice usando os dados armazenados na tabela do índice, substituindo a cópia antiga do índice. [1] [2] Existem situações nas quais o comando REINDEX é utilizado:
O índice está danificado, e não contém mais dados válidos. Embora na teoria esta situação nunca deva ocorrer, na prática os índices podem ser danificados por causa de erros de programação ou falhas nos equipamentos. O comando REINDEX fornece um método de recuperação.
O índice ficou "dilatado", ou seja, contém muitas páginas vazias ou quase vazias. Esta situação pode ocorrer com índices B-tree no PostgreSQL sob certos padrões de acesso fora do comum. O comando REINDEX fornece uma maneira para reduzir o consumo de espaço do índice através da escrita de uma nova versão do índice sem as páginas mortas. Para obter informações adicionais deve ser consultada a Seção 21.2.
Reconstrói todos os índices do sistema do banco de dados especificado. Os índices das tabelas dos usuários não são processados. Também, os índices nos catálogos do sistema compartilhados são pulados, exceto no modo autônomo (veja abaixo).
Reconstrói todos os índices da tabela especificada. Se a tabela possuir uma tabela secundária "TOAST", esta também será reindexada.
Reconstrói o índice especificado.
O nome do banco de dados, tabela ou índice a ser reindexado. Os nomes das tabelas e dos índices podem ser qualificados pelo esquema. Atualmente o comando REINDEX DATABASE pode reindexar apenas o banco de dados corrente e, por isso, seu parâmetro deve corresponder ao nome do banco de dados corrente.
Esta é uma opção obsoleta; se for especificada será ignorada.
Havendo suspeita que um índice de uma tabela do usuário está danificado, é possível simplesmente reconstruir este índice, ou todos os índices da tabela, usando o comando REINDEX INDEX ou o comando REINDEX TABLE.
A situação fica mais difícil quando é necessário recuperar um índice danificado de uma tabela do sistema. Neste caso é importante para o sistema não ter usado nenhum dos índices suspeitos (Sem dúvida, neste tipo de situação pode acontecer que o processo servidor caia logo na inicialização por depender de índices danificados). Para recuperar com segurança o servidor deverá ser inicializado com a opção -P, que impede a utilização de índice para procura em catálogo do sistema.
Uma forma de fazer, é parar o postmaster e inicializar o servidor PostgreSQL autônomo com a opção -P incluída na linha de comando. Em seguida pode ser executado REINDEX DATABASE, REINDEX TABLE ou REINDEX INDEX, dependendo de quanto se deseja reconstruir. Em caso de dúvida deve ser usado REINDEX DATABASE para selecionar a reconstrução de todos os índices do sistema no banco de dados. Depois a sessão do servidor autônomo deve ser encerrada, e reiniciado o servidor normal. Consulte a página de referência do postgres para obter informações adicionais sobre como interagir com a interface do servidor autônomo.
Como alternativa, pode ser iniciada uma sessão normal do servidor com a opção -P incluída nas opções de linha de comando. O método para se fazer isto varia entre clientes, mas em todos os clientes baseados na biblioteca libpq é possível definir a variável de ambiente PGOPTIONS com o valor -P antes de iniciar o cliente. Deve ser observado que embora este método não requeira o bloqueio dos outros clientes, ainda assim é prudente impedir que outros usuários se conectem ao banco de dados danificado até o término dos reparos.
Havendo suspeita que algum índice dos catálogos do sistema compartilhados esteja danificado (pg_database, pg_group ou pg_shadow), então deverá ser utilizado o servidor autônomo para fazer o reparo. O comando REINDEX não processa os catálogos compartilhados no modo multiusuário.
Para todos os índices, exceto os catálogos do sistema compartilhados, o comando REINDEX é seguro quanto à queda e transação (crash-safe e transaction-safe). O comando REINDEX não é seguro quanto à queda para os índices compartilhados, e por esse motivo seu uso não é permitido durante a operação normal. Se ocorrer uma falha durante a reindexação de um destes catálogos no modo autônomo, não será possível reiniciar o servidor normal enquanto o problema não estiver resolvido (O sintoma típico de um índice compartilhado reconstruído parcialmente são erros do tipo "index is not a btree").
O comando REINDEX é semelhante a remover e recriar o índice, porque o conteúdo do índice é reconstruído a partir do início. Entretanto, as considerações sobre o bloqueio são bem diferentes. O comando REINDEX bloqueia a escrita mas não a leitura da tabela que o índice pertence. Também obtém um bloqueio exclusivo do índice específico sendo processado, que bloqueia leituras que tentam utilizar o índice. Diferentemente, o comando DROP INDEX obtém um bloqueio exclusivo momentâneo da tabela que o índice está associado, bloqueando tanto a escrita como a leitura. O comando CREATE INDEX subseqüente bloqueia a escrita mas não a leitura; uma vez que o índice não está presente, nenhuma leitura vai tentar utilizá-lo, significando que não haverá bloqueios mas que as leituras podem ser forçadas a fazer varreduras seqüenciais dispendiosas. Outro ponto importante é que o enfoque remover/criar invalida todos os planos de comando no cache que usam o índice, enquanto o comando REINDEX não.
Antes do PostgreSQL 7.4, o comando REINDEX TABLE não processava automaticamente as tabelas TOAST e, portanto, estas tinham de ser reindexadas através de comandos separados. Isto ainda é possível, porém redundante.
Reconstruir os índices da tabela minha_tabela:
REINDEX TABLE minha_tabela;
Reconstruir um único índice:
REINDEX INDEX meu_indice;
Reconstruir todos os índices do sistema de um determinado banco de dados, sem confiar que estejam válidos:
$ export PGOPTIONS="-P" $ psql bd_danificado ... bd_danificado=> REINDEX DATABASE bd_danificado; bd_danificado=> \q
[1] |
Oracle — O comando ALTER INDEX é utilizado para alterar ou reconstruir um índice existente. A cláusula de reconstrução (rebuild_clause) é utilizada para recriar um índice existente ou uma de suas partições ou sub-partições. Se o índice estiver marcado como UNUSABLE, uma reconstrução bem-sucedida irá marcá-lo como USABLE. Para um índice baseado em função, esta cláusula também ativa o índice. Se a função sobre a qual o índice se baseia não existir, o comando de reconstrução irá falhar. Oracle® Database SQL Reference 10g Release 1 (10.1) Part Number B10759-01 (N. do T.) |
[2] |
SQL Server — O comando ALTER INDEX modifica um índice de visão ou de tabela desativando, reconstruindo ou reorganizando o índice; ou definindo opções para o índice. Reconstruindo índices — A reconstrução do índice remove e recria o índice. Esta operação remove a fragmentação, recupera espaço em disco compactando as páginas com base na definição do fator de preenchimento especificado ou existente, e reordena as linhas do índice em páginas contíguas. Quando é especificada a opção ALL, todos os índices da tabela não removidos e reconstruídos em uma única transação. As restrições FOREIGN KEY não precisam ser previamente removidas. Reorganizando índices — A reorganização do índice utiliza recursos do sistema mínimos. Esta operação defragmenta o nível-folha (leaf level) dos índices agrupados (clustered) e não agrupados (nonclustered) de tabelas e visões, reordenando fisicamente as páginas do nível-folha para corresponderem a ordem lógica, esquerda para direita, dos nós folha. A reorganização também compacta as páginas de índice. A compactação é baseada no valor do fator de preenchimento existente. SQL Server 2005 Books Online — ALTER INDEX (Transact-SQL) (N. do T.) |