O banco de dados -11g introduziu o novo recurso de coleta de estatísticas incrementais
-As estatísticas incrementais funcionarão apenas para tabelas particionadas onde as estatísticas globais são atualizadas incrementalmente verificando apenas as partições que foram alteradas desde a última execução. Geralmente, as partições mais recentes são aquelas em que os dados são inseridos e, principalmente, as partições mais antigas permanecem intocadas. Com a habilitação de estatísticas incrementais em uma tabela, somente nessas partições as estatísticas são coletadas onde há DMLs nela, as restantes não são verificadas, o que economizaria muito tempo.
-As tabelas particionadas são grandes e se precisarmos coletar estatísticas regularmente sobre isso, seria muito demorado e A coleta incremental de estatísticas reduz o tempo necessário para coletar estatísticas
Exemplo do recurso Oracle 11g incremental Statistics Gathering no Oracle E-Business Suite.
Vamos pegar o exemplo de xla_ae_lines que é uma tabela de partição e está tendo muitos registros em instância de ERP de uso pesado
Caso de teste sem definir preferência incremental
-Criar uma tabela xla_ae_lines_bkp como uma tabela de partição para realizar este caso de teste
– Inserir dados da tabela xla_ae_lines
insira em xla.xla_Ae_lines_bkp selecione * de xla.xla_ae_lines; 2119409 linhas criadas. |
-defina o tempo no tempo em
exec fnd_stats.gather_table_stats('XLA','XLA_AE_LINES_BKP'); Procedimento PL/SQL concluído com sucesso. Decorrido:00:00:49.06 |
- Levou 49,06 segundos para reunir as estatísticas pela primeira vez após a inserção dos dados.
- Verifique as estatísticas e o nível global e de partição
selecione table_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" de dba_Tables onde table_name like 'XLA_AE_LINES_BKP'; TABLE_NAME last_analyzed —————————————————— XLA_AE_LINES_BKP 09-SET-16 10:04:34 selecione partition_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" de dba_Tab_partitions onde table_name like 'XLA_AE_LINES_BKP'; PARTITION_NAME last_analisado —————————————————— AP 09-SET-16 10:04:15 AR 09-SET-16 10:04:16 CE 09-SET-16 10:04:16 CST 09-SET-16 10:04:23 DPP 09-SET-16 10:04:23 DIVERSÃO 09-SET-16 10:04:23 FV 09-SET-16 10:04:23 GMF 09-SET-16 10:04:23 IGC 09-SET-16 10:04:23 IGI 09-SET-16 10:04:23 LNS 09-SET-16 10:04:23 OFA 09-SET-16 10:04:23 OKL 09-SET-16 10:04:23 OZF 09-SET-16 10:04:23 PA 09-SET-16 10:04:24 |
- Exclua os dados de uma das partições para verificar como as estatísticas estão sendo calculadas
excluir de xla.xla_ae_lines_bkp onde application_id=222; |
- Reunindo estatísticas usign fnd_Stats
exec fnd_stats.gather_table_stats('XLA','XLA_AE_LINES_BKP');
Procedimento PL/SQL concluído com sucesso.
Decorrido:00:00:25.06 - Depois de excluir os dados, colete estatísticas sem definir a preferência. Demorou 25,06 segundos
- Verificando estatísticas globais e estatísticas de partição
selecione table_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" de dba_Tables onde table_name like 'XLA_AE_LINES_BKP'; TABLE_NAME last_analisado —————————————————— XLA_AE_LINES_BKP 09-SET-16 10:20:26 selecione partition_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" de dba_Tab_partitions onde table_name like 'XLA_AE_LINES_BKP'; PARTITION_NAME last_analisado —————————————————— AP 09-SET-16 10:20:14 AR 09-SET-16 10:20:14 CE 09-SET-16 10:20:14 CST 09-SET-16 10:20:15 DPP 09-SET-16 10:20:15 DIVERSÃO 09-SET-16 10:20:15 FV 09-SET-16 10:20:15 GMF 09-SET-16 10:20:15 CIG 09-SET-16 10:20:15 IGI 09-SET-16 10:20:15 LNS 09-SET-16 10:20:16 OFA 09-SET-16 10:20:16 OKL 09-SET-16 10:20:16 OZF 09-SET-16 10:20:16 PA 09-SET-16 10:20:17 |
NOTA:as estatísticas são coletadas em todas as partições, mesmo que apenas os dados de partição AR sejam excluídos, last_analyzed é atualizado para todas as partições
Caso de teste com configuração de preferência incremental
- Solte e recrie a tabela xla_ae_lines_bkp como uma tabela de partição para realizar este caso de teste
- Inserir dados da tabela xla_ae_lines
insira em xla.xla_Ae_lines_bkp selecione * de xla.xla_ae_lines; 2119409 linhas criadas. |
-defina o tempo no tempo em
exec dbms_stats.set_table_prefs('XLA','XLA_AE_LINES_BKP','INCREMENTAL','TRUE'); |
- Verifique se a preferência está definida
selecione dbms_stats.get_prefs('INCREMENTAL','XLA','XLA_AE_LINES_BKP') de dual; DBMS_STATS.GET_PREFS('INCREMENTAL','XLA','XLA_AE_LINES_BKP') ———————————————————— VERDADE |
- Reúna estatísticas após definir a preferência.
exec fnd_stats.gather_table_stats('XLA','XLA_AE_LINES_BKP'); Procedimento PL/SQL concluído com sucesso. Decorrido:00:00:25.91 |
- Depois de definir a preferência, levou 25,91 segundos para reunir estatísticas pela primeira vez após a inserção de dados
- verificação das informações de tempo das estatísticas
selecione table_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" de dba_Tables onde table_name like 'XLA_AE_LINES_BKP'; TABLE_NAME last_analisado —————————— ———————— XLA_AE_LINES_BKP 09-SET-16 10:35:32 selecione partition_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" de dba_Tab_partitions onde table_name like 'XLA_AE_LINES_BKP'; 18 PARTITION_NAME last_analisado —————————————————— AP 09-SET-16 10:35:30 AR 09-SET-16 10:35:12 CE 09-SET-16 10:35:10 CST 09-SET-16 10:35:21 DPP 09-SET-16 10:35:21 DIVERSÃO 09-SET-16 10:35:12 FV 09-SET-16 10:35:10 GMF 09-SET-16 10:35:10 CIG 09-SET-16 10:35:10 IGI 09-SET-16 10:35:12 LNS 09-SET-16 10:35:10 OFA 09-SET-16 10:35:10 OKL 09-SET-16 10:35:12 OZF 09-SET-16 10:35:30 PA 09-SET-16 10:35:12 |
- Excluir os dados de uma partição para ver como a coleta incremental de estatísticas ajudará na próxima vez que as estatísticas forem coletadas.
excluir de xla_ae_lines_bkp onde application_id=222; 100233 linhas excluídas |
- Reúna estatísticas após excluir dados da partição application_id 222 AR
exec fnd_stats.gather_table_stats('XLA','XLA_AE_LINES_BKP'); Procedimento PL/SQL concluído com sucesso. Decorrido:00:00:4.11 |
- Depois de excluir os dados de uma partição, a coleta incremental de estatísticas levou 4,11 segundos
- Verifique as estatísticas globais e de partição
selecione table_name,to_Char(last_analyzed,'DD-MON-YY HH24:MI:SS') "last_analyzed" de dba_Tables onde table_name like 'XLA_AE_LINES_BKP'; TABLE_NAME last_analisado —————————————————— XLA_AE_LINES_BKP 09-SET-16 10:45:18 selecione partition_name,to_Char(last_analyzed,’DD-MON-YY HH24:MI:SS’) “last_analyzed” de dba_Tab_partitions onde ta ble_name como ‘XLA_AE_LINES_BKP’; PARTITION_NAME last_analisado —————————————————— AP 09-SET-16 10:35 :30 AR 09-SET-16 10:45:18 CE 09-SET-16 10:35 :10 CST 09-SET-16 10:35 :21 DPP 09-SET-16 10:35 :21 DIVERSÃO 09-SET-16 10:35 :12 FV 09-SET-16 10:35 :10 GMF 09-SET-16 10:35 :10 CIG 09-SET-16 10:35 :10 IGI 09-SET-16 10:35 :12 LNS 09-SET-16 10:35 :10 OFA 09-SET-16 10:35 :10 OKL 09-SET-16 10:35 :12 OZF 09-SET-16 10:35 :30 PA 09-SET-16 10:35 :12 |
Coisas importantes a serem observadas, as estatísticas são coletadas, a data last_analyzed é alterada apenas para a partição AR e o tempo também foi reduzido.
Portanto, vemos que a coleta incremental de estatísticas reduz o tempo de coleta de estatísticas e pode ser bastante benéfica para tabelas de partição grandes.