it-swarm-pt.tech

Com que frequência as estatísticas do banco de dados Oracle devem ser executadas?

Em 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 foram executadas em nossa caixa de produção em mais de dois meses e meio. Isso parece muito tempo para mim, mas eu não sou um DBA.

21
user290

No meu último emprego, executamos estatísticas uma vez por semana. Se bem me lembro, agendamos para eles em uma noite de quinta-feira e, na sexta-feira, os DBAs tiveram o cuidado de monitorar as consultas mais longas em busca de algo inesperado. (A sexta-feira foi escolhida porque geralmente era apenas após um lançamento de código e tendia a ser um dia de tráfego bastante baixo.) Quando eles visualizavam uma consulta incorreta, encontravam um plano de consulta melhor e o salvavam para que ele não fosse alterado inesperadamente . (Oracle tem ferramentas para fazer isso automaticamente, você diz a consulta para otimizar e faz.)

Muitas organizações evitam executar estatísticas por medo de que planos de consulta ruins surjam inesperadamente. Mas isso geralmente significa que os planos de consulta aumentam e pioram com o tempo. E quando eles executam estatísticas, eles encontram vários problemas. A disputa resultante para corrigir esses problemas confirma seus medos sobre os perigos da execução de estatísticas. Mas, se executassem as estatísticas regularmente, usassem as ferramentas de monitoramento como deveriam, corrigissem os problemas à medida que aparecessem, teriam menos dores de cabeça e não as encontrariam de uma só vez.

13
user11318

Sempre que os dados mudam "significativamente".

Se uma tabela passar de 1 linha para 200 linhas, isso é uma alteração 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 1000 linhas, todas com valores idênticos na coluna X de consulta comum a 1000 linhas com valores quase exclusivos na coluna X, essa é uma alteração 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 ele adivinha errado, o otimizador pode escolher um plano de consulta very suboptimal.

13
Jonathan Rupp

Como as estatísticas do Oracle 11g são reunidas automaticamente por padrão.

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

  • WEEKNIGHT_WINDOW começa às 10h. e termina às 6 da manhã de segunda a sexta até sexta-feira. 
  • WEEKEND_WINDOW abrange dias inteiros aos sábados e domingos.

Quando as estatísticas foram reunidas 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;

Horários da Janela?

SELECT window_name, start_time, duration FROM dba_autotask_schedule;

Coletar manualmente 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.

Coletar manualmente estatísticas do banco de dados em todos os esquemas!

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

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 reunir estatísticas é permitir que o Oracle reúna automaticamente as estatísticas. O Oracle reúne estatísticas de todos os objetos do banco de dados automaticamente e mantém essas estatísticas em um trabalho de manutenção planejado regularmente.

5
David Medinets

Com a versão 10g e superior do Oracle, as estatísticas atualizadas sobre tabelas e índices são necessárias pelo otimizador para tomar uma decisão "boa" no plano de execução. Com que frequência você coleta estatísticas é uma tarefa complicada. Depende do seu aplicativo, esquema, taxa de dados e prática comercial. Alguns aplicativos de terceiros que são 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 retorne 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 monitorar e verificar seu estado e fazer com que elas analisem se/quando obsoleto. Muitas vezes isso é suficiente, às vezes não é. Isso realmente depende do seu banco de dados. Para meu banco de dados, temos um conjunto de OLTP tabelas que precisam de coletas 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álises regulares sem afetar a carga e o desempenho geral do banco de dados. Portanto, a resposta correta é que depende da aplicação, da mudança de dados e das necessidades do negócio.

2
MichaelN

Quando eu gerenciava um grande sistema de planejamento multiusuário com suporte da Oracle, nosso DBA tinha um trabalho semanal que reunia estatísticas. Além disso, quando lançamos uma mudança significativa que poderia afetar ou ser afetada pelas estatísticas, forçaríamos o trabalho a ficar sem ciclo para fazer com que as coisas ficassem presas.

2
Joe Skora

Certifique-se de equilibrar o risco de que as estatísticas recentes causem alterações indesejáveis ​​nos planos de consulta contra o risco de que as estatísticas antigas possam, elas próprias, fazer com que os planos de consulta sejam alterados. 

Imagine que você tenha um banco de dados de bugs com uma tabela ISSUE e uma coluna CREATE_DATE em que os valores na coluna aumentam mais ou menos monotonicamente. Agora, suponha que haja um histograma nessa coluna que informe ao Oracle que os valores dessa coluna estão uniformemente distribuídos entre 1º de janeiro de 2008 e 17 de setembro de 2008. Isso possibilita ao otimizador estimar razoavelmente o número de linhas que seriam ser devolvido se você estivesse procurando por todos os problemas criados na semana passada (ou seja, de 7 a 13 de setembro). Se o aplicativo continuar a ser usado e as estatísticas nunca forem atualizadas, esse histograma será menos preciso. Portanto, o otimizador espera que as consultas para "problemas criados na semana passada" sejam menos precisos e menos precisos com o tempo, podendo eventualmente fazer com que o Oracle altere o plano de consulta negativamente. 

1
Justin Cave

Geralmente, não é recomendado reunir estatísticas tão frequentes em todo o banco de dados, a menos que você tenha uma justificativa forte para isso, como uma inserção em massa ou uma alteração de grandes volumes de dados no banco de dados. Reunindo estatísticas no banco de dados nessa frequência PODE alterar o plano de execução de consultas para um novo plano de execução ruim, a coisa pode custar muito tempo tentando ajustar cada consulta afetada pelos novos planos pobres, é por isso que você deve testar o impacto da coleta de novas estatísticas em um banco de dados de teste ou no caso de você não ter tempo ou poder humano para isso, pelo menos você deve manter um plano de recuperação fazendo o backup da estática original antes de coletar novas, então caso você obtenha uma nova estatística e as consultas não Como esperado, você pode restaurar facilmente as estatísticas originais.

Há um script muito útil que pode ajudá-lo a fazer backup das estatísticas originais e coletar novas e fornecer o comando SQL que você pode usar para restaurar as estáticas originais, caso as coisas não saiam conforme o esperado depois de coletar novas estatísticas. Você pode encontrar o script neste link: http://dba-tips.blogspot.com/2014/09/script-to-ease-gathering-statistics-on.html

0
Chion

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

0
David Aldridge