faire un loaddata de mise à jour

7 réponses
Avatar
Pif
Bonjour...

J'ai un programme qui cr=E9e une m=E9moire tampon et qui au bout d'un
moment veut la vider... il s'agit de triplets (a1, a2, val) d'entiers
pour simplifier... et pour le cot=E9 pas simple, ils sont de l'ordre de
plusieurs centaines de milliers...

Quand mon ptit prog java fait ca en JDBC, il aime pas les 1000000
insert successifs... pire, quand ce sont des updates ou je veux
ajouter =E0 la 3ieme valeur du triplet la nouvelle valeur...

Du coup, je cherche un moyen de faire ca vite et je me pose la
question suivante :

- est il possible de passer par un fichier, et faire une sorte de
loaddata qui est tr=E8s rapide en pr=E9cisant que :
- si (a1,a2) est pr=E9sent, alors il faut ajouter la nouvelle valeur
- si le couple est absent il faut ajouter le triplet avec la meme
valeur....

- sinon, en faisant un loaddata de ce fichier dans une table
temporaire et en rajoutant des updates, pensez vous que je vais y
gagner du temps ?

- avez vous d'autres suggestions ?

sinon, quand je fais des d=E9l=E9tions de tuples, c'est plutot lent... des
id=E9es autre que d=E9sactiver les index ?

Merci !

NB : je suis sous MySQL, mais si la solution pouvait =EAtre portable =E0
PG module quelques diff=E9rences de codes uniquement, ca serait un
plus ...

7 réponses

Avatar
mordicus
Pif wrote:

Bonjour...

J'ai un programme qui crée une mémoire tampon et qui au bout d'un
moment veut la vider... il s'agit de triplets (a1, a2, val) d'entiers
pour simplifier... et pour le coté pas simple, ils sont de l'ordre de
plusieurs centaines de milliers...

Quand mon ptit prog java fait ca en JDBC, il aime pas les 1000000
insert successifs... pire, quand ce sont des updates ou je veux
ajouter à la 3ieme valeur du triplet la nouvelle valeur...

Du coup, je cherche un moyen de faire ca vite et je me pose la
question suivante :

- est il possible de passer par un fichier, et faire une sorte de
loaddata qui est très rapide en précisant que :
- si (a1,a2) est présent, alors il faut ajouter la nouvelle valeur
- si le couple est absent il faut ajouter le triplet avec la meme
valeur....

- sinon, en faisant un loaddata de ce fichier dans une table
temporaire et en rajoutant des updates, pensez vous que je vais y
gagner du temps ?

- avez vous d'autres suggestions ?

sinon, quand je fais des délétions de tuples, c'est plutot lent... des
idées autre que désactiver les index ?

Merci !

NB : je suis sous MySQL, mais si la solution pouvait être portable à
PG module quelques différences de codes uniquement, ca serait un
plus ...



Salut,

Il faudrait peut être un peu plus d'infos...

a1 et a2 c'est quoi ? des integer ? des varchar ou plutôt char(quelque
chose) ?
de meme pour val

Cela prends combien de temps avec MySQL ?
Avatar
mordicus
Je viens de faire un petit test avec derby (puisque on en parlait il y a
quelque temps)

drop table test;

create table test (
a1 integer,
a2 integer,
val varchar(128)
);

create unique index test_index on test(a1,a2);

Pour 100 000 insert, 13 secondes pour la connexion, les inserts et le
shutdown de la base.

a+
Avatar
Pif
mordicus a écrit :

a1 et a2 c'est quoi ? des integer ? des varchar ou plutôt char(quelque
chose) ?



des entiers qui sont les extremités de mes aretes (identifiants pour
lesquels je n'ai cependant pas défini de contrainte foreign key...).

de meme pour val



va c'est une valeur entière.... ce que je représente, c'est des coupes
entier - valeur...


Cela prends combien de temps avec MySQL ?



j'avais calculé qu'en localhost je fesais dans les 2000 modifications
par seconde... je sais qu'un fichier que aller 10 à 100 fois plus vite
pour un chargement de table...

Avatar
Pif
ma table peut compter de l'ordre de 100 000 000 de tuples... donc les
inserts sont plus longs (index plus gros... )

mordicus a écrit :
Je viens de faire un petit test avec derby (puisque on en parlait il y a
quelque temps)

drop table test;

create table test (
a1 integer,
a2 integer,
val varchar(128)
);

create unique index test_index on test(a1,a2);

Pour 100 000 insert, 13 secondes pour la connexion, les inserts et le
shutdown de la base.

a+

Avatar
Pif
saurais tu me donner le titre du fil ?
Je connaissais pas tous ces systèmes, ou ne soupçonnait pas de telles
différences de perfs...

As-tu sinon des refs vers des benchmarks ou des comparatifs ? Il
semble que derby et berkeley DB soient les alternatives les plus
intéressantes en Java et Open Source ?

Sais tu si pour Oracle Berkeley DB on peut utiliser la même syntaxe
SQL ? Peux-t-on utiliser les memes outils de génie logiciel ? La
syntaxe de derby est elle assez standard ? (proche de PG, MySQL ou
Oracle par exemple ? )

Merci.

On 7 fév, 20:11, mordicus wrote:
Jderby (puisque on en parlait il y a quelque temps)
Avatar
mordicus
Pif wrote:

saurais tu me donner le titre du fil ?



Houlala, c'est vieux, mais tu me l'avais demander a l'époque, j'avais eu la
flemme de tester :)

Je connaissais pas tous ces systèmes, ou ne soupçonnait pas de telles
différences de perfs...
As-tu sinon des refs vers des benchmarks ou des comparatifs ? Il
semble que derby et berkeley DB soient les alternatives les plus
intéressantes en Java et Open Source ?



Oui, c'est le cas.
Pour les benchs, je crois que j'ai vu passer ça quelque part, je vais
essayer de retrouver, BDB etant plus rapide que derby, mais il n'utilise
pas le langage SQL.

Sais tu si pour Oracle Berkeley DB on peut utiliser la même syntaxe
SQL ?



Non, BDB c'est key->value, pas de sql et tout ce qui va avec...

Peux-t-on utiliser les memes outils de génie logiciel ? La
syntaxe de derby est elle assez standard ? (proche de PG, MySQL ou
Oracle par exemple ? )




La syntaxe de derby est standard, de plus, très proche de DB2, le but d'IBM
a l'époque étant de facilité la migration vers DB2. Je l'utilise souvent
comme alternatif à Oracle ou Postgresql quand j'ai besoin d'une base
embarqué, rapide et que je peux attaquer avec Jdbc .

a+
Avatar
Pif
mordicus a écrit :
Pif wrote:

Non, BDB c'est key->value, pas de sql et tout ce qui va avec...



peut on quand meme utiliser de multiples clés pour accéder ?
Meme un tit jointure c'est po possible ? :(

La syntaxe de derby est standard, de plus, très proche de DB2, le but d'IBM
a l'époque étant de facilité la migration vers DB2. Je l'utilise souvent
comme alternatif à Oracle ou Postgresql quand j'ai besoin d'une base
embarqué, rapide et que je peux attaquer avec Jdbc .



et sqllite, tout le monde en dit du bien en effet ?
et tu as des infos sur hsqlddb ? il semble souvent considéré comme très
rapide et il est par ailleurs utilisé par beaucoup de middleware de
persistance en java.. ?

merci pour les infos...


a+