7
votes

Comment charger 1 million d'enregistrements de la base de données rapidement?

Maintenant, nous avons une base de données Firebird avec 1.000.000 qui doivent être traitées après toutes les personnes chargées dans la mémoire RAM. Pour obtenir tous ceux-ci, nous devons extraire des données en utilisant (sélectionnez * premier 1000 ...) pendant 8 heures. Quelle est la solution pour cela?


17 commentaires

Quelle est la taille de la table? Êtes-vous sûr que votre mémoire peut contenir cela?


On dirait comme un travail pour ... La base de données la plus rapide du monde !


Un million d'enregistrements doivent être chargés en quelques secondes à moins que ce ne soient vraiment énormes dossiers. Comment les chargez-vous? quelle plateforme utilisez-vous?


La base de données a 450m et oui a une mémoire suffisante mais pas assez de vitesse.


34 enregistrements est-il une seconde normale avec Firebird? Les enregistrements sont-ils anormalement grands / nombreux champs? Cela semble extraordinairement lent à moi.


En fait, 1 million de lignes ne sont rien pour la base de données pour charger ...


Qu'est-ce que SGBD? Avez-vous été en mesure d'établir la cause du goulot d'étranglement? Quel est le facteur contraignant? Vitesse de disque, vitesse de la mémoire?


Ainsi, pour charger les données d'une table avec 1.000.000 lignes en C # à l'aide d'un DB Firebird, prend un Pentium 4 3GHz au moins 8 heures.


Définissez la phrase «chargée dans la mémoire RAM». Est-ce que vous chargez dans une sorte de collection? Votre problème de performance pourrait être là au lieu de la date de lecture de la base de données.


Poster le code complet de votre boucle


FBCOMMAND CMD = Nouveau FBCOMMAND ("Sélectionnez le champ1, le champ2 du tableau A", la connexion); en utilisant (fbdatareader r = cmd.executereader ()) {tandis que (lecture.read (Liread ()) // Cette lecture rendez le transfert de DataFrom DB, je pense que cela est le problème {int A = lecture.geint32 (0); int b = lecture.get32 (1); myList.add (nouveau DTO (A, B)); } C'est une boucle normale, rien de spécial à ce sujet. Le transfert de données est le problème à mon avis.


Comparez avec ce ibsurgeon.com/articles/item104


Pouvez-vous donner la structure de la base de données? Je vais le tester dans ma machine


Créez simplement une table avec 10 champs. Demain, je vais mettre le code de test de stress ici. Créer une table de table (ID INTEGER par défaut 0 NON NULL, ID1 INTEGER NON NULL, Field1 TimeStamp NON NULL, Field2 Bigint, Field3 Integer, Field4 Varchar (32), Field5 Integer, Field6 Bigint Par défaut -1, Field7 Integer Not Null, Field8 Integer Par défaut 0, field9 Smallint par défaut 0 Not NULL, Field0 Smallint Par défaut 0 Non NULL, Field11 Smallint Par défaut 0 Non NULL);


Je pense que vous faites quelque chose de mal ... Quand je vois des modèles comme celui-ci, cela signifie généralement que le programmeur / architecte ne comprend pas complètement comment utiliser une base de données dans leur conception.


Besoin de plus d'informations comme indiqué ci-dessus.


Avez-vous résolu le problème?


5 Réponses :


0
votes

Quel type de traitement avez-vous besoin de faire pour les charger en mémoire et non seulement les traiter via des relevés SQL?

Il y a deux techniques que j'utilise ce travail en fonction de ce que j'essaie de faire.

  1. en supposant qu'il existe une sorte de clé artificielle (identité), de travailler en lots, d'incrémenter la dernière valeur d'identité traitée.

  2. BCP Les données dans un fichier texte, évacuez-le dans les mises à jour, puis bcp le reculez, rappelez-vous pour désactiver les contraintes et les index avant l'étape.


1 commentaires

Nous faisons une analyse de chaque DB, et nous devons les faire charger en mémoire. Le goulot d'étranglement est le moment où nous transférons des données de l'enregistrement défini sur nos objets DTO.



0
votes

Jetez un coup d'œil à ceci: http://www.firebirdfaq.org/faq13/


1 commentaires

Rien pour m'aider à ce lien, peut-être que ce problème est rencontré sur toutes les bases de données.Je besoin d'optimiser l'heure de "alors que (lecture.read ())".



4
votes

Est-ce que chacun de votre "SELECT * 1000" (comme vous l'avez décrit) fait une numérisation de table complète? Regardez ces questions et assurez-vous qu'ils utilisent un index.


1 commentaires

Pas la vitesse de sélection est le problème. Le transfert de données de Sélectionnez Enregistrer sur la mémoire, le moment (lecture.read (Lire ()) est à long ...



1
votes

charger des données d'une table avec 1.000.000 rangées en C # à l'aide d'un DB Firebird prend un Pentium 4 3GHz au moins 8 heures

Tout le monde suppose que vous exécutez une requête SQL pour sélectionner les enregistrements de la base de données quelque chose comme xxx

parce que cela prendrait vraiment quelques secondes. Eh bien, un peu plus longtemps pour l'afficher sur un écran, mais l'exécution de la sélection réelle doit être rapide.

mais cette référence à C # me fait penser que vous faites autre chose. Peut-être que vous avez vraiment une boucle RBAR instanciant d'un million d'objets. Je peux voir comment cela pourrait prendre un peu plus longtemps. Mais même si, huit heures? Où va le temps?

EDIT

Mon hypothèse était juste et vous instanciez 1000000 objets dans une boucle. Le bon conseil serait de trouver une autre façon de faire tout ce que vous faites une fois que vous avez tous vos objets en mémoire. Sans en savoir plus sur les détails, il est difficile de donner des détails. Mais il semble improbable que ce soit une interface utilisateur - quel utilisateur va parcourir un million d'objets?

Une observation générale devra suffire: utiliser des opérations en vrac pour mettre en œuvre une activité en vrac . Les bases de données SQL excellent sur des ensembles de manipulation. Tirer parti de la puissance de SQL pour traiter vos millions de lignes dans un seul ensemble, plutôt que comme des lignes individuelles.

Si vous ne trouvez pas cette réponse utile, vous devez nous donner plus de détails concernant le besoin que vous voulez essayer d'atteindre.


2 commentaires

Notre processus est exécuté une fois par mois max dans le pire des cas. Et oui, nous chargons toutes les données de la table dans une grande boucle unique. Cette boucle est notre goulot d'étranglement. Pendant un instant, je pensais à faire des clones de la DB et à exécuter des requêtes parallèles pour charger des données plus rapidement.


Eh bien, vous ne chargez jamais de records dans une boucle lorsque vous en avez beaucoup. C'est la base de données 101. Je ne connais pas la prise de données, mais la plupart des informations de base de données à l'aide de la sélection dans l'insert comme insert Table2 (champ1, champ2) Sélectionnez Field1, champ2 à partir de table1 qui serait beaucoup plus rapide qu'une ligne à la fois.



1
votes

Combien de temps faut-il pour construire l'objet DTO que vous créez avec chaque lecture de données? XXX

Vous créez un million de ces objets. S'il faut 29 millisecondes pour créer un objet DTO, cela va prendre plus de 8 heures à compléter.


0 commentaires