Scarica query nelle copie aggiornabili dei membri

Quando si dispone di carichi di lavoro di lettura pesanti, in cui una quantità relativamente piccola di dati viene scansionata da più query, è possibile scaricare query (letture) da un leader del pool elastico o da un membro del pool elastico a copie aggiornabili.

Informazioni sull'offload delle query

Fornisce informazioni sull'uso dell'offload delle query con un pool elastico e descrive le funzioni di offload delle query.

L'offload delle query del pool elastico offre vantaggi in termini di prestazioni consentendo a una o più copie aggiornabili di gestire le query per un leader del pool elastico o per un membro del pool elastico. Questa funzione consente inoltre di aggiungere copie aggiornabili per soddisfare l'aumento della domanda di query (lettura). Le query di riduzione del carico consentono all'applicazione di ridimensionarsi orizzontalmente, dove è possibile aggiungere copie aggiornabili per mantenere le prestazioni complessive del sistema in base alle esigenze per soddisfare il volume delle richieste di query.

Quando l'offload delle query è abilitato, le query vengono sottomesse al leader del pool elastico o a un membro del pool elastico e una o più copie aggiornabili disponibili diventano candidati per l'offload delle query. Inoltre, quando vengono aggiunte altre copie aggiornabili, l'offload delle query viene regolato in modo dinamico per utilizzare le nuove risorse.

Un caso d'uso per l'offload delle query è quello di abilitare la funzione durante le ore di punta per rimuovere il carico dal leader del pool elastico o da un membro del pool elastico. Durante le ore di inattività, è possibile disabilitare l'offload delle query per eseguire operazioni di manutenzione, ad esempio l'aggiornamento delle copie aggiornabili.

Per impostazione predefinita, l'offload delle query considera le query di qualsiasi sessione. In alternativa, è possibile scaricare le query da una lista di sessioni specificate in base al nome del modulo o dell'azione.

La figura seguente mostra l'offload delle query dal leader del pool elastico.



La figura seguente mostra l'offload delle query da un membro del pool elastico.



I dati delle copie aggiornabili sono aggiornati in base all'ora dell'ultimo aggiornamento per ogni copia aggiornabile. Ciò significa che quando l'offload delle query è abilitato, è possibile eseguire tutte le operazioni DDL, DML e PL/SQL sul leader del pool elastico o sul membro del pool elastico che sta scaricando le query. Quindi, dopo l'aggiornamento di una copia aggiornabile, le modifiche vengono applicate alla copia aggiornabile.

Per ulteriori informazioni, vedere Usa copie aggiornabili con Autonomous Database.

Funzioni di riduzione del carico delle query

  • Aggiunta dinamica: le copie aggiornabili possono essere aggiunte come membri del pool elastico in qualsiasi momento. L'offload delle query viene regolato in modo dinamico per utilizzare nuovi membri.

  • Rimozione dinamica: le copie aggiornabili possono essere rimosse come membri del pool elastico in qualsiasi momento. L'offload delle query viene regolato in modo dinamico per interrompere l'offload delle query in una copia aggiornabile rimossa dal pool elastico.

  • Offload persistente basato su sessione: l'offload delle query è persistente all'interno di una sessione. Ciò significa che se una query in una sessione è stata scaricata in una particolare copia aggiornabile, l'offload delle query utilizza la stessa copia aggiornabile per scaricare le query successive nella stessa sessione.

  • Mapping servizio uno-a-uno: esiste un mapping uno-a-uno tra il servizio utilizzato nel leader del pool elastico o il membro del pool elastico dalla query originale e il servizio utilizzato in una copia aggiornabile per qualsiasi query scaricata. Ad esempio, se una sessione è connessa al servizio MEDIUM, l'offload delle query per tale sessione utilizza anche il servizio MEDIUM sulla copia aggiornabile.

  • Determinare se la sessione è stata scaricata: utilizzando una query SYS_CONTEXT è possibile determinare se una sessione viene eseguita sul leader o sul membro del pool elastico oppure viene scaricata in una copia aggiornabile.

  • Offload query da PL/SQL: le query vengono scaricate in una copia aggiornabile anche se sono incorporate in PL/SQL. PL/SQL può essere costituito da stored procedure, funzioni, package o blocchi anonimi.

  • Job Offload query da scheduler: le query all'interno di un job di Oracle Scheduler vengono scaricate. Le query dei job di Oracle Scheduler vengono scaricate se il job viene eseguito in primo piano o in background.

DBA_PROXY_SQL Viste

Utilizzare le viste DBA_PROXY_SQL DBA_PROXY_SQL_ACTIONS e DBA_PROXY_SQL_MODULES per visualizzare la lista dei moduli o delle azioni configurati per l'offload delle query. È necessario eseguire una query su queste viste da una sessione non abilitata per l'offload delle query.

Abilita scarico query

Descrive come abilitare l'offload delle query per un leader del pool elastico o per un membro del pool elastico.

Di seguito sono riportati i requisiti per abilitare l'offload delle query.

  • È possibile abilitare l'offload delle query per un leader del pool elastico o per un membro del pool elastico senza copie aggiornabili. Dopo aver abilitato l'offload delle query, è possibile aggiungere copie aggiornabili e la funzione di offload delle query si adatta in modo dinamico per utilizzare le copie aggiornabili.

  • Una copia aggiornabile candidata per l'offload della query deve:

    • Avere il leader del pool elastico come database di origine e trovarsi nella stessa area del leader del pool elastico.

      o

      Avere un membro del pool elastico come database di origine e trovarsi nella stessa area del membro del pool elastico.

    • Essere un membro del pool elastico.

Per abilitare l'offload delle query:

  1. Verificare che l'istanza di Autonomous Database sia un leader del pool elastico o un membro del pool elastico:
    1. Utilizzare la query seguente per verificare che un'istanza sia leader di un pool elastico:
      SELECT sys_context('userenv', 'is_elastic_pool_leader') FROM DUAL;

      Questa query deve restituire YES.

    2. Utilizzare la query seguente per verificare che un'istanza sia un membro del pool elastico:
      SELECT sys_context('userenv', 'is_elastic_pool_member') FROM DUAL;

      Questa query deve restituire YES.

    Nota

    Se il pool elastico è stato creato o modificato di recente, potrebbe verificarsi un ritardo massimo di 15 minuti affinché il valore sys_context rifletta il valore corrente.
  2. Abilita l'offload delle query.

    Sono disponibili due opzioni: è possibile abilitare l'offload delle query per le query da qualsiasi sessione o limitare l'offload delle query alle sessioni specificate in base al nome del modulo o dell'azione.

    • Per abilitare l'offload delle query per tutte le sessioni, eseguire DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD senza parametri. Ad esempio:

      EXEC DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD;
    • Per abilitare l'offload delle query per sessioni specifiche in base al nome del modulo o al nome dell'azione, eseguire DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD con i parametri module_name o action_name.

      Per ulteriori informazioni, vedere Abilita riduzione carico query per moduli o azioni denominati.

Quando l'offload delle query è abilitato per una sessione, è possibile trovare il nome della copia aggiornabile in cui vengono scaricate le query. Ad esempio, dalla sessione eseguire questa query:

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

Se le query non vengono scaricate in una copia aggiornabile, questa query mostra il nome del leader del pool elastico (o del membro del pool elastico che non è una copia aggiornabile).

Per ulteriori informazioni, vedere SYS_CONTEXT.

Per ulteriori informazioni, vedere ENABLE_READ_ONLY_OFFLOAD Procedure.

Abilita riduzione carico query per moduli o azioni denominati

Descrive come abilitare l'offload delle query per le sessioni con moduli o azioni denominati.

Per abilitare l'offload delle query per sessioni specifiche in base al nome del modulo o al nome dell'azione:

  1. Verificare che l'istanza sia un leader del pool elastico o un membro del pool elastico.
    1. Utilizzare la query seguente per verificare che un'istanza sia leader di un pool elastico:
      SELECT sys_context('userenv', 'is_elastic_pool_leader') FROM DUAL;

      Questa query deve restituire YES.

    2. Utilizzare la query seguente per verificare che un'istanza sia un membro del pool elastico:
      SELECT sys_context('userenv', 'is_elastic_pool_member') FROM DUAL;

      Questa query deve restituire YES.

    Nota

    Se il pool elastico è stato creato o modificato di recente, potrebbe verificarsi un ritardo massimo di 15 minuti affinché il valore sys_context rifletta il valore corrente.
  2. Utilizzare le routine SET_ACTION o SET_MODULE in DBMS_APPLICATION_INFO per impostare il nome del modulo e/o il nome dell'azione nella sessione corrente.

    Esempio

    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;

    Per ulteriori informazioni, vedere DBMS_APPLICATION_INFO.

  3. Abilita l'offload della query e specifica le sessioni idonee in base al nome del modulo o al nome dell'azione (o in base al nome del modulo e al nome dell'azione).

    Ad esempio:

    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 l'offload delle query è abilitato per una sessione, dalla sessione è possibile trovare il nome della copia aggiornabile in cui vengono scaricate le query. Ad esempio:

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

Se le query non vengono scaricate in una copia aggiornabile, questa query mostra il nome del leader del pool elastico (o del membro del pool elastico che non è una copia aggiornabile).

Per ulteriori informazioni, vedere SYS_CONTEXT.

Nelle viste DBA_PROXY_SQL_ACTIONS e DBA_PROXY_SQL_MODULES viene visualizzata la lista dei moduli o delle azioni configurati per l'offload delle query. È necessario eseguire una query su queste viste da una sessione non abilitata per l'offload delle query. Per ulteriori informazioni, vedere Viste DBA_PROXY_SQL.

Per ulteriori informazioni, vedere ENABLE_READ_ONLY_OFFLOAD Procedure.

Disabilita scarico query

Descrive come disabilitare l'offload delle query per un leader del pool elastico o per un membro del pool elastico.

Nell'istanza che sta scaricando le query, disabilitare l'offload delle query.

Ad esempio:

EXEC DBMS_PROXY_SQL.DISABLE_READ_ONLY_OFFLOAD;

Per ulteriori informazioni, vedere DISABLE_READ_ONLY_OFFLOAD Procedure.

Offload query da PL/SQL

Quando l'offload delle query è abilitato, le query vengono scaricate nelle copie aggiornabili anche se sono incorporate in PL/SQL. PL/SQL può essere costituito da stored procedure, funzioni, package o blocchi anonimi.

Ad esempio, è possibile dimostrare l'offload di una query in una copia aggiornabile quando si abilita l'offload delle query per un modulo e un'azione specifici. In questo esempio, si supponga che i dati del leader siano stati aggiornati e che la copia aggiornabile non sia stata ancora aggiornata (in modo che i dati della copia aggiornabile siano obsoleti e diversi). In questo esempio, con valori diversi sul leader del pool elastico e sulla copia aggiornabile, è possibile vedere quando i dati provengono dal leader o dalla copia aggiornabile.

  1. Abilita l'offload della query e specifica le sessioni idonee in base al nome del modulo e al nome dell'azione. Ad esempio, '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. Definire la funzione f1 per eseguire il test dell'offload della query.

    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. Eseguire la funzione f1. La query con la funzione f1 viene eseguita sul leader del pool elastico (o su un membro del pool elastico per cui è abilitata la query di scarico). Questa sessione viene eseguita con i nomi di modulo e azione non specificati che non corrispondono a quelli specificati per l'offload della query nel passo 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. Specificare il nome del modulo e il nome dell'azione affinché la sessione corrisponda ai nomi specificati nel passo 1. Le query di questa sessione sono ora idonee per essere scaricate in una copia aggiornabile.

    SQL> exec dbms_application_info.set_module('mod1', 'act1');
     
    PL/SQL procedure successfully completed.
  5. Eseguire nuovamente la funzione f1. In questo caso, il nome del modulo e il nome dell'azione corrispondono ai nomi specificati nel Passo 1. La query nella funzione f1 viene scaricata in una copia aggiornabile.

    SQL> -- Expected to fetch from Refreshable Clone and returns value 10
    SQL> select f1(3) from dual;
     
         F1(3)
    ----------
            10
     
    1 row selected.
  6. Specificare i nomi dei moduli e delle azioni come qualcosa di diverso da mod1 e act1. Le query di questa sessione non sono più idonee per essere scaricate in una copia aggiornabile, poiché i nomi dei moduli e delle azioni non corrispondono a quelli specificati nel Passo 1.

    SQL> exec dbms_application_info.set_module('random', 'random');
     
    PL/SQL procedure successfully completed.
  7. Eseguire la query con la funzione f1. Poiché il modulo e il nome dell'azione per questa sessione non corrispondono a quelli impostati nel Passo 1, questa query non viene scaricata e viene eseguita sul leader del pool elastico.

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

Offload query da un job scheduler

Quando l'offload delle query è abilitato, le query dall'interno di un'azione del job di Oracle Scheduler vengono scaricate in copie aggiornabili. Le query vengono scaricate se il job viene eseguito in primo piano o in background.

Ad esempio, come nell'esempio precedente per PL/SQL, è possibile dimostrare che una query viene scaricata in una copia aggiornabile quando si abilita l'offload delle query per un job Oracle Scheduler. In questo esempio, si supponga che i dati del leader siano stati aggiornati e che la copia aggiornabile non sia stata ancora aggiornata (in modo che i dati della copia aggiornabile siano obsoleti e diversi). In questo esempio, con valori diversi sul leader del pool elastico e sulla copia aggiornabile, è possibile vedere quando i dati provengono dal leader o dalla copia aggiornabile.

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.

Note per le query di scarico

Fornisce note aggiuntive per la funzione di riduzione del carico delle query.

Note per l'offload delle query:

  • Aggiunta o rimozione di una copia aggiornabile: quando si aggiunge una copia aggiornabile come membro del pool elastico, può verificarsi un ritardo fino a quindici minuti affinché l'aggiunta si rifletta nel leader del pool elastico. Una copia aggiornabile appena aggiunta non viene considerata come destinazione per gli offload delle query finché il leader non viene a conoscenza del membro del pool elastico appena aggiunto.

    Allo stesso modo, quando un clone aggiornabile viene rimosso dal pool elastico, può verificarsi un ritardo di quindici minuti affinché la rimozione si rifletta nel leader del pool elastico. La copia aggiornabile rimossa viene considerata come una destinazione per gli offload delle query finché il leader non sa che il membro è stato rimosso dal pool elastico.

  • Aggiornamento della copia aggiornabile: quando si aggiorna una copia aggiornabile, è possibile che le query scaricate nella copia aggiornabile vengano ritardate.

  • Supporto endpoint pubblico e privato: l'offload delle query è supportato per le istanze in un endpoint pubblico e per le istanze in un endpoint privato.

  • Copia aggiornabile disconnessa: se una copia aggiornabile viene disconnessa, non è più idonea come destinazione per l'offload delle query. Può verificarsi un ritardo fino a quindici minuti affinché il leader del pool elastico rilevi che una copia aggiornabile è disconnessa e interrompa l'offload delle query su di essa.

    Per assicurarsi che una copia aggiornabile rimanga disponibile per l'offload delle query, abilitare gli aggiornamenti automatici o aggiornare periodicamente manualmente la copia aggiornabile.

    Per ulteriori informazioni, vedere Aggiorna una copia aggiornabile in Autonomous Database.

  • Nome modulo con distinzione tra maiuscole e minuscole e Nome azione: quando si scaricano le query da una lista di sessioni specificate in base al nome del modulo o dell'azione, il nome del modulo e il nome dell'azione impostati con DBMS_APPLICATION_INFO fanno distinzione tra maiuscole e minuscole. DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD rispetta questo comportamento case sensitive. Ad esempio, quando una sessione ha un nome di modulo minuscolo o un nome di modulo con maiuscole e minuscole, il caso deve corrispondere nei valori dei parametri quando si abilita l'offload delle query con DBMS_PROXY_SQL.ENABLE_READ_ONLY_OFFLOAD e si includono i parametri module_name o action_name.

    È possibile controllare il nome del modulo e il nome dell'azione per la sessione corrente utilizzando 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 d'uso tipico: un caso d'uso per l'offload delle query è quello di abilitare la funzione durante le ore di punta per rimuovere il carico da Elastic Pool Leader (o dal membro Elastic Pool in cui è abilitato l'offload delle query). Durante le ore di inattività, è possibile disabilitare l'offload delle query per eseguire operazioni di manutenzione, ad esempio l'aggiornamento delle copie aggiornabili.