Índices c-tree - Características especiais

Uma tabela criada, através de uma RDD c-tree, possui características especiais quanto a sua localização (path) e manutenção de seus índices. Desta forma, é importante estar atento a essas características ao configurar ambientes e realizar manutenção em tabelas c-tree.

 

As principais características são:

  • Mesmo que uma tabela c-tree seja criada sem nenhum índice permanente (.CDX), toda tabela c-tree possui um índice interno, criado para ordenar a tabela por número de registro físico (ordem do recno). Este índice é criado em outro arquivos, com extensão '.int'. Uma pasta (ctreeint) é criada abaixo da pasta onde está a tabela.
    Nesta pasta, serão armazenados os índices internos dos arquivos c-tree daquele diretório. Este índice interno e a pasta ctreeint, são criados automaticamente pelo TOTVS | Application Server no momento de criação da tabela e, caso não existam, são recriados automaticamente pelo sistema no momento da abertura da tabela.
     
  • Os arquivos de índices permanentes são criados fora do arquivo da tabela com extensão padrão como nos outros RDDs (.CDX), mas suas informações são armazenadas no arquivo da tabela (.DTC). Portanto, para se criar ou excluir índices permanentes a tabela deve estar aberta em modo exclusivo. Na hora da abertura da tabela, todos os arquivos de índices permanentes relacionados em sua estrutura são abertos também, por isso não se pode excluir o arquivo de índice permanente com a respectiva tabela aberta. Caso não exista um ou mais arquivos de índices da tabela na hora de sua abertura, o sistema irá recriá-lo automaticamente de forma semelhante ao índice interno.
    O diretório do arquivo de índice também é armazenado na estrutura da tabela, mas quando a tabela é aberta e é constatada que a tabela está em outro diretório, o sistema automaticamente atualiza esta informação. Para excluir os índices de uma tabela c-tree, pode-se utilizar a função CtreeDelIdxs() ou a opção Index/erase all no APSDU. Portanto, aconselha-se utilizar o índice do tipo permanente somente se o mesmo for utilizado posteriormente (outras aberturas da tabela), caso contrário, deve-se utilizar os índices temporários.
     
  • O índice temporário é criado quando informamos uma extensão de arquivo ".idx". O arquivo físico do indice e arquivos auxiliares de controle serão criados dentro de um subdiretório com o nome do arquivo especificado na hora de sua criação, por exemplo ind1.idx. Este tipo de índice não possui definição armazenada no arquivo da tabela, por ser temporário. 

  • A busca por dados em uma tabela indexada, usando a função DBSeek() do Advpl funciona da mesma forma que a RDD de arquivos DBF, porém existe uma diferença de comportamento quando utilizamos um índice composto com um campo numérico. Tomando por base um índice composto "STR(NID,4)+CKEY", usando DBF / ADS caso seja realizado um DBSeek() informando erroneamente uma string contendo letras ao invés de números, a RDD DBF faz comparação binária de string com a chave inteira para posicionar a tabela, normalmente deslocando o ponteiro para o final da tabela. Se isto for realizado com tabelas c-Tree, é feita internamente a conversão da string para o valor numérico, que normalmente será zero, e havendo um registro com valor zero que atenda a chave, o posicionamento será diferente do DBF. Para evitar este tipo de situação, é fortemente recomendado que a composição do valor da chave de busca para o DBseek respeite o range de valores passiveis de conversão dentro das posições da chave ocupadas por campos com tipo diferente de caractere / string.
     
Importante

O rebuild de índices permanentes somente é realizado caso o índice permanente e/ou o índice interno não existam no disco e a tabela não tenha sido copiada ou movida do seu diretório original de criação. Caso a tabela seja copiada para outro diretório ou renomeada, as informações sobre os índices permanentes criados para esta tabela são removidas automaticamente da tabela, no momento de sua abertura, sendo recriado automaticamente apenas o índice interno (recno), na pasta ctreeint.