por que blevel é nulo para alguns índices no banco de dados Oracle?

Eu estava tentando ver os níveis da árvore b para os índices e, para minha surpresa, vejo que alguns deles estão definidos como nulos.

SELECT index_name, blevel FROM user_indexes ORDER BY 2 desc; 

Seu nome começa com “SYS _” (imagem anexada abaixo). SO, estou assumindo que são índices gerados pelo sistema? Talvez de chaves primárias? De qualquer forma, estou curioso para saber por que eles são nulos. Posso entender se o valor é 0, o que significa que tudo está em nós folha e levará apenas 1 salto para que a varredura exclusiva obtenha os dados.

insira a descrição da imagem aqui

Comentários

  • Eles se parecem com objetos de esquema sys, então podem jogar por suas próprias regras. Mas a resposta mais provável é que não há nós neles.
  • Para algumas colunas de estatísticas (incluindo blevel) em *_indexes docs diz " Os nomes das colunas seguidos por um asterisco são preenchidos apenas se você coletar estatísticas no índice usando a instrução ANALYZE ou o pacote DBMS_STATS. " Acho que o mecanismo não ' executa nenhum desses comandos contra alguns ou todos os índices de tabelas do sistema …
  • Esses são índices lob, mas podem ser uma propriedade dos índices lob. Você pode tentar coletá-los, mas não tenho certeza do que o oracle faria internamente.

Resposta

Índices cujos nome que começa com SYS_IL.. são índices LOB.

BLEVEL é uma propriedade dos índices B-tree, e não faz sentido para índices LOB.

Mesmo se você coletar estatísticas, BLEVEL para tal índice permanecerá nulo.

Resposta

Obrigado @Balazs pela informação.

Fiz alguma pesquisa sobre isso e parece que –

Um lob é simplesmente um ponteiro e aponta para um bloco de dados que faz esse lob. Portanto, ao criar uma coluna lob, você obtém automaticamente um índice lob para que os fragmentos de dados sejam recuperados mais rapidamente e o segmento que contém esses fragmentos de dados.

Use as seguintes consultas para verificar o mesmo –

SELECT index_name,INDEX_TYPE, blevel FROM user_indexes where blevel is null and index_name like "SYS_IL%%" ORDER BY 3 desc; 

Para ver os segmentos associados –

select segment_name, segment_type, tablespace_name, bytes, max_extents from user_segments where segment_name in ( SELECT index_name FROM user_indexes where blevel is null and index_name like "SYS_IL%%" ); 

Você pode excluir isso descartando a tabela que tem a coluna lob ou a própria coluna.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *