Oracle
 sql >> Database >  >> RDS >> Oracle

Recupero di righe a velocità estremamente elevata

Supponendo che tu abbia già controllato le cose di rete di base come interfacce, firewall, proxy, così come anche gli elementi hardware del server DB.

Opzione 1 :

Invece di :

Class.forName("oracle.jdbc.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//xxx.xxx.xxx.xxx:1521/orcl", "user", "pass");

prova a usare :

OracleDataSource ods = new OracleDataSource();
java.util.Properties prop = new java.util.Properties();
prop.setProperty("MinLimit", "2");
prop.setProperty("MaxLimit", "10");
String url = "jdbc:oracle:oci8:@//xxx.xxx.xxx.xxx:1521/orcl";
ods.setURL(url);
ods.setUser("USER");
ods.setPassword("PWD");
ods.setConnectionCachingEnabled(true);
ods.setConnectionCacheProperties (prop);
ods.setConnectionCacheName("ImplicitCache01");

Maggiori dettagli qui

Opzione 2:Recupera

Come fortemente sottolineato da Stephen, il fetchsize sembra troppo grande.

E, per dimensioni di recupero di 500.000, qual è il tuo -Xms e -Xmx. Inoltre, nel profiler, qual è la dimensione dell'heap più alta?

Opzione 3:DB

  • Controlla gli indici e il piano di query per src_schema.big_table_view

  • È uno strumento o un sistema applicativo. Se fosse solo uno strumento, potresti aggiungere gradi paralleli, suggerimenti sull'indice, partizionamento ecc. in base alle capacità dei sistemi DB

Opzione 4:discussioni

n

Puoi iniziare n Thread di writer, ciascuno configurato per elaborare un determinato bucket, ad es. thread1 elabora da 0 a 10000, scrivendo su n file diversi e, una volta che tutti gli annunci sono stati completati, eseguire il post join, unire i file insieme preferibilmente utilizzando un comando del sistema operativo di basso livello.

Detto questo, tutto questo non dovrebbe mai essere un codice predefinito come adesso. 'n' e i bucket devono essere calcolati in fase di esecuzione. E creare un numero di thread in più rispetto a quello che supporta il tuo sistema è solo un errore.

Opzione 5 :

Invece di

select * from src_schema.big_table_view

Potresti usare

SELECT column1||CHR(9)||column2||CHR(9).....||columnN FROM src_schema.big_table_view

Questo evita di creare 500000 StringBuilders e Strings . (Supponendo che non siano coinvolte altre formattazioni complesse). CHR(9) è il carattere di tabulazione.

Opzione 6 :

Nel frattempo, puoi anche verificare con il tuo DBA eventuali problemi con il sistema DB e inviare una richiesta di assistenza con Supporto Oracle .