Uma atualização de estatísticas semanal, agendada e ampla do esquema foi executada em nosso cluster Oracle 11R2 RAC no domingo. Uma das consultas não tinha dados aparentes ou mudança de código, mas agora é executada em 3 horas em vez de 20 minutos. Olhando para dba_hist_sqlstat , está executando o mesmo SQL de antes, mas com um plano diferente. As estatísticas parecem ter afetado negativamente. Como é uma consulta grande que abrange algumas dezenas de tabelas, eles já decidiram que restaurar as estatísticas nas tabelas afetadas não é uma opção.
Eu tenho os planos antigos (melhores) e novos (terríveis) executando:
select * from TABLE(DBMS_XPLAN.DISPLAY_AWR('sqlid'));
Mas eles são tão diferentes que não é um pequeno ajuste manual para recuperá-los.
Existe uma maneira de forçá-lo a voltar ao plano antigo, visto que o banco de dados ainda possui muitas dessas informações disponíveis? (E não temos o Tuning Pack.)
Você precisa usar linhas de base SQL para forçar o plano de execução.
Este blog descreve as etapas envolvidas. Você precisará
sql_id
do extrato e doplan_hash_value
plano antigo.Se você tiver uma licença de tuning pack - realmente recomendado - você pode usar o dbms_sqltune para obter um plano melhor e criar um perfil para ele. Se um sql_id tiver um perfil para ele, o banco de dados o usará, se estiver habilitado. Também funciona perfeitamente em conjunto com o SQL Plan Stability; quando você trabalha com linhas de base do plano SQL, uma linha de base é criada automaticamente e aceita para o plano de um perfil.
Por outro lado, parece que suas estatísticas têm um problema. Muito provavelmente há um problema com tabelas que possuem uma espécie de conteúdo temporário, que é esvaziado e preenchido regularmente. Se a rotina de coleta for executada em um momento 'errado', ela fornecerá - por exemplo - 0 linhas para tal tabela porque ela foi esvaziada no momento da coleta e preenchida com qualquer número de linhas > 1 para causar estragos em seu desempenho. Com 0 ou 1 linhas nele, uma varredura ou mesmo um produto cartesiano pode ser escolhido, que funciona muito mal em uma junção, parece haver mais dados nele do que as estatísticas tentam dizer.
O mais fácil é apenas restaurar as estatísticas das tabelas participantes.
Se você estiver na Standard Edition, consulte Stored Outlines . O recurso está obsoleto no 11g, mas é a única opção de estabilidade de plano disponível nessa edição. Aqui está um bom exemplo .