2010-10-05 4 views
1

Éditer: l'exemple était mauvais, causé des réponses sans rapport avec la question. donné une grande requête de sélection, dans un programme simple comme:Objectif de fractionner une requête de sélection en blocs?

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,  
            ResultSet.CONCUR_READ_ONLY); 
ResultSet srs = stmt.executeQuery(
    "SELECT AGE FROM USERS"); 
while (srs.next()) { 
     ageStdDevAccumulator += Math.Pow(averageAge - srs.getInt("AGE"),2); 
} 
int ageStdDev= Math.Sqrt(ageStdDevAccumulator/userCount); 

Je comprends qu'une fois que le executeQuery est couru, puis toute la colonne des âges utilisateur est envoyé à partir de la base de données au programme. Est-ce correct? Cela peut-il provoquer un débordement de mémoire sur le serveur s'il y a trop d'utilisateurs dans la base de données? Si oui, il est alors possible de diviser la requête select en plus petits morceaux? Et si c'est le cas, il est possible de laisser un compilateur comprendre cela par lui-même? Merci, Un programmeur base de données-noob.

+3

Ceci est un parfait exemple de la façon de ne pas faire les choses - votre approche obtient la des lignes de la base de données et les parcourt un par un, ce qui met la base de données inutilement (rien ne débordera), mais une requête qui renvoie le résultat directement pourrait faire ce que vous voulez juste en regardant l'index (dans quelques E/S opérations) où votre approche nécessiterait f (n) opérations d'E/S, où n est le nombre de lignes. Même si vous n'avez pas d'index, l'approche de la requête va être beaucoup plus rapide. Donc, pas besoin de «diviser» la requête. En outre, le compilateur n'a aucune connaissance des données dans la base de données. – Unreason

+0

Donc chaque "getInt" déclenche une opération d'E/S? Le executeQuery fait seulement quelques opérations administratives, mais ne transfère aucune information d'âge réelle de la base de données au serveur? Donc, cela ne met pas du tout l'accent sur l'utilisation de la mémoire du serveur? – KeyboardDrummer

+0

@ user93197, je pense que c'est le 'srs.next()' qui effectue réellement l'opération IO - je m'attendrais 'srs.getInt' à lire à partir d'un tampon. En ce qui concerne l'utilisation de la mémoire sur le serveur - une requête qui renvoie une ligne comme réponse est susceptible d'utiliser beaucoup moins de mémoire de serveur qu'une requête qui renvoie l'ensemble de données entier. Il semble également que vous ayez déjà exécuté une requête précédente pour renvoyer 'averageAge' et' userCount' - sinon, où obtenez-vous ces valeurs? –

Répondre

6

Si je devais calculer la moyenne pour les utilisateurs, je ferais la requête simple suivante

SELECT AVG (AGE) des utilisateurs

Questions connexes