Oracle
 sql >> Base de données >  >> RDS >> Oracle

Extraction de lignes à très grande vitesse

En supposant que vous ayez déjà vérifié les éléments de base du réseau tels que les interfaces, les pare-feu, les proxys, ainsi que les éléments matériels du serveur de base de données.

Option 1 :

Au lieu de :

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

essayez d'utiliser :

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");

Plus de détails ici

Option 2 :Récupérer la taille

Comme l'a fortement souligné Stephen, la fetchsize semble trop grande.

Et, pour une taille de récupération de 500 000, quel est votre -Xms et -Xmx. De plus, dans le profileur, quelle est la taille de tas la plus élevée ?

Option 3 :BD

  • Vérifier les index et le plan de requête pour src_schema.big_table_view

  • Est-ce un outil ou un système d'application. S'il ne s'agit que d'un outil, vous pouvez ajouter des degrés parallèles, des indications d'index, un partitionnement, etc. en fonction des capacités du système de base de données

Option 4 :Fils

Dites n

Vous pouvez démarrer n Threads d'écrivain, chacun configuré pour traiter un certain compartiment, par ex. thread1 traite de 0 à 10000, écrivant dans n différents fichiers, et une fois toutes les annonces terminées, publiez la jointure, fusionnez les fichiers ensemble, de préférence à l'aide d'une commande de système d'exploitation de bas niveau.

Cela dit, tout cela ne devrait jamais être un code prédéfini comme c'est le cas maintenant. 'n' et les compartiments doivent être calculés au moment de l'exécution. Et créer un nombre de threads supérieur à ce que votre système prend en charge ne fait que foutre le bordel.

Option 5 :

Au lieu de

select * from src_schema.big_table_view

Vous pourriez utiliser

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

Cela évite de créer 500000 StringBuilders et Strings . (En supposant qu'aucun autre formatage complexe n'est impliqué). CHR(9) est le caractère de tabulation.

Option 6 :

En attendant, vous pouvez également vérifier auprès de votre administrateur de base de données tout problème lié au système de base de données et émettre une SR avec l'assistance Oracle .