Pergunta

Na sua experiência, com que frequência as estatísticas do banco de dados Oracle devem ser executadas?Nossa equipe de desenvolvedores descobriu recentemente que as estatísticas não eram executadas em nossa caixa de produção há mais de dois meses e meio.Parece muito tempo para mim, mas não sou DBA.

Foi útil?

Solução

No meu último trabalho, fazíamos estatísticas uma vez por semana.Se bem me lembro, nós os agendamos para uma quinta-feira à noite, e na sexta-feira os DBAs tiveram muito cuidado ao monitorar as consultas mais longas em busca de algo inesperado.(Sexta-feira foi escolhida porque geralmente era logo após o lançamento do código e tendia a ser um dia com pouco tráfego.) Quando eles viam uma consulta incorreta, eles encontravam um plano de consulta melhor e o salvavam para que não mudasse novamente inesperadamente. .(A Oracle tem ferramentas para fazer isso automaticamente, você informa a consulta para otimizar e ela o faz.)

Muitas organizações evitam executar estatísticas por medo de que planos de consulta incorretos apareçam inesperadamente.Mas isso geralmente significa que seus planos de consulta ficam cada vez piores com o tempo.E quando executam estatísticas, encontram vários problemas.A luta resultante para resolver esses problemas confirma os seus receios sobre os perigos da execução de estatísticas.Mas se eles executassem estatísticas regularmente, usassem as ferramentas de monitoramento como deveriam e corrigissem os problemas à medida que surgissem, teriam menos dores de cabeça e não os encontrariam todos de uma vez.

Outras dicas

Desde o Oracle 11g, as estatísticas são coletadas automaticamente por padrão.

Duas janelas do Scheduler são predefinidas na instalação do Oracle Database:

  • WEEKNIGHT_WINDOW começa às 22h.e termina às 6h.toda segunda a sexta -feira.
  • WEEKEND_WINDOW abrange dias inteiros de sábado e domingo.

Quando as estatísticas foram coletadas pela última vez?

SELECT owner, table_name, last_analyzed FROM all_tables ORDER BY last_analyzed DESC NULLS LAST; --Tables.
SELECT owner, index_name, last_analyzed FROM all_indexes ORDER BY last_analyzed DESC NULLS LAST; -- Indexes.

Status da coleta automatizada de estatísticas?

SELECT * FROM dba_autotask_client WHERE client_name = 'auto optimizer stats collection';

Grupos do Windows?

SELECT window_group_name, window_name FROM dba_scheduler_wingroup_members;

Programações de janela?

SELECT window_name, start_time, duration FROM dba_autotask_schedule;

Reúna manualmente as estatísticas do banco de dados neste esquema:

EXEC dbms_stats.gather_schema_stats(ownname=>NULL, cascade=>TRUE); -- cascade=>TRUE means include Table Indexes too.

Reúna manualmente as estatísticas do banco de dados em todos os esquemas!

-- Probably need to CONNECT / AS SYSDBA
EXEC dbms_stats.gather_database_stats;

Sempre que os dados mudam "significativamente".

Se uma tabela passar de 1 para 200 linhas, isso é uma mudança significativa.Quando uma tabela passa de 100.000 linhas para 150.000 linhas, isso não é uma mudança muito significativa.Quando uma tabela passa de 1.000 linhas, todas com valores idênticos na coluna X comumente consultada, para 1.000 linhas com valores quase exclusivos na coluna X, isso é uma mudança significativa.

As estatísticas armazenam informações sobre contagens de itens e frequências relativas - coisas que permitem "adivinhar" quantas linhas corresponderão a um determinado critério.Quando errar, o otimizador pode escolher um muito plano de consulta abaixo do ideal.

Qual versão do Oracle você está usando?Verifique esta página que se refere ao Oracle 10:

http://www.acs.ilstu.edu/docs/Oracle/server.101/b10752/stats.htm

Diz:

A abordagem recomendada para coletar estatísticas é permitir que a Oracle colete as estatísticas automaticamente.A Oracle reúne estatísticas sobre todos os objetos do banco de dados automaticamente e mantém essas estatísticas em um trabalho de manutenção agendado regularmente.

Quando eu gerenciava um grande sistema de planejamento multiusuário apoiado pela Oracle, nosso DBA tinha um trabalho semanal que coletava estatísticas.Além disso, quando lançávamos uma mudança significativa que pudesse afetar ou ser afetada pelas estatísticas, forçaríamos o trabalho a sair do ciclo para colocar as coisas em dia.

Com a versão 10g e superior do Oracle, o otimizador precisa de estatísticas atualizadas sobre tabelas e índices para tomar uma "boa" decisão do plano de execução.A frequência com que você coleta estatísticas é uma decisão complicada.Depende da sua aplicação, esquema, taxa de dados e prática comercial.Alguns aplicativos de terceiros escritos para serem compatíveis com versões anteriores do Oracle não funcionam bem com o novo otimizador.Esses aplicativos exigem que as tabelas não tenham estatísticas para que o banco de dados recorra ao plano de execução da base de regras.Mas, em média, a Oracle recomenda que as estatísticas sejam coletadas em tabelas com estatísticas obsoletas.Você pode definir tabelas para serem monitoradas e verificar seu estado e fazer com que analisem se/quando obsoletas.Muitas vezes isso é suficiente, às vezes não.Realmente depende do seu banco de dados.Para meu banco de dados, temos um conjunto de tabelas OLTP que precisam de coleta de estatísticas noturnas para manter o desempenho.Outras tabelas são analisadas uma vez por semana.Em nosso grande banco de dados dw, analisamos conforme necessário, pois as tabelas são muito grandes para análise regular, sem afetar a carga e o desempenho geral do banco de dados.Portanto, a resposta correta é: depende da aplicação, da alteração de dados e das necessidades do negócio.

Certifique-se de equilibrar o risco de que novas estatísticas causem alterações indesejáveis ​​nos planos de consulta com o risco de que estatísticas obsoletas possam causar alterações nos planos de consulta.

Imagine que você tem um banco de dados de bugs com uma tabela ISSUE e uma coluna CREATE_DATE onde os valores da coluna aumentam mais ou menos monotonicamente.Agora, suponha que haja um histograma nesta coluna que informa ao Oracle que os valores desta coluna estão distribuídos uniformemente entre 1º de janeiro de 2008 e 17 de setembro de 2008.Isso possibilita que o otimizador estime razoavelmente o número de linhas que seriam retornadas se você estivesse procurando por todos os problemas criados na semana passada (ou seja,7 a 13 de setembro).Se o aplicativo continuar a ser usado e as estatísticas nunca forem atualizadas, esse histograma será cada vez menos preciso.Portanto, o otimizador esperará que as consultas para "problemas criados na semana passada" sejam cada vez menos precisas ao longo do tempo e poderá eventualmente fazer com que a Oracle altere negativamente o plano de consulta.

No caso de um sistema do tipo data warehouse, você pode considerar não coletar nenhuma estatística e confiar na amostragem dinâmica (definindo optimer_dynamic_sampling para o nível 2 ou superior).

Geralmente não é recomendado coletar estatísticas com tanta frequência em todo o banco de dados, a menos que você tenha uma forte justificativa para isso, como uma inserção em massa ou alterações de big data que ocorrem com frequência no banco de dados.coletar estatísticas no banco de dados nesta frequência PODE alterar o plano de execução de consultas para novos planos de execução ruins, a coisa pode custar muito tempo tentando ajustar cada consulta afetada pelos novos planos ruins, é por isso que você deve testar o impacto da coleta novas estatísticas em um banco de dados de teste, ou caso você não tenha tempo ou mão de obra para isso, pelo menos você deve manter um plano alternativo fazendo backup das estatísticas originais antes de coletar novas, portanto, caso você reúna um novas estatísticas e as consultas não funcionarem conforme o esperado, você poderá restaurar facilmente as estatísticas originais.

Existe um script muito útil que pode ajudá-lo a fazer backup de estatísticas originais e coletar novas, além de fornecer comandos SQL que você pode usar para restaurar as estatísticas originais caso algo não tenha ocorrido como esperado após a coleta de novas estatísticas.Você pode encontrar o script neste link:http://dba-tips.blogspot.com/2014/09/script-to-ease-gathering-statistics-on.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top