Descarregar Consultas para Clones Atualizáveis do Membro

Quando você tem cargas de trabalho de leitura intensas, em que uma quantidade relativamente pequena de dados é verificada por várias consultas, pode fazer offload de consultas (leituras) de um líder de pool elástico ou de um membro de pool elástico para Clones Atualizáveis.

Sobre Descarregamento de Consulta

Fornece informações sobre o uso de offload de consulta com um pool elástico e descreve os recursos de offload de consulta.

O offload de consulta do pool elástico oferece benefícios de desempenho ao permitir que um ou mais Clones Atualizáveis tratem consultas para um líder de pool elástico ou para um membro de pool elástico. Esse recurso também permite adicionar Clones Atualizáveis para acomodar a crescente demanda de consulta (leitura). O descarregamento de consultas permite que seu aplicativo seja dimensionado horizontalmente, onde você pode adicionar Clones Atualizáveis para manter o desempenho geral do sistema conforme necessário para atender ao volume de solicitações de consulta.

Quando o descarregamento de consulta é ativado, as consultas são enviadas ao líder do pool elástico ou a um membro do pool elástico e um ou mais Clones Atualizáveis disponíveis se tornam candidatos ao descarregamento de consulta. Além disso, quando mais Clones Atualizáveis são adicionados, o descarregamento de consultas é ajustado dinamicamente para fazer uso dos novos recursos.

Um caso de uso para descarregamento de consulta é ativar o recurso durante o horário de pico para tirar a carga do líder do pool elástico ou de um membro do pool elástico. Durante o horário de silêncio, você pode desativar o descarregamento de consultas para executar operações de manutenção, como atualizar os Clones Atualizáveis.

Por padrão, o offload de consulta considera consultas de qualquer sessão. Como alternativa, você pode descarregar consultas de uma lista de sessões que você especifica por módulo ou nome da ação.

A figura a seguir mostra as consultas de descarregamento do líder do pool elástico.



A figura a seguir mostra as consultas de descarregamento de um membro do pool elástico.



Os dados dos Clones Atualizáveis estão atualizados com base no último horário de atualização de cada clone atualizável. Isso significa que quando o offload de consulta é ativado, você executa todas as operações DDL, DML e PL/SQL no líder do pool elástico ou no membro do pool elástico que está descarregando consultas. Em seguida, após a atualização de um Clone Atualizável, as alterações serão refletidas no Clone Atualizável.

Consulte Usar Clones Atualizáveis com o Autonomous Database para obter mais informações.

Recursos de Offload de Consulta

  • Adição Dinâmica: Os Clones Atualizáveis podem ser adicionados como membros do pool elástico a qualquer momento. O descarregamento da consulta se ajusta dinamicamente para usar novos membros.

  • Remoção Dinâmica: Os Clones Atualizáveis podem ser removidos como membros do pool elástico a qualquer momento. O descarregamento de consulta se ajusta dinamicamente para interromper o descarregamento de consultas para um Clone Atualizável que foi removido do pool elástico.

  • Offload de Adesivo Baseado em Sessão: O offload de consulta é sticky dentro de uma sessão, ou seja, se uma consulta em uma sessão tiver sido descarregada para um Clone Atualizável específico, o offload de consulta usará o mesmo Clone Atualizável para descarregar consultas subsequentes na mesma sessão.

  • Mapeamento de Serviço Um para Um: Há um mapeamento um para um entre o serviço usado no líder do pool elástico ou no membro do pool elástico pela consulta original e o serviço usado em um Clone Atualizável para qualquer consulta descarregada. Por exemplo, se uma sessão estiver conectada ao serviço MEDIUM, o offload de consulta dessa sessão também usará o serviço MEDIUM no Clone Atualizável.

  • Determinar se a Sessão está Offloadada: Usando uma consulta SYS_CONTEXT, você pode determinar se uma sessão é executada no líder ou membro do pool elástico ou se está offload em um Clone Atualizável.

  • Descarregamento de Consulta do PL/SQL: As consultas são descarregadas para um Clone Atualizável mesmo que estejam incorporadas ao PL/SQL. O código PL/SQL pode ser armazenado em procedures, funções, pacotes ou blocos anônimos.

  • Descarga de Consulta do Job do Scheduler: Consultas de dentro de ações de job do Oracle Scheduler são descarregadas. As consultas de job do Oracle Scheduler são descarregadas se o job for executado em primeiro plano ou em segundo plano.

DBA_PROXY_SQL Views

Use as views DBA_PROXY_SQL DBA_PROXY_SQL_ACTIONS e DBA_PROXY_SQL_MODULES para exibir a lista de módulos ou ações que estão configurados para offload de consulta. Você deve consultar essas views de uma sessão que não está ativada para descarregamento de consulta.

Ativar Descarregamento de Consulta

Descreve como ativar o offload de consulta para um líder de pool elástico ou para um membro de pool elástico.

Veja a seguir os requisitos para ativar o offload de consulta:

  • Você pode ativar o offload de consulta para um líder de pool elástico ou para um membro de pool elástico sem Clones Atualizáveis. Depois de ativar o descarregamento de consultas, você pode adicionar Clones Atualizáveis e o recurso de descarregamento de consultas se ajusta dinamicamente para fazer uso dos clones atualizáveis.

  • Um Clone Atualizável que seja um candidato para descarregamento de consulta deve:

    • Tenha o líder do pool elástico como seu banco de dados de origem e esteja na mesma região que o líder do pool elástico.

      ou

      Ter um membro do pool elástico como seu banco de dados de origem e estar na mesma região que o membro do pool elástico.

    • Seja um membro do Elastic Pool.

Para ativar o offload de consulta:

  1. Verifique se a instância do Autonomous Database é um líder de pool elástico ou um membro de pool elástico:
    1. Use a consulta a seguir para verificar se uma instância é líder de um pool elástico:
      SELECT sys_context('userenv', 'is_elastic_pool_leader') FROM DUAL;

      Essa consulta deve retornar YES.

    2. Use a seguinte consulta para verificar se uma instância é membro de um pool elástico:
      SELECT sys_context('userenv', 'is_elastic_pool_member') FROM DUAL;

      Essa consulta deve retornar YES.

    Observação

    Pode haver um atraso de até 15 minutos para que o valor sys_context reflita o valor atual se o pool elástico tiver sido criado ou modificado recentemente.
  2. Ativar offload de consulta.

    Há duas opções: você pode ativar o offload de consulta para consultas de qualquer sessão ou limitar o offload de consulta para as sessões especificadas por módulo ou nome da ação.

    • Para ativar o offload de consulta para todas as sessões, execute DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD sem parâmetros. Por exemplo:

      EXEC DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD;
    • Para ativar o descarregamento de consultas para sessões específicas por nome do módulo ou nome da ação, execute DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD com os parâmetros module_name ou action_name.

      Consulte Ativar Offload de Consulta para Módulos ou Ações Nomeados para obter mais informações.

Quando o descarregamento de consulta está ativado para uma sessão, você pode encontrar o nome do Clone Atualizável para o qual as consultas são descarregadas. Por exemplo, na sessão, execute esta consulta:

SELECT sys_context('userenv', 'con_name') FROM DUAL;

Se as consultas não estiverem sendo descarregadas para um Clone Atualizável, esta consulta mostrará o nome do líder do pool elástico (ou do membro do pool elástico que não é um clone atualizável).

Consulte SYS_CONTEXT para obter mais informações.

Consulte ENABLE_READ_ONLY_OFFLOAD Procedures para obter mais informações.

Ativar Offload de Consulta para Módulos ou Ações Nomeados

Descreve como ativar o offload de consulta para sessões com módulos ou ações nomeados.

Para ativar o offload de consulta para sessões específicas por nome de módulo ou nome de ação:

  1. Verifique se a instância é um líder de pool elástico ou um membro de pool elástico.
    1. Use a consulta a seguir para verificar se uma instância é líder de um pool elástico:
      SELECT sys_context('userenv', 'is_elastic_pool_leader') FROM DUAL;

      Esta consulta deve retornar YES.

    2. Use a seguinte consulta para verificar se uma instância é membro de um pool elástico:
      SELECT sys_context('userenv', 'is_elastic_pool_member') FROM DUAL;

      Esta consulta deve retornar YES.

    Observação

    Pode haver um atraso de até 15 minutos para que o valor sys_context reflita o valor atual se o pool elástico tiver sido criado ou modificado recentemente.
  2. Use as rotinas SET_ACTION ou SET_MODULE em DBMS_APPLICATION_INFO para definir o nome do módulo e/ou o nome da ação na sessão atual.

    Por exemplo

    CREATE or replace PROCEDURE add_employee( 
      name VARCHAR2, 
      salary NUMBER, 
      manager NUMBER, 
      title VARCHAR2, 
      commission NUMBER, 
      department NUMBER) AS 
    BEGIN 
      DBMS_APPLICATION_INFO.SET_MODULE( 
        module_name => 'add_employee', 
        action_name => 'insert into emp'); 
      INSERT INTO emp 
        (ename, empno, sal, mgr, job, hiredate, comm, deptno) 
        VALUES (name, emp_seq.nextval, salary, manager, title, SYSDATE, 
                commission, department); 
      DBMS_APPLICATION_INFO.SET_MODULE(null,null); 
    END;

    Consulte DBMS_APPLICATION_INFO para obter mais informações.

  3. Ative o descarregamento de consulta e especifique as sessões elegíveis por nome de módulo ou por nome de ação (ou por nome de módulo e nome de ação).

    Por exemplo:

    DECLARE 
       mod_values clob := to_clob('["mod1", "mod2"]');
       act_values clob := to_clob('["act1", "act2"]');
    BEGIN 
       DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD(
          module_name => mod_values,                                          
          action_name => act_values);
    END;
    /

Quando o descarregamento de consulta está ativado para uma sessão, na sessão você pode encontrar o nome do Clone Atualizável para o qual as consultas são descarregadas. Por exemplo:

SELECT sys_context('userenv', 'con_name') FROM DUAL;

Se as consultas não estiverem sendo descarregadas para um Clone Atualizável, esta consulta mostrará o nome do líder do pool elástico (ou do membro do pool elástico que não é um clone atualizável).

Consulte SYS_CONTEXT para obter mais informações.

As views DBA_PROXY_SQL_ACTIONS e DBA_PROXY_SQL_MODULES exibem a lista de módulos ou ações configurados para offload de consulta. Você deve consultar essas views de uma sessão que não está ativada para descarregamento de consulta. Consulte DBA_PROXY_SQL Views para obter mais informações.

Consulte ENABLE_READ_ONLY_OFFLOAD Procedures para obter mais informações.

Desativar Descarregamento de Consulta

Descreve como desativar o offload de consulta para um líder de pool elástico ou para um membro de pool elástico.

Na instância que está descarregando consultas, desative o descarregamento de consultas.

Por exemplo:

EXEC DBMS_PROXY_SQL.DISABLE_READ_ONLY_OFFLOAD;

Consulte DISABLE_READ_ONLY_OFFLOAD Procedures para obter mais informações.

Descarregamento de Consulta de PL/SQL

Quando o descarregamento de consultas está ativado, as consultas são descarregadas para Clones Atualizáveis, mesmo que estejam incorporadas ao PL/SQL. O código PL/SQL pode ser armazenado em procedures, funções, pacotes ou blocos anônimos.

Por exemplo, você pode demonstrar que uma consulta está sendo descarregada para um Clone Atualizável ao ativar o descarregamento de consulta para um módulo e uma ação específicos. Neste exemplo, suponha que os dados do líder tenham sido atualizados e o Clone Atualizável ainda não tenha sido atualizado (portanto, os dados do Clone Atualizável estão desatualizados e diferentes). Neste exemplo, com valores diferentes no líder do pool elástico e no Clone Atualizável, você pode ver quando os dados estão vindo do líder ou do Clone Atualizável.

  1. Ative o descarregamento de consulta e especifique as sessões elegíveis por nome do módulo e nome da ação. Por exemplo, 'mod1', 'act1'.

    DECLARE 
       mod_values clob := to_clob('["mod1"]');
       act_values clob := to_clob('["act1"]');
    BEGIN 
       DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD(
          module_name => mod_values,                                          
          action_name => act_values);
    END;
    /
  2. Defina a função f1 para testar o descarregamento da consulta.

    SQL> create or replace function f1 (n number)
      2  return number
      3  as
      4    l_cnt number;
      5  begin
      6    select sum(c1) into l_cnt from u2.tab1;
      7    return l_cnt;
      8  end;
      9  /
     
    Function created.
  3. Execute a função f1. A consulta com a função f1 é executada no líder do pool elástico (ou em um membro do pool elástico que tenha a consulta de descarregamento ativada). Esta sessão é executada com nomes de módulo e ação não especificados que não correspondem aos especificados para descarregamento de consulta na Etapa 1.

    SQL> -- expected to fetch from Elastic Pool Leader and returns value 40
    SQL> select f1(3) from dual;
         F1(3)
    ----------
            40
     
    1 row selected.
  4. Especifique o nome do módulo e o nome da ação da sessão para corresponder aos nomes especificados na Etapa 1. As consultas desta sessão agora estão qualificadas para serem descarregadas em um Clone Atualizável.

    SQL> exec dbms_application_info.set_module('mod1', 'act1');
     
    PL/SQL procedure successfully completed.
  5. Execute a função f1 novamente. Nesse caso, o nome do módulo e o nome da ação correspondem aos nomes especificados na Etapa 1. A consulta na função f1 é descarregada para um Clone Atualizável.

    SQL> -- Expected to fetch from Refreshable Clone and returns value 10
    SQL> select f1(3) from dual;
     
         F1(3)
    ----------
            10
     
    1 row selected.
  6. Especifique os nomes de módulo e ação como algo diferente de mod1 e act1. As consultas desta sessão não são mais elegíveis para serem transferidas para um Clone Atualizável, pois os nomes do módulo e da ação não correspondem aos especificados na Etapa 1.

    SQL> exec dbms_application_info.set_module('random', 'random');
     
    PL/SQL procedure successfully completed.
  7. Execute a consulta com a função f1. Como o módulo e o nome da ação desta sessão não correspondem aos definidos na Etapa 1, esta consulta não é descarregada e é executada no líder do pool elástico.

    SQL> -- expected to fetch from Elastic Pool Leader and returns value 40
    SQL> select f1(3) from dual;
         F1(3)
    ----------
            40
     
    1 row selected.

Descarga de Consulta de um Job do Scheduler

Quando o descarregamento de consulta está ativado, as consultas de dentro de uma ação de job do Oracle Scheduler são descarregadas para Clones Atualizáveis. As consultas são descarregadas se o job for executado em primeiro plano ou em segundo plano.

Por exemplo, semelhante ao exemplo anterior para PL/SQL, você pode demonstrar que uma consulta está sendo descarregada para um Clone Atualizável ao ativar o descarregamento de consulta para um job do Oracle Scheduler. Neste exemplo, suponha que os dados do líder tenham sido atualizados e o Clone Atualizável ainda não tenha sido atualizado (portanto, os dados do Clone Atualizável estão desatualizados e diferentes). Neste exemplo, com valores diferentes no líder do pool elástico e no Clone Atualizável, você pode ver quando os dados estão vindo do líder ou do Clone Atualizável.

SQL> create or replace procedure sproc1 (n number)
  2  as
  3    l_cnt number;
  4  begin
  5    select sum(c1) into l_cnt from u2.tab1;
  6    dbms_output.put_line('l_cnt is ' || l_cnt);
  7  end;
  8  /
 
Procedure created.

Offload Queries from Elastic Pool Leader to Member Refreshable Clones

SQL> create or replace procedure sproc1 (n number)
  2  as
  3    l_cnt number;
  4  begin
  5    select sum(c1) into l_cnt from u2.tab1;
  6    dbms_output.put_line('l_cnt is ' || l_cnt);
  7  end;
  8  /
 
Procedure created.
 
SQL>
SQL> BEGIN
  2    dbms_scheduler.create_job(job_name    => 'PROXYTEST1',
  3                              job_type    => 'PLSQL_BLOCK',
  4                              job_action  => 'BEGIN sproc1(3); END;',
  5                              enabled     => FALSE);
  6  END;
  7  /
 
PL/SQL procedure successfully completed.
 
SQL>
SQL> -- Job runs in the foreground in the current session
SQL> -- expected to fetch from Leader: 40
SQL> exec dbms_scheduler.RUN_JOB(job_name => 'PROXYTEST1', use_current_session => true);
l_cnt is 40
 
PL/SQL procedure successfully completed.
 
SQL>
SQL> exec dbms_proxy_sql.enable_read_only_offload;
 
PL/SQL procedure successfully completed.
 
SQL> show con_name
 
CON_NAME
------------------------------
CDB1_PDB1
SQL> 
SQL> set serveroutput on
SQL> -- Job runs in the foreground in the current session
SQL> -- expected to fetch from Refreshable Clone: 10
SQL> exec dbms_scheduler.RUN_JOB(job_name => 'PROXYTEST1', use_current_session => true);
l_cnt is 10
 
PL/SQL procedure successfully completed.
 
SQL>
SQL> -- Job runs in the background and is expected to fetch from Refreshable Clone: 10
SQL> exec dbms_scheduler.RUN_JOB(job_name => 'PROXYTEST1', use_current_session => false);
 
PL/SQL procedure successfully completed.

Observações para Descarregar Consultas

Fornece observações adicionais para o recurso de descarregamento de consulta.

Observações para offload de consulta:

  • Adição ou Remoção de um Clone Atualizável: Quando um Clone Atualizável é adicionado como membro do pool elástico, pode haver um atraso de até quinze minutos para que a adição seja refletida no líder do pool elástico. Um Clone Atualizável recém-adicionado não é considerado como um destino para descargas de consulta até que o líder esteja ciente do membro do pool elástico recém-adicionado.

    Da mesma forma, quando um Clone Atualizável é removido do pool elástico, pode haver um atraso de até quinze minutos para que a remoção seja refletida no líder do pool elástico. O Clone Atualizável removido é considerado como um destino para descargas de consulta até que o líder saiba que o membro foi removido do pool elástico.

  • Atualização de Clone Atualizável: Quando um Clone Atualizável está sendo atualizado, as consultas transferidas para o Clone Atualizável podem ser atrasadas.

  • Suporte a Pontos Finais Públicos e Privados: O offload de consulta é suportado para instâncias em um ponto final público e para instâncias em um ponto final privado.

  • Clone Atualizável Desconectado: Se um Clone Atualizável for desconectado, ele não será mais elegível como destino para descarregamento de consulta. Pode haver um atraso de até quinze minutos para que o líder do pool elástico detecte que um Clone Atualizável foi desconectado e pare de descarregar consultas para ele.

    Para garantir que um Clone Atualizável permaneça disponível para descarregamento de consulta, ative as atualizações automáticas ou atualize periodicamente manualmente o Clone Atualizável.

    Consulte Atualizar um Clone Atualizável no Autonomous Database para obter mais informações.

  • Nome do Módulo com Distinção entre Maiúsculas e Minúsculas e Nome da Ação: Quando você descarrega consultas de uma lista de sessões que você especifica por módulo ou nome da ação, o nome do módulo e o nome da ação definidos com DBMS_APPLICATION_INFO fazem distinção entre maiúsculas e minúsculas. DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD adere a esse comportamento que faz distinção entre maiúsculas e minúsculas. Por exemplo, quando uma sessão tem um nome de módulo em letras minúsculas ou um nome de módulo com letras maiúsculas e minúsculas, o uso de maiúsculas e minúsculas deve corresponder aos valores de parâmetro quando você ativa o offload de consulta com DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD e inclui os parâmetros module_name ou action_name.

    Você pode verificar o nome do módulo e o nome da ação da sessão atual usando DBMS_APPLICATION_INFO.READ_MODULE:

    set serveroutput on;
    declare
      l_mod varchar2(50);
      l_act varchar2(50);
    BEGIN
    DBMS_APPLICATION_INFO.READ_MODULE(l_mod, l_act);
      DBMS_OUTPUT.PUT_LINE('l_mod: ' || l_mod);
      DBMS_OUTPUT.PUT_LINE('l_act: ' || l_act);
    END;
    /
  • Caso de Uso Típico: Um caso de uso para descarregamento de consulta é permitir que o recurso durante o horário de pico tire a carga do Líder do Pool Elástico (ou do Membro do Pool Elástico em que o descarregamento de consulta está ativado). Durante o horário de silêncio, você pode desativar o descarregamento de consultas para executar operações de manutenção, como atualizar os Clones Atualizáveis.