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

Por que não consigo forçar o Oracle 11g a consumir mais CPUs para uma única consulta SQL


A coisa mais importante a entender sobre o paralelismo do Oracle é que ele é complicado. Otimizar o paralelismo requer muito conhecimento Oracle, ler os manuais, verificar muitos parâmetros, testar consultas de longa duração e muito ceticismo.

Faça as perguntas certas

Problemas paralelos realmente envolvem três questões diferentes:
  1. Quantos servidores paralelos foram solicitados?
  2. Quantos servidores paralelos foram alocados?
  3. Quantos servidores paralelos foram usados ​​de forma significativa?

Use as melhores ferramentas

Vá direto para a melhor ferramenta - SQL Monitoring com relatórios ativos. Encontre seu SQL_ID e gere o relatório HTML:select dbms_sqltune.report_sql_monitor(sql_id => 'your_sql_id', type => 'active') from dual; . Essa é a única maneira de saber quanto tempo foi gasto em cada etapa do plano de execução. E ele lhe dirá quanto paralelismo foi efetivamente usado e onde. Por exemplo:

Outra boa opção é type => 'text' . Ele não tem tanta informação, mas é mais rápido de olhar e mais fácil de compartilhar.

O SQL Monitoring também inclui o DOP solicitado e o DOP alocado:

Um select paralelo de 100 linhas pode funcionar lindamente, mas então tudo para em uma única etapa por causa de uma sequência sem cache. Você pode olhar para um plano de explicação, um rastreamento ou um relatório de AWR por horas e não ver o problema. O relatório ativo torna as etapas lentas quase triviais de encontrar. Não perca tempo adivinhando onde está o problema.

No entanto, outras ferramentas ainda são necessárias. Um plano de explicação gerado com explain plan for ... e select * from table(dbms_xplan.display); fornecerá algumas informações importantes. Especificamente as Notes seção pode incluir muitos motivos pelos quais a consulta não solicitou paralelismo.

Mas POR QUE recebi esse número de servidores paralelos?

As informações relevantes estão espalhadas por vários manuais diferentes, que são muito úteis, mas ocasionalmente imprecisos ou enganosos. Existem muitos mitos e muitos maus conselhos sobre o paralelismo. E a tecnologia muda significativamente a cada lançamento.

Quando você junta todas as fontes respeitáveis, a lista de fatores que influenciam o número de servidores paralelos é surpreendentemente grande. A lista abaixo é ordenada aproximadamente pelo que eu acho que são os fatores mais importantes:
  1. Paralelismo entre operações Qualquer consulta usando classificação ou agrupamento alocará duas vezes mais servidores paralelos que o DOP. Isso provavelmente é responsável pelo mito "Oracle aloca o maior número possível de servidores paralelos!".
  2. Dica de consulta De preferência, uma dica de nível de instrução como /*+ parallel */ , ou possivelmente uma dica de nível de objeto como /*+ noparallel(table1) */ . Se uma etapa específica de um plano estiver sendo executada em série, geralmente é devido a dicas de nível de objeto em apenas parte da consulta.
  3. SQL recursivo Algumas operações podem ser executadas em paralelo, mas podem ser efetivamente serializadas por SQL recursiva. Por exemplo, uma sequência sem cache em uma inserção grande. O SQL recursivo gerado para analisar a instrução também será serial; por exemplo, consultas de amostragem dinâmica.
  4. Alterar sessão alter session [force|enable] parallel [query|dml|ddl]; Observe que a DML paralela está desabilitada por padrão.
  5. Titulação de nível
  6. Grau índice
  7. O índice era mais barato As dicas paralelas apenas dizem ao otimizador para considerar uma varredura completa da tabela com um determinado DOP. Na verdade, eles não forçam o paralelismo. O otimizador ainda é livre para usar um acesso de índice serial se achar que é mais barato. (O FULL dica pode ajudar a resolver esse problema.)
  8. Gerenciamento do plano SQL Plan Baselines, contornos, perfis, reescrita avançada e SQL Translators podem alterar o grau de paralelismo nas suas costas. Verifique a seção Nota do plano.
  9. Edição Somente as edições Enterprise e Personal permitem operações paralelas. Exceto para o pacote DBMS_PARALLEL_EXECUTE.
  10. PARALLEL_ADAPTIVE_MULTI_USER
  11. PARALLEL_AUTOMATIC_TUNING
  12. PARALLEL_DEGREE_LIMIT
  13. PARALLEL_DEGREE_POLICY
  14. PARALLEL_FORCE_LOCAL
  15. PARALLEL_INSTANCE_GROUP
  16. PARALLEL_IO_CAP_ENABLED
  17. PARALLEL_MAX_SERVERS Este é o limite superior para todo o sistema. Há uma troca aqui. Executar muitos servidores paralelos ao mesmo tempo é ruim para o sistema. Mas fazer o downgrade de uma consulta para serial pode ser desastroso para algumas consultas.
  18. PARALLEL_MIN_PERCENT
  19. PARALLEL_MIN_SERVERS
  20. PARALLEL_MIN_TIME_THRESHOLD
  21. PARALLEL_SERVERS_TARGET
  22. PARALLEL_THREADS_PER_CPU
  23. Número de nós RAC Outro multiplicador para DOP padrão.
  24. CPU_COUNT Se o DOP padrão for usado.
  25. RECOVERY_PARALLELISMO
  26. FAST_START_PARALLEL_ROLLBACK
  27. Perfil SESSIONS_PER_USER também limita servidores paralelos.
  28. Gerenciador de recursos
  29. Carregamento do sistema Se parallel_adaptive_multi_user for true. Provavelmente impossível adivinhar quando o Oracle começará a limitar.
  30. PROCESSOS
  31. Restrições DML paralelas A DML paralela não funcionará se algum destes casos:
    1. COMPATÍVEL <9.2 para intrapartição
    2. INSERIR VALORES, tabelas com acionadores
    3. replicação
    4. integridade autorreferencial ou excluir restrições de integridade em cascata ou adiadas
    5. acessando uma coluna de objeto
    6. tabela não particionada com LOB
    7. paralelismo intrapartição com um LOB
    8. transação distribuída
    9. tabelas agrupadas
    10. tabelas temporárias
  32. As subconsultas escalares não são executadas em paralelo? Isso está no manual, e eu gostaria que fosse verdade, mas meus testes indicam que o paralelismo funciona aqui em 11g.
  33. ENQUEUE_RESOURCES Parâmetro oculto em 10g, isso é mais relevante?
  34. Tabelas organizadas por índice Não é possível inserir caminho direto para IOTs em paralelo? (Isso ainda é verdade?)
  35. Requisitos de função de pipeline paralelo Deve usar um CURSOR (?). TODO.
  36. As funções devem ser PARALLEL_ENABLE
  37. Tipo de declaração Versões mais antigas restringiam o paralelismo em DML dependendo do particionamento. Alguns dos manuais atuais ainda incluem isso, mas certamente não é mais verdade.
  38. Número de partições Apenas para junções por partição em versões mais antigas.(?)
  39. Erros Especificamente, eu vi muitos bugs com a análise. O Oracle alocará o número certo de servidores paralelos, mas nada acontecerá, pois todos esperam por eventos como cursor: pin s wait on x .

Esta lista certamente não está completa e não inclui recursos 12c. E não aborda problemas de sistema operacional e hardware. E não responde à pergunta terrivelmente difícil, "qual é o melhor grau de paralelismo?" (Resposta curta:mais geralmente é melhor, mas às custas de outros processos.) Espero que pelo menos lhe dê uma noção de como esses problemas podem ser difíceis e um bom lugar para começar a procurar.