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 as 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 fazer uso de 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.

  • Descarregamento Adesivo Baseado em Sessão: O descarregamento de consulta é mantido em uma sessão, o que significa que se uma consulta em uma sessão tiver sido descarregada para um Clone Atualizável específico, o descarregamento 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 Consultas 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, como procedures, funções, pacotes ou blocos anônimos.

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

DBA_PROXY_SQL Exibições

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 são configurados para offload de consulta. É necessário consultar essas exibições em 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 descarregamento de consultas:

  • 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.

    • Ser um membro de pool elástico.

Para ativar o descarregamento de consultas:

  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 seguinte consulta 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. 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 às sessões especificadas por módulo ou nome da ação.

    • Para ativar o off-load 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 offload de consulta 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 é 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 saber mais.

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 descarregamento de consultas 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 seguinte consulta 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 no 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 é 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 saber mais.

As views DBA_PROXY_SQL_ACTIONS e DBA_PROXY_SQL_MODULES exibem a lista de módulos ou ações que são configurados para offload de consulta. É necessário consultar essas exibições em 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.

Transferência de Consulta do Código PL/SQL

Quando o descarregamento de consulta é 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, como procedures, funções, pacotes ou blocos anônimos.

Por exemplo, você pode demonstrar uma consulta sendo descarregada para um Clone Atualizável quando 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 que o Clone Atualizável ainda não tenha sido atualizado (assim, 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 são provenientes 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 offload 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 para que a sessão corresponda aos nomes especificados na Etapa 1. As consultas desta sessão agora estão qualificadas para serem descarregadas para 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 o módulo e os nomes de ação como algo diferente de mod1 e act1. As consultas desta sessão não são mais elegíveis para serem descarregadas para um Clone Atualizável, pois os nomes de módulo e 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 nome do módulo e da ação para esta sessão não corresponde 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.

Descarregamento de Consulta de um Job do Scheduler

Quando o descarregamento de consulta é 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 é 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 quando você ativa o descarregamento de consulta para um job do Oracle Scheduler. Neste exemplo, suponha que os dados do líder tenham sido atualizados e que o Clone Atualizável ainda não tenha sido atualizado (assim, 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 são provenientes 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 descarregamento da consulta:

  • Adição ou Remoção de um Clone Atualizável: Quando um Clone Atualizável é adicionado como um 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 descarregamentos 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 descarregamentos 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 que são descarregadas 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 o líder do pool elástico detectar que um Clone Atualizável se desconectou e interromper o descarregamento de consultas a ele.

    Para garantir que um Clone Atualizável permaneça disponível para descarregamento de consultas, 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 e Nome da Ação do Módulo com Distinção entre Maiúsculas e Minúsculas: 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 sensível a casos. Por exemplo, quando uma sessão tem um nome de módulo em letras minúsculas ou um nome de módulo em letras maiúsculas e minúsculas, a letra deve corresponder aos valores do parâmetro quando você ativa o descarregamento 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 para a 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.