-
grand nombre d'insert
Bonjour,
Je developpe actuellement une application (java) qui réalise un grand nombre d'insert: environ 2 millions par jour.
D'ou ma question, comment améliorer la vitesse des insert, est ce que je peux faire qqch au niveau de mon code ou le dba est il le seul a pouvoir faire qqch?
J'ai remarqué que l'utilisation de séquence ralentisé les inserts. Existe-il un autre moyen de génerer une clef unique si on souhaite pouvoir faire des inserts parallèles?
J'utilise actuellement oracle 9.
Merci d'avance pour votre aide
Coyote.
-
la séquence est le moyen le plus rapide de générer une nombre unique. En revanche tu peux réduire le nombre de contraintes (les foreign keys par exemple) et supprimer les indexes de la table pour gagner du temps MAIS les indexes accélèrent la lecture donc il faut les recréer et les foreign keys sont garantes de l'intégrité des données c'est donc pas anodin de les désactiver ;)
-
Il n'y a pas de moyen plus rapide de générer une clé unique.
Tu peux éventuellement mettre l'option cache ou l'agrandir sur ta séquence.
Si ton tablespace est en LMT avec ASSM c'est ok. Sinon tu peux essayer d'augmenter le nb de freelist sur ta table.
Laly.
-
J'ai augmenté la taille du cache mais l'effet semble limité (il n'y a pas de différences entre un cache de 100 et un cache de 1000 :? ).
A mon boulot on m'a parler d'outils permettant de faire des insertions massive de données?
Connaissez vous ces outils et est il possible de les utiliser depuis un programme java ?
-
Je te donne une astuce : si tu peux, groupe tes inserts. Si tu peux balancer par paquet de 1000 inserts, tu réduiras tes temps par 100 (environ).
Par contre tu perds la gestion ligne à ligne, cad que tu sauras qu'un Insert aura été rejeté, mais pas lequel.
-
ces outils font également des inserts, je vois mal comment ils pourraient être plus rapide :?
-
La question peut sembler idiote mais qu'appel tu des "groupes d'insert"?
Est-ce que ce sont des inserts que tu commit ensemble ou une commande insert qui fait plusieurs insert d'un seul coup ?
-
la question est : "est-ce possible en Java ?".
Renseigne toi mais il doit être possible de balancer plusieurs insert en un seul statement. Donc au lieu d'écrire un insert dans ton programme, de l'envoyer à la BDD, d'attendre la réponse, puis de continuer, tu dois pouvoir grouper tes inserts et ainsi gagner énormément de temps à la soumission des statements.
Les outils qui font ça sont des ETL (par exemple) et ils font bien la différence entre Insert par paquets et Insert Single. Et au niveau temps c'est du 1%.
-
J'utilise hibernate pour tous ce qui est persistence.
Penses tu qu'en créant une transaction pour faire mes inserts et donc en commitant les inserts seulement à la fin de la transaction je vais augmenter les performances?
-
oui, un seul commit va faire gagner du temps :)
-
Ok merci pour votre aide je vais essayer tous ça :)
-
Au niveau ETL ce qu'on essaye de faire c'est de grouper les inserts par paquets de n et de commiter soit tous les 5/10 n, soit de commiter à la fin de la procédure (dangereux cependant).