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 da qualsiasi sessione. In alternativa, è possibile scaricare le query da un elenco di sessioni specificato 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 carico query

  • Addizione dinamica: le copie aggiornabili possono essere aggiunte come membri del pool elastico in qualsiasi momento. L'offload delle query si regola in modo dinamico per utilizzare i 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 su una copia aggiornabile rimossa dal pool elastico.

  • Offload persistente basato sulla sessione: l'offload delle query è persistente all'interno di una sessione, ovvero 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 memorizzato in procedure, funzioni, pacchetti o blocchi anonimi.

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

Visualizzazioni DBA_PROXY_SQL

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 l'abilitazione dell'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 che è un candidato per l'offload delle 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 un leader del 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 modulo o al nome 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 le query vengono scaricate. 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 un leader del 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.

    Ad 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 a cui le query vengono scaricate. 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.

Le viste DBA_PROXY_SQL_ACTIONS e DBA_PROXY_SQL_MODULES visualizzano 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 DBA_PROXY_SQL Views.

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 memorizzato in procedure, funzioni, pacchetti o blocchi anonimi.

Ad esempio, è possibile dimostrare che una query viene scaricata in una copia aggiornabile quando si abilita l'offload della 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 (quindi i dati della copia aggiornabile non sono aggiornati e sono diversi). In questo esempio, con valori diversi nel leader del pool elastico e nella 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 delle 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 per la sessione in modo che corrispondano ai nomi specificati nel Passo 1. Le query di questa sessione ora sono 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 del modulo e dell'azione in modo diverso da mod1 e act1. Le query di questa sessione non sono più idonee per essere scaricate in una copia aggiornabile a causa dei nomi di modulo e azione non corrispondenti 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 provenienti da un'azione 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 della query per un job di 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 (quindi i dati della copia aggiornabile non sono aggiornati e sono diversi). In questo esempio, con valori diversi nel leader del pool elastico e nella 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 l'offload delle query

Fornisce note aggiuntive per la funzione di scaricamento query.

Note per l'offload della query:

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

    Analogamente, quando un clone aggiornabile viene rimosso dal pool elastico, può verificarsi un ritardo di quindici minuti prima che la rimozione venga riflessa nel leader del pool elastico. La copia aggiornabile rimossa viene considerata come destinazione per gli scarichi 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, le query che vengono scaricate nella copia aggiornabile potrebbero subire un ritardo.

  • Supporto degli endpoint pubblici e privati: l'offload delle query è supportato per le istanze su un endpoint pubblico e per le istanze su 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 massimo di quindici minuti prima che il leader del pool elastico rilevi che una copia aggiornabile è stata disconnessa e interrompa il download delle query.

    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 specificata 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 con distinzione tra maiuscole e minuscole. Ad esempio, quando una sessione ha un nome di modulo minuscolo o un nome di modulo a lettere maiuscole/minuscole, il caso deve corrispondere ai valori dei parametri quando si abilita l'offload della 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.