View a markdown version of this page

Emula gli array PL/SQL associativi Oracle in Amazon Aurora PostgreSQL e Amazon RDS per PostgreSQL - Prontuario AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Emula gli array PL/SQL associativi Oracle in Amazon Aurora PostgreSQL e Amazon RDS per PostgreSQL

Rajkumar Raghuwanshi, Bhanu Ganesh Gudivada e Sachin Khanna, Amazon Web Services

Riepilogo

Questo modello descrive come emulare gli array PL/SQL associativi Oracle con posizioni di indice vuote in ambienti Amazon Aurora PostgreSQL e Amazon RDS for PostgreSQL. Descrive inoltre alcune delle differenze tra gli array PL/SQL associativi Oracle e gli array PostgreSQL per quanto riguarda il modo in cui ciascuno gestisce le posizioni degli indici vuoti durante le migrazioni.

Forniamo un'alternativa PostgreSQL all'aws_oracle_extutilizzo di funzioni per la gestione delle posizioni di indice vuote durante la migrazione di un database Oracle. Questo modello utilizza una colonna aggiuntiva per memorizzare le posizioni degli indici e mantiene la gestione degli array sparsi da parte di Oracle incorporando funzionalità PostgreSQL native.

Oracle

In Oracle, le raccolte possono essere inizializzate come vuote e popolate utilizzando il metodo EXTEND collection, che aggiunge elementi all'array. NULL Quando si lavora con array PL/SQL associativi indicizzati daPLS_INTEGER, il EXTEND metodo aggiunge NULL elementi in sequenza, ma gli elementi possono anche essere inizializzati in posizioni di indice non sequenziali. Qualsiasi posizione dell'indice che non sia inizializzata in modo esplicito rimane vuota.

Questa flessibilità consente strutture di array sparse in cui gli elementi possono essere popolati in posizioni arbitrarie. Quando si esegue un'iterazione tra le raccolte utilizzando un FOR LOOP with FIRST e un LAST bounds, vengono elaborati solo gli elementi inizializzati (indipendentemente dal fatto che abbiano NULL un valore definito), mentre le posizioni vuote vengono saltate.

PostgreSQL (Amazon Aurora e Amazon RDS)

PostgreSQL gestisce i valori vuoti in modo diverso dai valori. NULL Memorizza i valori vuoti come entità distinte che utilizzano un byte di archiviazione. Quando un array ha valori vuoti, PostgreSQL assegna posizioni di indice sequenziali proprio come valori non vuoti. Ma l'indicizzazione sequenziale richiede un'elaborazione aggiuntiva perché il sistema deve scorrere attraverso tutte le posizioni indicizzate, comprese quelle vuote. Ciò rende la creazione di array tradizionali inefficiente per set di dati sparsi.

AWS Schema Conversion Tool

Il AWS Schema Conversion Tool (AWS SCT) in genere gestisce le Oracle-to-PostgreSQL migrazioni utilizzando le funzioni. aws_oracle_ext In questo modello, proponiamo un approccio alternativo che utilizza le funzionalità native di PostgreSQL, che combina i tipi di array PostgreSQL con una colonna aggiuntiva per l'archiviazione delle posizioni degli indici. Il sistema può quindi eseguire iterazioni tra gli array utilizzando solo la colonna dell'indice.

Prerequisiti e limitazioni

Prerequisiti

  • Un attivo Account AWS

  • Autorizzazioni di amministratore in AWS Identity and Access Management (IAM)

  • Un'istanza compatibile con Amazon RDS o Aurora PostgreSQL

  • Competenze di architetto o sviluppatore di database con Oracle e PostgreSQL

Limitazioni

Versioni del prodotto

Questo modello è stato testato con le seguenti versioni:

  • Amazon Aurora PostgreSQL 13.3

  • Amazon RDS per PostgreSQL 13.3

  • AWS SCT 1.0.674

  • Oracle 19c EE

Architecture

Stack tecnologico di origine

  • On-premises database Oracle

Stack tecnologico Target

  • Amazon Aurora PostgreSQL

  • Amazon RDS per PostgreSQL

Architettura di destinazione

Il diagramma mostra:

  • Un'istanza di database Amazon RDS for Oracle di origine

  • Un'istanza Amazon EC2 AWS SCT per convertire le funzioni Oracle nell'equivalente PostgreSQL

  • Un database di destinazione compatibile con Amazon Aurora PostgreSQL

Tools (Strumenti)

Servizi AWS

Altri strumenti

  • Oracle SQL Developer è un ambiente di sviluppo integrato che semplifica lo sviluppo e la gestione dei database Oracle nelle implementazioni tradizionali e basate sul cloud.

  • pgAdmin è uno strumento di gestione open source per PostgreSQL. Fornisce un'interfaccia grafica che consente di creare, gestire e utilizzare oggetti di database. In questo modello, pgAdmin si connette all'istanza del database RDS per PostgreSQL e interroga i dati. In alternativa, puoi usare il client da riga di comando psql.

Best practice

  • Verifica i limiti dei set di dati e gli scenari periferici.

  • Prendi in considerazione l'implementazione della gestione degli errori per le condizioni dell'indice fuori dai limiti.

  • Ottimizza le query per evitare la scansione di set di dati sparsi.

Epiche

OperazioneDescriptionCompetenze richieste

Crea un PL/SQL blocco sorgente in Oracle.

Crea un PL/SQL blocco sorgente in Oracle che utilizza il seguente array associativo:

DECLARE TYPE country_codes IS TABLE OF VARCHAR2(100) INDEX BY pls_integer; cc country_codes; cc_idx NUMBER := NULL; BEGIN cc(7) := 'India'; cc(3) := 'UK'; cc(5) := 'USA'; cc(0) := 'China'; cc(-2) := 'Invalid'; dbms_output.put_line('cc_length:' || cc.COUNT); IF (cc.COUNT > 0) THEN cc_idx := cc.FIRST; FOR i IN 1..cc.COUNT LOOP dbms_output.put_line('cc_idx:' || cc_idx || ' country:' || cc(cc_idx)); cc_idx := cc.next(cc_idx); END LOOP; END IF; END;
DBA

Esegui il PL/SQL blocco.

Esegui il PL/SQL blocco sorgente in Oracle. Se ci sono degli spazi tra i valori di indice di un array associativo, in tali spazi non viene memorizzato alcun dato. Ciò consente al ciclo Oracle di scorrere solo attraverso le posizioni dell'indice.

DBA

Esamina l'output.

Cinque elementi sono stati inseriti nell'array (cc) a intervalli non consecutivi. Il conteggio degli array è mostrato nel seguente output:

cc_length:5 cc_idx:-2 country:Invalid cc_idx:0 country:China cc_idx:3 country:UK cc_idx:5 country:USA cc_idx:7 country:India
DBA
OperazioneDescriptionCompetenze richieste

Crea un PL/pgSQL blocco di destinazione in PostgreSQL.

Crea un PL/pgSQL blocco di destinazione in PostgreSQL che utilizza il seguente array associativo:

DO $$ DECLARE cc character varying(100)[]; cc_idx integer := NULL; BEGIN cc[7] := 'India'; cc[3] := 'UK'; cc[5] := 'USA'; cc[0] := 'China'; cc[-2] := 'Invalid'; RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1); IF (ARRAY_LENGTH(cc, 1) > 0) THEN FOR i IN ARRAY_LOWER(cc, 1)..ARRAY_UPPER(cc, 1) LOOP RAISE NOTICE 'cc_idx:% country:%', i, cc[i]; END LOOP; END IF; END; $$;
DBA

Esegui il PL/pgSQL blocco.

Esegui il PL/pgSQL blocco di destinazione in PostgreSQL. Se ci sono degli spazi tra i valori dell'indice di un array associativo, nessun dato viene memorizzato in tali spazi. Ciò consente al ciclo PostgreSQL di iterare solo attraverso le posizioni dell'indice.

DBA

Esamina l'output.

La lunghezza dell'array è maggiore di 5 perché NULL è memorizzata negli spazi tra le posizioni dell'indice. Come mostrato nell'output seguente, il ciclo completa 10 iterazioni per recuperare 5 valori nell'array.

cc_length:10 cc_idx:-2 country:Invalid cc_idx:-1 country:<NULL> cc_idx:0 country:China cc_idx:1 country:<NULL> cc_idx:2 country:<NULL> cc_idx:3 country:UK cc_idx:4 country:<NULL> cc_idx:5 country:USA cc_idx:6 country:<NULL> cc_idx:7 country:India
DBA
OperazioneDescriptionCompetenze richieste

Crea un PL/pgSQL blocco di destinazione con un array e un tipo definito dall'utente.

Per ottimizzare le prestazioni e soddisfare le funzionalità di Oracle, possiamo creare un tipo definito dall'utente che memorizza sia le posizioni dell'indice che i dati corrispondenti. Questo approccio riduce le iterazioni non necessarie mantenendo associazioni dirette tra indici e valori.

DO $$ DECLARE cc country_codes[]; cc_append country_codes := NULL; i record; BEGIN cc_append.idx = 7; cc_append.val = 'India'; cc := array_append(cc, cc_append); cc_append.idx = 3; cc_append.val = 'UK'; cc := array_append(cc, cc_append); cc_append.idx = 5; cc_append.val = 'USA'; cc := array_append(cc, cc_append); cc_append.idx = 0; cc_append.val = 'China'; cc := array_append(cc, cc_append); cc_append.idx = - 2; cc_append.val = 'Invalid'; cc := array_append(cc, cc_append); RAISE NOTICE 'cc_length: %', ARRAY_LENGTH(cc, 1); IF (ARRAY_LENGTH(cc, 1) > 0) THEN FOR i IN ( SELECT * FROM unnest(cc) ORDER BY idx) LOOP RAISE NOTICE 'cc_idx:% country:%', i.idx, i.val; END LOOP; END IF; END; $$;
DBA

Esegui il PL/pgSQL blocco.

Esegui il PL/pgSQL blocco bersaglio. Se ci sono degli spazi tra i valori dell'indice di un array associativo, in tali spazi non viene memorizzato alcun dato. Ciò consente al ciclo PostgreSQL di iterare solo attraverso le posizioni dell'indice.

DBA

Esamina l'output.

Come illustrato nell'output seguente, il tipo definito dall'utente memorizza solo gli elementi di dati popolati, il che significa che la lunghezza dell'array corrisponde al numero di valori. Di conseguenza, LOOP le iterazioni sono ottimizzate per elaborare solo i dati esistenti, eliminando la necessità di tenere traccia delle posizioni vuote.

cc_length:5 cc_idx:-2 country:Invalid cc_idx:0 country:China cc_idx:3 country:UK cc_idx:5 country:USA cc_idx:7 country:India
DBA

Risoluzione dei problemi

ProblemaSoluzione

Errore di indice fuori dai limiti

  • Problema: ERROR: array subscript out of bounds quando si accede agli elementi dell'array

  • Causa: tentativo di accedere a una posizione di indice che non esiste nell'array di tipi definito dall'utente

È possibile convalidare l'esistenza dell'indice prima dell'accesso utilizzando un filtro di WHERE clausole sulla idx colonna quando si annulla l'array oppure è possibile implementare controlli dei limiti nel codice. PL/pgSQL

Gestione dei valori NULL

  • Problema: valori NULL imprevisti che compaiono nei risultati della query durante l'iterazione nell'array

  • Causa: gli elementi dell'array non sono inizializzati correttamente con entrambi i idx campi D prima dell'aggiunta val

Assicuratevi che entrambi i campi del tipo definito dall'utente siano compilati prima dell'uso. array_append() Aggiungi controlli NULL espliciti come segue: IF cc_append.val IS NOT NULL THEN cc := array_append(cc, cc_append); END IF;

Risorse correlate

AWS documentazione

Altra documentazione

Informazioni aggiuntive

Considerazioni sulle prestazioni

  • Questo approccio riduce il sovraccarico di iterazione del 50% o più per gli array sparsi rispetto agli array PostgreSQL nativi con segnaposti NULL.

  • L'efficienza dello storage migliora perché vengono archiviati solo i dati effettivi, non le posizioni di indice vuote.

Note sulla compatibilità

  • Questo modello mantiene la semantica sparsa degli array di Oracle mentre utilizza le funzionalità native degli array di PostgreSQL.

  • La soluzione è compatibile con tutte le versioni di PostgreSQL che supportano tipi compositi definiti dall'utente.