Domanda

Sto scrivendo una conversione di dati in PL / SQL che elabora i dati e li carica in una tabella. Secondo il profiler PL / SQL, una delle parti più lente della conversione è l'inserimento effettivo nella tabella di destinazione. La tabella ha un singolo indice.

Per preparare i dati per il caricamento, popolo una variabile usando il tipo di riga della tabella, quindi la inserisco nella tabella in questo modo:

  

inserisce nei valori mytable r_myRow;

Sembra che potrei ottenere prestazioni facendo quanto segue:

  • Disattiva la registrazione durante l'inserimento
  • Inserisci più record contemporaneamente

Sono consigliati questi metodi? In tal caso, qual è la sintassi?

È stato utile?

Soluzione

È molto meglio inserire alcune centinaia di righe alla volta, utilizzando le tabelle PL / SQL e FORALL per eseguire il binding nell'istruzione insert. Per dettagli al riguardo vedi qui .

Fai anche attenzione a come costruisci le tabelle PL / SQL. Se possibile, preferisci invece effettuare tutte le tue trasformazioni direttamente in SQL usando " INSERT INTO t1 SELECT ... " poiché le operazioni riga per riga in PL / SQL saranno ancora più lente di SQL.

In entrambi i casi, è anche possibile utilizzare inserimenti di percorso diretto utilizzando INSERT / * + APPEND * / , che sostanzialmente ignora la cache del DB e alloca e scrive direttamente nuovi blocchi nei file di dati. Ciò può anche ridurre la quantità di registrazione, a seconda di come la si utilizza. Ciò ha anche alcune implicazioni, quindi leggi bene manuale prima.

Infine, se si sta troncando e ricostruendo la tabella, potrebbe essere utile eliminare prima (o contrassegnare inutilizzabile) e successivamente ricostruire gli indici.

Altri suggerimenti

Le istruzioni di inserimento regolari sono il modo più lento per ottenere dati in una tabella e non sono pensate per inserimenti di massa. Il seguente articolo fa riferimento a molte tecniche diverse per migliorare le prestazioni: http: //www.dba-oracle .com / oracle_tips_data_load.htm

Se la caduta dell'indice non velocizza abbastanza le cose, è necessario il Oracle SQL * Loader :

http://www.oracle.com/technology /products/database/utilities/htdocs/sql_loader_overview.html

Supponi di aver preso eid, ename, sal, lavoro. Quindi crea una tabella prima come:

SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10));

Ora inserisci i dati: -

SQL>insert into tablename values(&eid,'&ename',&sal,'&job');

Rilasciare l'indice, quindi inserire le righe, quindi ricreare l'indice.

Controlla questo link http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm

  1. punti principali da considerare per il tuo il caso è usare il suggerimento Append come questo verrà aggiunto direttamente alla tabella invece di utilizzare l'elenco libero. Se puoi permetterti di disattivare la registrazione, allora usa append con un suggerimento nologging per farlo
  2. Utilizzare un inserimento in blocco invece di iterare in PL / SQL
  3. Utilizza sqlloaded per caricare i dati direttamente nella tabella se ricevi dati da un feed di file

Forse una delle migliori opzioni è quella di evitare Oracle il più possibile in realtà. Sono stato sconcertato da me stesso, ma molto spesso un processo Java può superare molte delle utility di Oracle che utilizzano OCI (leggi: SQL Plus) o impiegheranno molto del tuo tempo per ottenere il giusto (leggi: SQL * Loader ).

Questo non ti impedisce di usare suggerimenti specifici (come / APPEND /).

Sono stato piacevolmente sorpreso ogni volta che mi sono rivolto a quel tipo di soluzione.

Saluti,

Rollo

Ecco i miei consigli sull'inserimento rapido.

Trigger: disabilita tutti i trigger associati a una tabella. Abilita dopo il completamento degli inserti.

Indice: rilasciare l'indice e ricrearlo al termine degli inserti.

Statistiche non aggiornate - Analizza nuovamente le statistiche di tabella e indice.

De-frammentazione dell'indice: ricostruire l'indice se necessario Utilizzare Nessuna registrazione -Inserire utilizzando INSERT APPEND (solo Oracle). Questo approccio è molto rischioso, non vengono generati registri di ripetizione, pertanto non è possibile eseguire un rollback: eseguire un backup della tabella prima di iniziare e non provare le tabelle live. Controlla se il tuo db ha un'opzione simile

Inserimento parallelo: l'esecuzione dell'inserimento parallelo renderà il lavoro più veloce.

Usa Bulk Insert Vincoli: non ci sono molte spese generali durante gli inserti, ma è comunque una buona idea controllare se è ancora lento anche dopo il passaggio 1

Puoi saperne di più su http://www.dbarepublic.com/2014 /04/slow-insert.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top