Le moyen le plus rapide pour faire de l'INSÈRE à l'aide de IBATIS
J'ai besoin d'insérer de 20 000 lignes dans une table unique (SQL Server 2005) à l'aide d'iBatis. Quel est le moyen le plus rapide de le faire ? Je suis déjà en mode batch, mais il ne m'aide pas beaucoup:
try {
sqlMap.startTransaction();
sqlMap.startBatch();
//... execute statements in between
sqlMap.commitTransaction();
} finally {
sqlMap.endTransaction();
}
OriginalL'auteur muriloq | 2008-11-13
Vous devez vous connecter pour publier un commentaire.
Sauf le gros chargeurs d'autres sont référence, nous allons réfléchir à la meilleure manière de le faire par le biais de SQL. (Et le gros chargeurs ne fonctionne pas bien si vous envoyez mélangés données de différentes tables.)
Tout d'abord, vous ne devriez pas l'utiliser quelle que soit la couche d'abstraction que vous utilisez, dans ce cas, iBatis, comme il efficace vous offrira que peu de valeur, mais que la couche d'abstraction ont certains (pas forcément beaucoup, mais certains) coût de l'UC. Vous devriez vraiment il suffit d'utiliser une base de données brutes de connexion.
Ensuite, vous devez envoyer un mess de l'INSERT. La question est de savoir si vous devez utiliser une simple chaîne de caractères pour la déclaration, (c'est à dire INSERT INTO TABLE1 VALUES('x','y', 12)) vs une déclaration préparée à l'avance (INSERT INTO TABLE1 values(?, ?, ?)).
Cela dépend de votre base de données et DB pilotes.
De la question avec l'aide d'une simple chaîne de caractères, est essentiellement le coût de la conversion d'un format interne (en supposant que vous êtes l'insertion de données Java) à la chaîne. La conversion d'un nombre ou une date en une Chaîne est en fait une assez cher de l'UC de l'opération. Certaines bases de données et les pilotes vont travailler avec les données binaires directement, plutôt que de simplement les données de la chaîne. Donc, dans ce cas, un PreparedStatement pourrait net de l'UC de l'épargne à risque de ne pas avoir à convertir les données.
L'inconvénient est que ce facteur varie en DB fournisseur, et peut-être même le fournisseur JDBC. Par exemple, Postgres (je crois) ne fonctionne qu'avec des chaînes SQL, plutôt que binaire, donc à l'aide d'un PreparedStatement est une perte par rapport à la simple construction de la chaîne de soi-même.
Ensuite, une fois que vous avez votre déclaration de type, vous voulez utiliser le addBatch() la méthode de l'JDBC Déclaration de la classe. Ce addBatch ne s'agit-il des groupes jusqu'les instructions SQL dans, eh bien, un lot. L'avantage est que, au lieu d'envoyer plusieurs requêtes à la base de données, vous pouvez envoyer une seule demande importante. Cela permet de réduire le trafic sur le réseau, et vous donnera des gains sensibles en termes de débit.
Le détail, c'est que tous les pilotes/les bases de données de soutien addBatch (au moins pas bien), mais aussi de la taille de votre lot est limité. Vous avez très probablement ne peut pas addBatch pour tous les de 20 000 lignes et espérer qu'il fonctionne, bien que ce serait le meilleur pari. Cette limite, aussi, peut varier en fonction de la base de données.
Pour Oracle, dans le passé, j'ai utilisé un tampon de 64 KO. Fondamentalement, j'ai écrit une fonction wrapper qui prendrait un littéral instruction INSERT, et de les accumuler dans des lots de 64 ko.
Donc, si vous voulez insérer des données en bloc par l'intermédiaire de SQL via JDBC, ce sont les façons de le faire. La grande amélioration est le mode Batch, la Déclaration vs PreparedStatement est plus à économiser de l'UC, et peut-être le trafic du réseau si votre pilote d'imprimante prend en charge un protocole binaire.
De Test, puis les rincer et répéter jusqu'à ce que vous êtes assez heureux.
OriginalL'auteur Will Hartung
Bien que ce n'est pas spécifique à votre serveur de base de données, j'ai déjà eu du succès en écrivant les lignes à un fichier au format csv, puis d'avoir la base de données de l'importation du fichier. Cela a été beaucoup plus rapide que des instructions insert, ou même un lot insérer.
OriginalL'auteur benPearce
Dans SQL Server, le jeun façon d'insérer des enregistrements dans le lot est à l'aide de BULK INSERT. Cependant, cette méthode charge les enregistrements à partir d'un fichier texte plutôt que directement à partir de votre application.
Il également ne pas prendre en compte le temps passé à créer le fichier. Vous pourriez avoir à peser si cela décale tout un gain de vitesse de l'insérer. Gardez à l'esprit que, même si c'est un peu plus lent dans l'ensemble, vous vous retrouverez monopoliser votre serveur de base de données pour moins de temps.
La seule autre chose que vous pouvez essayer est de l'insertion (mise en scène) le lot une tout autre tableau (pas d'index ni de quoi que ce soit). Déplacez ensuite le dossier de cette mise en scène d'un tableau à votre table cible et de la chute de la mise en scène de la table. Cela permettrait de déplacer les données vers le serveur en premier, de sorte que le dernier insérer pourrait tous se faire avec sql server lui-même. Mais encore une fois: c'est un processus en deux étapes, de sorte que vous aurez à compter le temps pour les deux étapes.
OriginalL'auteur Joel Coehoorn
Insertions sont faites à l'aide de la base de données est propre en vrac chargeur d'outils. Pour Oracle, SQL*Loader, par exemple. Souvent, ils sont plus rapide que tout ce que vous pourriez jamais écrire.
OriginalL'auteur S.Lott