Como obter apenas os nomes dos índices corrompidos em tabelas grandes
Olá, Comunidade,
Qual é a maneira mais eficiente e segura em termos de memória para obter os nomes dos índices corrompidos em tabelas muito grandes, a fim de reconstruí-los? O problema é que, se um índice possui milhões de linhas corrompidas, o array .errors do %ValidateIndices cresce demais e lança um erro .
Comments
Pelo material disponível, não há um mecanismo documentado para obter somente os nomes dos índices corrompidos de forma segura em memória, sem que o %ValidateIndices() acumule erros em nível de linha no array .errors. A documentação citada descreve como validar índices e como reconstruí-los, mas não apresenta uma saída “apenas nomes dos índices” para o cenário que você descreveu. [1]
O que o material confirma é:
- Você pode validar índices com
$SYSTEM.OBJ.ValidateIndices()ou%Library.Storage.%ValidateIndices(). Ambos verificam a integridade dos índices e podem validar todos os índices da tabela ou uma%Listespecífica de nomes de índices. [1] - Se o objetivo final for reconstruir índices já conhecidos como corrompidos, o método preferido é
%BuildIndices(), porque%ValidateIndices()é significativamente mais lento. [1] %BuildIndices()aceita uma lista de nomes de índices, por exemplo:SET status = ##class(myschema.mytable).%BuildIndices($ListBuild("NameIDX","SpouseIDX")). [1]- Se você quiser que a validação inclua também tabelas-filhas de coleções, o material informa que
$SYSTEM.OBJ.ValidateIndices()pode fazer isso;%Library.Storage.%ValidateIndices()exige chamadas separadas para índices dessas tabelas-filhas. [1]
Então, com base apenas nas fontes encontradas, a resposta é que não há, na documentação retornada, uma forma documentada e memory-safe de pedir ao %ValidateIndices() apenas os nomes dos índices corrompidos. Se você já souber quais índices precisam ser refeitos, pode passá-los diretamente para %BuildIndices() em uma lista. [1]
Sources: