Bonjour à tous,
Je dois faire une requête sur une table Oracle de 165.000.000 de lignes, l'objectif étant de mesurer le temps mis par la requête (le résultat n'est pas important et n'est bien sur pas affiché).
Cela fonctionne si je fais un Select max(champ1) from source; car mon ResultSet ne me renvoie qu'une valeur mais je ne sais pas comment gérer une requête de type Select champ1 from source;.
Pour que ma requête soit effective et que le SGBD parcoure la table, je fais un resultset.last(); et j'ai une erreur de type java heap space (ou garbage collector overhead limit) à partir de 2.5 millions de lignes.
J'ai modifié les paramètres -Xms et -Xmx au niveau du fichier eclipse.ini ou dans les paramètres Java de Windows mais je suis très loin du compte.
Je voulais donc savoir si il était possible de vider (en partie ?) la mémoire qui se remplit lors d'un ResultSet ?
Sachant que c'est un curseur, j'ai l'impression qu'il enregistre en mémoire des informations dès que je le bouge et, dès lors, j'imagine qu'il est possible de vider cette mémoire.
J'ai modifié la valeur du Fetch (100, 500, 1000) ce qui modifie les quantités de données que gère le driver mais cela ne résout pas mon problème.
Souhaitant avoir le résultat exact de la requête, je ne peux pas "découper" celle-ci en plusieurs sous-requêtes (de 0 à 2 millions, de 2 à 4 millions, ...)
Code de création du Resultset :
Merci de votre aide !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 PreparedStatement ps=conn.prepareStatement(request, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ... ResultSet rs = ps.executeQuery(); ... rs.last();
(Je suis débutant en Java, merci de pardonner des erreurs ou des oublis de ma part)
Partager