Opa : então, primeiro vou assumir aqui que vc não está detectando alto-consumo 
de CPu baseado em Uma Só medida, que na verdade vc fez *** MUITAS E DIVERSAS ** 
medidas, em diversas ocasiões/horas de vários dias (e isso tanto com tools de 
banco quanto com tools do Sistema Operacional) e CONSISTENTEMENTE vc encontrou 
sintomas de grande uso de CPU....
 Pois bem,  é bom que vc já tenha dito que encontrar índices não-usados é *** 
UM *** dos trabalhos , pois gasto de CPU pode vir de atualização de índices 
(principalmente por causa da Ordenação do índice, que potencialmente pode ter 
que ser refeita a cada DML) ** MAS ** via de regra  de forma Alguma esse é o 
principal Culpado do consumo de CPU : coisas como SQLs fazendo muitos PARSES, 
uso frequente e em grandes volumes de REGEXP expressions nos SQLs, SQLs 
chamando funções PL/SQL frequentemente e em grandes volumes (por causa do 
context switch) e quetais costumam ser MUITO MAIS CULPADOS do que a Atualização 
de índices, então EM PARALELO a esse trabalho vc VAI ESTAR checando SQLs que 
gastam mais CPU, SQLs que fazem mais parses, usos de PL/SQL nos seus SQLs, 
Planos de Execução impróprios (que estejam fazendo muito sorting, digamos, ou 
que esteja fazendo conversão de b-tree para bitmap ou vice-versa nos acessos 
via índice, etc) : vc pode Inclusive obter info desse tipo nos Planos de 
Execução que ficam nas v$ do banco, ou pegar pelo AWR/ASH, ou implementar 
alguma monitoria custom sua.... E vc VAI ESTAR TAMBÉM (onde/como for viável, 
principalmente se não tem pool de conexões na parada) utilizando as opções do 
sistema operacional para detectar os processos que mais consomem CPU e 
relacionar esses processos com as sessões do banco, para encontrar quais SQLs 
tais sessões tão executando rotineiramente....
 
 Sobre a sua pergunta, especificamente :
 
 a) antes de qualquer coisa vc ** TEM ** que fazer esse Cliente implementar 
algum tipo de Controle na produção dele, onde antes de neguim sair criando 
índices, alterando tabelas, etc, é feito um ** ESTUDO APROPRIADO ** : eu 
DUVIDEODÓ que um ambiente com vinte mil índices tá sendo Minimamente 
Organizado/controlado, pra chegar num número assim tá meio Evidente que é casa 
da mãe joana onde qquer um sai criando índices, ou criando tabela, ou alterando 
programas à lá volonté, sem nem testar o Custo pra isso nem documentar a Causa 
da criação
 
 b) até pensando no que falei acima, imagino que seja ALTA a possibilidade de 
índices Redundantes, ie, com as mesmas colunas em ordem diferente e/ou com 
diferença apenas em alguma colunas secundária... Pode valer a pena umas 
consultinhas na DBA_INDEXES procurando por casos assim - o ponto só é que se 
TEM que testar o efeito que a Remoção desse tipo de índice pode causar... Por 
exemplo : se vc tiver um índice A criado pelas col1, col2 e col3 e um outro 
índice B criado por col1 e col2, dropando o índice A a consulta que tinha WHERE 
col1 AND col2 AND col3 pode ser atendida blz pelo índice B ** mas ** o plano 
pode mudar de índice acess por rowid para index scan - não dá pra dizer se essa 
mudança vai ser Significativa ou não sem Testes...
 
 c) antes de se falar em INDEX MONITORING, uma ** outra ** opção pra vc ver se 
o índice tá sendo usado em consultas ou não é vc LEVANTAR OS PLANOS DE EXECUÇÃO 
dos SQLs e ver quais índices nunca estão presentes em nenhum plano de execução 
: NOVAMENTE, quando se fala de planos de Execução, vc pode obter isso com um 
script de monitoração/consulta de execução frequente seu, customizado, OU pode 
(SE tiver a Licença necessária) obter do AWR/ASH , OU pode tracejar as 
principais rotinas de importância
 
 d) seja via INDEX MONITORING, seja via obtenção de planos, o ponto Crítico 
para se evitar(ou ao menos Diminuir) a chance de falsos negativos é vc ter uma 
amostra ** grande **, de pelo menos um mês : senão, como vc garante que aquele 
índice X que não apareceu em lugar nenhum nas primeiras semanas não vai ser 
CRÍTICO pra aquela rotina de Fechamento de mês que vc não foi avisado mas era o 
Coração da Empresa ??? 
  Esse é o ponto, ÓBVIO que o cliente quer resultado o mais rápido possível, 
pra Ontem se desse, mas quanto MENOR a tua massa de coleta MAIOR A CHANCE de vc 
deixar escapar algo, né não ??? NÃO TEM MILAGRE, vira pro teu cliente e manda a 
real, escolhendo entre Maior Precisão x maior Rapidez - não somos carpinteiros 
barbudos pra providenciar milagre...
  
 e) A monitoração tipicamente gasta *** muito pouco ** de CPU, pois o que ela 
faz é pequenos UPDATEs em tabelas internas que contém metadados sobre o índice 
: quase NADA de Ordenação nem de cálculo ocorre provocado por ele...
 O que eu diria pra vc fazer (no ambiente de HOMOLOGAÇÃO, que Obviamente o 
Cliente Possui ** e ** é bem similar á Produção, né :9 ,  é Ativar o Monitoring 
em, digamos, 1/5 dos índices, acompanhar o aumento/gasto de CPU (que deve ser 
minúsculo, SE existir), depois ativar o Monitoring em 1/3, depois em 3/4 dos 
índices, tipo assim...

[]s

  Chiappa

Responder a