ADS Error (7022) - Operação: Maximum index ...
Esta ocorrência indica um estouro do limite de balanceamento do índice atualmente utilizado pela tabela , através do driver ADS, ocorrido durante a operação . Esta ocorrência apresenta-se no log do console do Servidor de Aplicação, precedendo em geral uma ocorrência fatal do AdvPL, em geral relacionada às funções DBAppend(), DBRUnlock() e/ou DBSkip().
ADS
Error
(7022)
-
Operacao:
<x>
-
Maximum
index
levels
exceeded.
File:
<y>
Causa
Esta ocorrência
geralmente é reproduzida
, quando da utilização de uma tabela indexada, onde
o resultado da foi usada uma expressão de indexação cujo resultado da chave ( &(Indexkey()) ) ultrapasse 140
bytes, durante e/ou após sucessivas operações de inserção de registros.No caso da reprodução desta ocorrência, reindexar a tabela (deletar e recriar o índice) torna a aplicação operacional novamente, porém após sucessivas inserções e alterações na tabela, a ocorrência provavelmente será reproduzida novamente. Verifique as chaves de índice utilizadas para a tabela e evite que seja utilizada uma chave cujo retorno da expressão de indexação ultrapasse 140 bytescarascteres, onde houve uma sequencia grande de inserções consecutivas.
Correção
- Verifique as chaves de índice utilizadas para a tabela, e garanta que nenhuma chave seja maior que 140 caracteres. O tamanho da coluna é um fator que interfere diretamente na reprodução da ocorrência, na proporção direta do tamanho da chave de índice. Quando menor a chave, menor a chance deste erro não acontecer. Em testes feitos com um programa de stress realizando inserções de 20 mil chaves aleatórias, reduzir para 140 bytes não mais reproduziu a ocorrência, porém este limite é arbitrário, nada impede que uma determinada sequência de muitas inserções usando uma chave de tamanho menor também possa reproduzir o estouro no índice.
- Caso não seja possível reduzir a chave do índice, verifique se é possível criar o índice após os dados já estarem inseridos na tabela.
- Ou, troque a RDD de acesso a tabela. Ao invés de cria a tabela usando driver ADS ( DBFCDX com ADS Local ou DBFCDXADS ), use o driver CTREECDX, onde os índices não têm esta limitação de balanceamento com chaves maiores que 140 bytes.
- Caso nenhuma das alternativas anteriores seja viável, o programa pode ser alterado para, preventivamente, recriar o índice a cada X mil registros inseridos. Este número X deve ser estabelecido como um limite preventivo, para fechar, deletar e recriar o índice, por exemplo a cada 5 mil registros inseridos. Dependendo do tamanho da chave do índice ou da sequência de dados inseridos, este número pode ser menor, e deve ser determinado empiricamente.