Salut.
j'ai un petit soucis.
J'enregistre des mails dans une base de données.
J'ai donc une table toute simple
CREATE TABLE "mail" (
"idmail" serial NOT NULL,
"idmailfolder" integer,
"idparent" integer,
"from_name" text,
"from_mail" text,
"date" timestamp without time zone DEFAULT now(),
"subject" text,
"body" text,
PRIMARY key (idmail),
FOREIGN key (idmailfolder) REFERENCES mailfolder (idobject),
FOREIGN key (idparent) REFERENCES mail (idmail)
);
l'insertion se fait sans problème a une vitesse acceptable.
par contre la suppression c'est une autre affaire
explain analyze DELETE FROM MAIL WHERE idmail = 49233;
---------------------------------------------------------------------
Index Scan using mail_pkey on mail (cost=0.00..8.28 rows=1 width=6)
(actual time=0.039..0.052 rows=1 loops=1)
Index Cond: (idmail = 49233)
Trigger for constraint mail_idparent_fkey: time5.368 calls=1
Trigger for constraint mailattach_idmail_fkey: time=4.449 calls=1
Total runtime: 169.915 ms
On voit que le contrôl sur l'idparent prend quasiment tout le temps du
DELETE.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
pour info idparent vaut toujours NULL dans tout mes mails (pour le moment)
alors on se doute que si la suppression de 1 mail prend 1/10eme de
seconde. je vous raconte pas la suppression de 1000 mails !!!
Que faire ?
Salut.
j'ai un petit soucis.
J'enregistre des mails dans une base de données.
J'ai donc une table toute simple
CREATE TABLE "mail" (
"idmail" serial NOT NULL,
"idmailfolder" integer,
"idparent" integer,
"from_name" text,
"from_mail" text,
"date" timestamp without time zone DEFAULT now(),
"subject" text,
"body" text,
PRIMARY key (idmail),
FOREIGN key (idmailfolder) REFERENCES mailfolder (idobject),
FOREIGN key (idparent) REFERENCES mail (idmail)
);
l'insertion se fait sans problème a une vitesse acceptable.
par contre la suppression c'est une autre affaire
explain analyze DELETE FROM MAIL WHERE idmail = 49233;
---------------------------------------------------------------------
Index Scan using mail_pkey on mail (cost=0.00..8.28 rows=1 width=6)
(actual time=0.039..0.052 rows=1 loops=1)
Index Cond: (idmail = 49233)
Trigger for constraint mail_idparent_fkey: time5.368 calls=1
Trigger for constraint mailattach_idmail_fkey: time=4.449 calls=1
Total runtime: 169.915 ms
On voit que le contrôl sur l'idparent prend quasiment tout le temps du
DELETE.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
pour info idparent vaut toujours NULL dans tout mes mails (pour le moment)
alors on se doute que si la suppression de 1 mail prend 1/10eme de
seconde. je vous raconte pas la suppression de 1000 mails !!!
Que faire ?
Salut.
j'ai un petit soucis.
J'enregistre des mails dans une base de données.
J'ai donc une table toute simple
CREATE TABLE "mail" (
"idmail" serial NOT NULL,
"idmailfolder" integer,
"idparent" integer,
"from_name" text,
"from_mail" text,
"date" timestamp without time zone DEFAULT now(),
"subject" text,
"body" text,
PRIMARY key (idmail),
FOREIGN key (idmailfolder) REFERENCES mailfolder (idobject),
FOREIGN key (idparent) REFERENCES mail (idmail)
);
l'insertion se fait sans problème a une vitesse acceptable.
par contre la suppression c'est une autre affaire
explain analyze DELETE FROM MAIL WHERE idmail = 49233;
---------------------------------------------------------------------
Index Scan using mail_pkey on mail (cost=0.00..8.28 rows=1 width=6)
(actual time=0.039..0.052 rows=1 loops=1)
Index Cond: (idmail = 49233)
Trigger for constraint mail_idparent_fkey: time5.368 calls=1
Trigger for constraint mailattach_idmail_fkey: time=4.449 calls=1
Total runtime: 169.915 ms
On voit que le contrôl sur l'idparent prend quasiment tout le temps du
DELETE.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
pour info idparent vaut toujours NULL dans tout mes mails (pour le moment)
alors on se doute que si la suppression de 1 mail prend 1/10eme de
seconde. je vous raconte pas la suppression de 1000 mails !!!
Que faire ?
Le 01/07/2010 14:42, Etienne a écrit :Salut.
j'ai un petit soucis.
J'enregistre des mails dans une base de données.
J'ai donc une table toute simple
CREATE TABLE "mail" (
"idmail" serial NOT NULL,
"idmailfolder" integer,
"idparent" integer,
"from_name" text,
"from_mail" text,
"date" timestamp without time zone DEFAULT now(),
"subject" text,
"body" text,
PRIMARY key (idmail),
FOREIGN key (idmailfolder) REFERENCES mailfolder (idobject),
FOREIGN key (idparent) REFERENCES mail (idmail)
);
l'insertion se fait sans problème a une vitesse acceptable.
par contre la suppression c'est une autre affaire
explain analyze DELETE FROM MAIL WHERE idmail = 49233;
---------------------------------------------------------------------
Index Scan using mail_pkey on mail (cost=0.00..8.28 rows=1 width=6)
(actual time=0.039..0.052 rows=1 loops=1)
Index Cond: (idmail = 49233)
Trigger for constraint mail_idparent_fkey: time5.368 calls=1
Trigger for constraint mailattach_idmail_fkey: time=4.449 calls=1
Total runtime: 169.915 ms
On voit que le contrôl sur l'idparent prend quasiment tout le temps du
DELETE.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
pour info idparent vaut toujours NULL dans tout mes mails (pour le
moment)
alors on se doute que si la suppression de 1 mail prend 1/10eme de
seconde. je vous raconte pas la suppression de 1000 mails !!!
Que faire ?
tu as des clefs étrangères donc supprimer un email veut aussi dire aller
supprimer des enregistrements liés. Après, dans le cadre de
transactions, tu ne multiplies par le temps par 100 pour 100
enregistrements
Le 01/07/2010 14:42, Etienne a écrit :
Salut.
j'ai un petit soucis.
J'enregistre des mails dans une base de données.
J'ai donc une table toute simple
CREATE TABLE "mail" (
"idmail" serial NOT NULL,
"idmailfolder" integer,
"idparent" integer,
"from_name" text,
"from_mail" text,
"date" timestamp without time zone DEFAULT now(),
"subject" text,
"body" text,
PRIMARY key (idmail),
FOREIGN key (idmailfolder) REFERENCES mailfolder (idobject),
FOREIGN key (idparent) REFERENCES mail (idmail)
);
l'insertion se fait sans problème a une vitesse acceptable.
par contre la suppression c'est une autre affaire
explain analyze DELETE FROM MAIL WHERE idmail = 49233;
---------------------------------------------------------------------
Index Scan using mail_pkey on mail (cost=0.00..8.28 rows=1 width=6)
(actual time=0.039..0.052 rows=1 loops=1)
Index Cond: (idmail = 49233)
Trigger for constraint mail_idparent_fkey: time5.368 calls=1
Trigger for constraint mailattach_idmail_fkey: time=4.449 calls=1
Total runtime: 169.915 ms
On voit que le contrôl sur l'idparent prend quasiment tout le temps du
DELETE.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
pour info idparent vaut toujours NULL dans tout mes mails (pour le
moment)
alors on se doute que si la suppression de 1 mail prend 1/10eme de
seconde. je vous raconte pas la suppression de 1000 mails !!!
Que faire ?
tu as des clefs étrangères donc supprimer un email veut aussi dire aller
supprimer des enregistrements liés. Après, dans le cadre de
transactions, tu ne multiplies par le temps par 100 pour 100
enregistrements
Le 01/07/2010 14:42, Etienne a écrit :Salut.
j'ai un petit soucis.
J'enregistre des mails dans une base de données.
J'ai donc une table toute simple
CREATE TABLE "mail" (
"idmail" serial NOT NULL,
"idmailfolder" integer,
"idparent" integer,
"from_name" text,
"from_mail" text,
"date" timestamp without time zone DEFAULT now(),
"subject" text,
"body" text,
PRIMARY key (idmail),
FOREIGN key (idmailfolder) REFERENCES mailfolder (idobject),
FOREIGN key (idparent) REFERENCES mail (idmail)
);
l'insertion se fait sans problème a une vitesse acceptable.
par contre la suppression c'est une autre affaire
explain analyze DELETE FROM MAIL WHERE idmail = 49233;
---------------------------------------------------------------------
Index Scan using mail_pkey on mail (cost=0.00..8.28 rows=1 width=6)
(actual time=0.039..0.052 rows=1 loops=1)
Index Cond: (idmail = 49233)
Trigger for constraint mail_idparent_fkey: time5.368 calls=1
Trigger for constraint mailattach_idmail_fkey: time=4.449 calls=1
Total runtime: 169.915 ms
On voit que le contrôl sur l'idparent prend quasiment tout le temps du
DELETE.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
pour info idparent vaut toujours NULL dans tout mes mails (pour le
moment)
alors on se doute que si la suppression de 1 mail prend 1/10eme de
seconde. je vous raconte pas la suppression de 1000 mails !!!
Que faire ?
tu as des clefs étrangères donc supprimer un email veut aussi dire aller
supprimer des enregistrements liés. Après, dans le cadre de
transactions, tu ne multiplies par le temps par 100 pour 100
enregistrements
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
J'enregistre des mails dans une base de données. J'ai donc une table
toute simple
CREATE TABLE "mail" (
"idmail" serial NOT NULL,
"idmailfolder" integer,
"idparent" integer,
"from_name" text,
"from_mail" text,
"date" timestamp without time zone DEFAULT now(), "subject" text,
"body" text,
PRIMARY key (idmail),
FOREIGN key (idmailfolder) REFERENCES mailfolder (idobject),
key (idparent) REFERENCES mail (idmail)
);
l'insertion se fait sans problème a une vitesse acceptable. par contre
la suppression c'est une autre affaire
explain analyze DELETE FROM MAIL WHERE idmail = 49233;
---------------------------------------------------------------------
Index Scan using mail_pkey on mail (cost=0.00..8.28 rows=1 width=6)
(actual time=0.039..0.052 rows=1 loops=1)
Index Cond: (idmail = 49233)
Trigger for constraint mail_idparent_fkey: time5.368 calls=1
Trigger for constraint mailattach_idmail_fkey: time=4.449 calls=1
Total runtime: 169.915 ms
On voit que le contrôl sur l'idparent prend quasiment tout le temps du
DELETE.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
pour info idparent vaut toujours NULL dans tout mes mails (pour le
moment)
Que faire ?
J'enregistre des mails dans une base de données. J'ai donc une table
toute simple
CREATE TABLE "mail" (
"idmail" serial NOT NULL,
"idmailfolder" integer,
"idparent" integer,
"from_name" text,
"from_mail" text,
"date" timestamp without time zone DEFAULT now(), "subject" text,
"body" text,
PRIMARY key (idmail),
FOREIGN key (idmailfolder) REFERENCES mailfolder (idobject),
key (idparent) REFERENCES mail (idmail)
);
l'insertion se fait sans problème a une vitesse acceptable. par contre
la suppression c'est une autre affaire
explain analyze DELETE FROM MAIL WHERE idmail = 49233;
---------------------------------------------------------------------
Index Scan using mail_pkey on mail (cost=0.00..8.28 rows=1 width=6)
(actual time=0.039..0.052 rows=1 loops=1)
Index Cond: (idmail = 49233)
Trigger for constraint mail_idparent_fkey: time5.368 calls=1
Trigger for constraint mailattach_idmail_fkey: time=4.449 calls=1
Total runtime: 169.915 ms
On voit que le contrôl sur l'idparent prend quasiment tout le temps du
DELETE.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
pour info idparent vaut toujours NULL dans tout mes mails (pour le
moment)
Que faire ?
J'enregistre des mails dans une base de données. J'ai donc une table
toute simple
CREATE TABLE "mail" (
"idmail" serial NOT NULL,
"idmailfolder" integer,
"idparent" integer,
"from_name" text,
"from_mail" text,
"date" timestamp without time zone DEFAULT now(), "subject" text,
"body" text,
PRIMARY key (idmail),
FOREIGN key (idmailfolder) REFERENCES mailfolder (idobject),
key (idparent) REFERENCES mail (idmail)
);
l'insertion se fait sans problème a une vitesse acceptable. par contre
la suppression c'est une autre affaire
explain analyze DELETE FROM MAIL WHERE idmail = 49233;
---------------------------------------------------------------------
Index Scan using mail_pkey on mail (cost=0.00..8.28 rows=1 width=6)
(actual time=0.039..0.052 rows=1 loops=1)
Index Cond: (idmail = 49233)
Trigger for constraint mail_idparent_fkey: time5.368 calls=1
Trigger for constraint mailattach_idmail_fkey: time=4.449 calls=1
Total runtime: 169.915 ms
On voit que le contrôl sur l'idparent prend quasiment tout le temps du
DELETE.
Alors pourquoi ?
pourquoi est-ce que ca prend plus de temps que la contrainte sur le
dossier.
pour info idparent vaut toujours NULL dans tout mes mails (pour le
moment)
Que faire ?
La sérialisation des emails n'est pas forcément chose triviale si on veut
tout gérer, et selon le degré de conservation d'informations qu'on
souhaite.
Il faut notamment se poser la question des fichiers attachés éventuels,
des mails en multipart, des jeux de caractères, etc.
EXPLAIN ANALYZE SELECT * FROM mailfolder WHERE idobjectI233;
EXPLAIN ANALYZE SELECT * FROM mail WHERE idparentI233;
Les 2 références ne pointent pas sur la même table, et les valeurs n'ont
probablement pas la même distribution. Les 2 explains précédents
devraient montrer des comportements et des temps bien différents...
Il pourrait donc éventuellement être intéressant de gérer ca dans une
autre table:
CREATE TABLE mail_descendance (
idparent integer NOT NULL,
idchild integer NOT NULL,
PRIMARY KEY (idparent,idchild),
FOREIGN KEY idparent REFERENCES mail(idmail),
FOREIGN KEY idchild REFERENCE mail(idmail))
Ca vous évitera d'avoir des NULL dans mail. Les NULL ont leur usage, mais
quand il y en a "trop" il faut réfléchir et se demander si c'est normal.
A noter que vous pouvez faire des index fonctionnels:
CREATE INDEX toto ON mail(idparent) WHERE idparent IS NOT NULL;
La sérialisation des emails n'est pas forcément chose triviale si on veut
tout gérer, et selon le degré de conservation d'informations qu'on
souhaite.
Il faut notamment se poser la question des fichiers attachés éventuels,
des mails en multipart, des jeux de caractères, etc.
EXPLAIN ANALYZE SELECT * FROM mailfolder WHERE idobjectI233;
EXPLAIN ANALYZE SELECT * FROM mail WHERE idparentI233;
Les 2 références ne pointent pas sur la même table, et les valeurs n'ont
probablement pas la même distribution. Les 2 explains précédents
devraient montrer des comportements et des temps bien différents...
Il pourrait donc éventuellement être intéressant de gérer ca dans une
autre table:
CREATE TABLE mail_descendance (
idparent integer NOT NULL,
idchild integer NOT NULL,
PRIMARY KEY (idparent,idchild),
FOREIGN KEY idparent REFERENCES mail(idmail),
FOREIGN KEY idchild REFERENCE mail(idmail))
Ca vous évitera d'avoir des NULL dans mail. Les NULL ont leur usage, mais
quand il y en a "trop" il faut réfléchir et se demander si c'est normal.
A noter que vous pouvez faire des index fonctionnels:
CREATE INDEX toto ON mail(idparent) WHERE idparent IS NOT NULL;
La sérialisation des emails n'est pas forcément chose triviale si on veut
tout gérer, et selon le degré de conservation d'informations qu'on
souhaite.
Il faut notamment se poser la question des fichiers attachés éventuels,
des mails en multipart, des jeux de caractères, etc.
EXPLAIN ANALYZE SELECT * FROM mailfolder WHERE idobjectI233;
EXPLAIN ANALYZE SELECT * FROM mail WHERE idparentI233;
Les 2 références ne pointent pas sur la même table, et les valeurs n'ont
probablement pas la même distribution. Les 2 explains précédents
devraient montrer des comportements et des temps bien différents...
Il pourrait donc éventuellement être intéressant de gérer ca dans une
autre table:
CREATE TABLE mail_descendance (
idparent integer NOT NULL,
idchild integer NOT NULL,
PRIMARY KEY (idparent,idchild),
FOREIGN KEY idparent REFERENCES mail(idmail),
FOREIGN KEY idchild REFERENCE mail(idmail))
Ca vous évitera d'avoir des NULL dans mail. Les NULL ont leur usage, mais
quand il y en a "trop" il faut réfléchir et se demander si c'est normal.
A noter que vous pouvez faire des index fonctionnels:
CREATE INDEX toto ON mail(idparent) WHERE idparent IS NOT NULL;
Il pourrait donc éventuellement être intéressant de gérer ca dans une
autre table:
CREATE TABLE mail_descendance (
idparent integer NOT NULL,
idchild integer NOT NULL,
PRIMARY KEY (idparent,idchild),
FOREIGN KEY idparent REFERENCES mail(idmail), FOREIGN KEY idchild
REFERENCE mail(idmail))
Oui et non.
en effet on aurait un gain (sans doute) sur la taille de la base de
données, mais une jointure de plus lors de l'utilisation de idparent
(qui soit dis en passant est assez rare puisqu'il s'ahit d'afficher les
discussion.
A noter que vous pouvez faire des index fonctionnels: CREATE INDEX toto
ON mail(idparent) WHERE idparent IS NOT NULL;
Ah... on en apprend tous les jours !
Dans mon cas cela n'est pas opportun, mais ca pourrait servir un jour.
Il pourrait donc éventuellement être intéressant de gérer ca dans une
autre table:
CREATE TABLE mail_descendance (
idparent integer NOT NULL,
idchild integer NOT NULL,
PRIMARY KEY (idparent,idchild),
FOREIGN KEY idparent REFERENCES mail(idmail), FOREIGN KEY idchild
REFERENCE mail(idmail))
Oui et non.
en effet on aurait un gain (sans doute) sur la taille de la base de
données, mais une jointure de plus lors de l'utilisation de idparent
(qui soit dis en passant est assez rare puisqu'il s'ahit d'afficher les
discussion.
A noter que vous pouvez faire des index fonctionnels: CREATE INDEX toto
ON mail(idparent) WHERE idparent IS NOT NULL;
Ah... on en apprend tous les jours !
Dans mon cas cela n'est pas opportun, mais ca pourrait servir un jour.
Il pourrait donc éventuellement être intéressant de gérer ca dans une
autre table:
CREATE TABLE mail_descendance (
idparent integer NOT NULL,
idchild integer NOT NULL,
PRIMARY KEY (idparent,idchild),
FOREIGN KEY idparent REFERENCES mail(idmail), FOREIGN KEY idchild
REFERENCE mail(idmail))
Oui et non.
en effet on aurait un gain (sans doute) sur la taille de la base de
données, mais une jointure de plus lors de l'utilisation de idparent
(qui soit dis en passant est assez rare puisqu'il s'ahit d'afficher les
discussion.
A noter que vous pouvez faire des index fonctionnels: CREATE INDEX toto
ON mail(idparent) WHERE idparent IS NOT NULL;
Ah... on en apprend tous les jours !
Dans mon cas cela n'est pas opportun, mais ca pourrait servir un jour.