2012-01-01 14 views
5

Ho 471 file per un totale di circa 100 GB. I file sono "\ t" separata, con i dati delle transazioni nel seguente formato:Oracle 11gR2 che carica più file: sqlldr o tabelle esterne?

char(10) not null, 
char(8) not null, 
char(1) not null, 
char(4) not null, 
number not null, 
char(1) not null, 
char(1) not null, 
char(1) not null, 
number not null 

L'ordine delle operazioni nei file è importante e deve essere preservato, idealmente con un id chiave primaria. Inizialmente, ho caricato questi file con sqlldr ma ci vuole molto tempo. Recentemente ho imparato a conoscere i tavoli esterni. Da una prospettiva strategica, quale metodo è migliore? Come funziona il tavolo esterno? Grazie.

+1

* Come funziona la tabella esterna * Questo è completamente documentato nel manuale: http://docs.oracle.com/cd/E11882_01/server.112/e22490/et_concepts.htm –

+0

perché sqlldr richiederebbe molto tempo? Prova il carico diretto e assicurati che i tuoi dati siano sulla stessa sottorete locale o SAN (o fondamentalmente, non spinga i dati attraverso piccoli tubi attraverso la rete, come un server in NJ che preme su un db in CA). Alcune restrizioni per il carico diretto, ma MOLTO più veloce. – tbone

+1

Ho calcolato che sqlldr sta caricando ad una velocità di 85 milioni di righe all'ora. Basato sul parlare con un ragazzo, questo sembra ragionevole, ma non è un esperto. C'è un commit ogni 300k righe. Una sequenza oracle genera una chiave primaria sull'inserto. L'ordine dei dati è importante e la chiave conserva l'ordine. I file si trovano su un'unità sullo stesso server del database. Si può ottenere un tasso migliore? –

risposta

3

L'analisi dei record di tabelle esterne e SQL * Loader è molto simile, quindi normalmente non c'è una differenza di prestazioni importante nello stesso formato di registrazione. Tuttavia, tabelle esterne possono essere più appropriato nelle seguenti situazioni:

  • Si vuole trasformare i dati mentre viene caricato nel database.
  • Si desidera caricare i dati e è necessaria un'indicizzazione aggiuntiva della tabella di staging.
  • Si desidera utilizzare l'elaborazione parallela trasparente senza dover dividere prima i dati esterni.

Tuttavia, nelle seguenti situazioni, utilizzare SQL * Loader per la migliore esecuzione del carico:

  • si desidera caricare i dati in remoto.
  • Le trasformazioni non sono richieste sui dati e non è necessario caricare i dati in parallelo.

Per migliorare le prestazioni di SQL * Loader sono stati forniti i seguenti suggerimenti.

  • non hanno alcun indici e/o vincoli (chiavi primarie) sul carico tabelle durante il processo di caricamento
  • Aggiungere la seguente opzione nella riga di comando: DIRETTA = TRUE. Ciò sostituirà la maggior parte dell'elaborazione RDBMS utilizzando il caricatore di percorsi diretto anziché il caricatore di percorsi convenzionale. Tuttavia, ci sono alcuni casi quando non è possibile utilizzare il carico diretto. Queste restrizioni possono essere ottenute dal Oracle Server Utilities Guide
  • Utilizzare dati a larghezza fissa anziché dati delimitati. Per i dati delimitati, ogni atto deve essere scansionata per il delimitatore
  • cercare di evitare conversioni tra l'insieme di caratteri come conversioni sono sia tempo CPU intensiva
  • per via convenzionale, utilizzare i parametri ReadSize e BINDSIZE.
    READSIZE catturerà più blocchi di dati per chiamata di sistema di lettura. Il parametro BINDSIZE specifica la dimensione dell'array bind, che a sua volta specifica il numero di righe che verrà caricato per lotto

Fonte:? http://download.oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/sql_loader_faq.pdf

+0

funziona in entrambi i casi. –

+0

Questo sarebbe stato +1 ma per "utilizzare dati di larghezza fissa". Nessuno ha chiesto se il loro cliente è stato risolto con sicurezza? – Ben

+0

@FlorinGhita Hai ragione, non sono sicuro del motivo per cui Oracle avrebbe inserito questo nella loro documentazione ... –