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 várias 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 22.2.
Foi alterado um parâmetro de armazenamento do índice (como o FILLFACTOR), e deseja-se garantir que a alteração tenha pleno efeito.
Um índice construído com a opção CONCURRENTLY falhou, deixando o índice "inválido". Estes índices não têm utilidade, mas pode ser conveniente utilizar o comando REINDEX para reconstruí-los. Deve ser observado que o comando REINDEX não realiza uma construção CONCURRENTLY. Para construir o índice sem interferir com a produção, o índice deverá ser removido e o comando CREATE INDEX CONCURRENTLY deverá ser submetido novamente.
Reconstrói o índice especificado.
Reconstrói todos os índices da tabela especificada. Se a tabela possuir uma tabela secundária "TOAST", esta também será reindexada.
Reconstrói todos os índices do banco de dados corrente. Os índices dos catálogos do sistema compartilhados são saltados, exceto no modo autônomo (stand-alone) (veja abaixo). Esta forma do comando REINDEX não pode ser executada dentro de um bloco de transação.
Reconstrói todos os índices dos catálogos do sistema no banco de dados corrente. Os índices das tabelas dos usuários não são processados. Além disso, os índices dos catálogos do sistema compartilhados são saltados, exceto no modo autônomo (stand-alone) (veja abaixo). Esta forma do comando REINDEX não pode ser executada dentro de um bloco de transação.
O nome do índice, tabela ou banco de dados a ser reindexado. Os nomes das tabelas e dos índices podem ser qualificados pelo esquema. Atualmente os comando REINDEX DATABASE e REINDEX SYSTEM podem reindexar apenas o banco de dados corrente e, por isso, seus parâmetros devem 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 servidor e inicializar o servidor PostgreSQL monousuário com a opção -P incluída na linha de comando. Em seguida poderá ser submetido o comando REINDEX DATABASE, REINDEX SYSTEM, REINDEX TABLE ou REINDEX INDEX, dependendo de quanto se deseja reconstruir. Em caso de dúvida deve ser utilizado o comando REINDEX SYSTEM para selecionar a reconstrução de todos os índices do sistema no banco de dados. Depois a sessão do servidor monousuário deverá ser encerrada, e reiniciado o servidor normal. Para obter informações adicionais sobre como interagir com a interface do servidor monousuário deve ser consultada a página de referência do postgres.
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 é recomendável 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 (que são pg_authid, pg_auth_members, pg_database, pg_pltemplate, pg_shdepend e pg_tablespace), 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.
Reindexar um único índice ou tabela requer ser o dono do índice ou da tabela. Reindexar um banco de dados requer ser o dono do banco de dados (deve ser observado que, portanto, o dono do banco de dados pode reconstruir índices de tabelas pertencentes a outros usuários). É claro que os superusuários sempre podem reindexar qualquer objeto.
Antes do PostgreSQL 8.1, o comando REINDEX DATABASE processava apenas os índices do sistema, e não todos os índices como se poderia esperar pelo seu nome. Isto foi mudado para reduzir o fator surpresa. O comportamento antigo está disponível como REINDEX SYSTEM.
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 um único índice:
REINDEX INDEX meu_indice;
Reconstruir os índices da tabela minha_tabela:
REINDEX TABLE minha_tabela;
Reconstruir todos os índices de um determinado banco de dados, sem confiar que os índices do sistema 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.) |