Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle 11g - Como otimizar a seleção de inserção paralela lenta?


Melhore as estatísticas. O número estimado de linhas é 1, mas o número real de linhas é superior a 7 milhões e continua aumentando. Isso faz com que o plano de execução use um loop aninhado em vez de uma junção de hash. Um loop aninhado funciona melhor para pequenas quantidades de dados e uma junção de hash funciona melhor para grandes quantidades de dados. Corrigir isso pode ser tão fácil quanto garantir que as tabelas relevantes tenham estatísticas precisas e atuais. Isso geralmente pode ser feito coletando estatísticas com as configurações padrão, por exemplo:exec dbms_stats.gather_table_stats('SIRS_UATC1', 'TBL_RECON_PM'); .

Se isso não melhorar a estimativa de cardinalidade, tente usar uma dica de amostragem dinâmica, como /*+ dynamic_sampling(5) */ . Para uma consulta de execução tão longa, vale a pena gastar um pouco de tempo extra antecipando dados de amostragem se isso levar a um plano melhor.

Use paralelismo em nível de instrução em vez de paralelismo em nível de objeto. Este é provavelmente o erro mais comum com SQL paralelo. Se você usar paralelismo em nível de objeto, a dica deve fazer referência ao alias do objeto. Desde 11gR2 não há necessidade de se preocupar em especificar objetos. Esta instrução precisa apenas de uma única dica:INSERT /*+ PARALLEL(16) APPEND */ ... . Observe que NOLOGGING não é uma dica real.