2010-12-14 7 views
0

Pourquoi les ensembles de résultats provenant de bases de données sont-ils si grands? Je reçois généralement des ensembles de résultats qui sont autour d'un million de lignes, dont chacune contient quelques chiffres, un varchar (75), un gros int ... peu importe. Probablement pas beaucoup plus de 100 octets par ligne. Et pourtant ça prend 6 Go! Est-ce un comportement typique? Ma pile est Postgres + JDBC + Spring - Je n'ai aucune expérience avec d'autres technologies.Pourquoi les ensembles de résultats sont-ils si grands?

+2

Vous devrez être beaucoup plus précis avec toute votre question pour que quelqu'un puisse vous donner une bonne réponse. Que signifie "quoi"? "Probablement" pas beaucoup plus que 100B/row? Faites les calculs et posez votre question. –

+2

Quelle est la raison pour laquelle vous copiez la totalité de la table DB dans la mémoire de Java? Il peut y avoir beaucoup de meilleures solutions pour ce que vous essayez d'accomplir. Par exemple, traitement en lots ou par ligne, ou affichage dans une vue paginée. – BalusC

+0

Comment mesurez-vous que "ça prend 6 Go"? –

Répondre

1

Nous allons avoir besoin de voir une requête pour voir pourquoi c'est si grand. Peut-être que vous ne rejoignez pas les tables correctement. (Je voudrais pouvoir commenter que ...)

+0

Félicitations! Vous pouvez maintenant commenter! :) –

+0

Yaaaaaay ~ C'est un peu frustrant de faire le tour du site à la recherche de boutons que je jure avoir déjà vus ... – Pimgd

+2

En dessous de 50 rep, commenter les messages des autres n'est possible que dans vos propres questions. – BalusC

2

Le java.sql.ResultSet lui-même aura typiquement seulement quelques douzaines de rangées de données tamponnées à tout moment (configurable).

Maintenant, si vous chargez toutes ces lignes en mémoire en tant qu'objets Java, vous verrez de grandes quantités de mémoire utilisées. Un String, par exemple, a deux octets par char, deux en-têtes d'objets, un décalage, deux longueurs et une valeur de hachage mise en cache. BigInteger est similaire. Tout cela s'additionne. Utilisez un profileur.

Vous pourriez avoir plus de chance avec un jeu de lignes en cache. Cela ou ne chargez pas l'ensemble des résultats à la fois.

Questions connexes