Bon ben non, les indexes n'ont rien changé malheureusement...
bon apres
la requete va deja vite, c'est juste qu'elle est un peu appelé plusieurs
millier de fois par jours, alors la moindre optimisation est directement
perceptible.
Bon ben non, les indexes n'ont rien changé malheureusement...
bon apres
la requete va deja vite, c'est juste qu'elle est un peu appelé plusieurs
millier de fois par jours, alors la moindre optimisation est directement
perceptible.
Bon ben non, les indexes n'ont rien changé malheureusement...
bon apres
la requete va deja vite, c'est juste qu'elle est un peu appelé plusieurs
millier de fois par jours, alors la moindre optimisation est directement
perceptible.
Le 20/09/2010 11:38, Etienne a écrit :Le 19/09/2010 18:20, SQLpro a écrit :Si ces index n'existent pas :
eproc_tarif (idcatalog, idproduct);
product (idobject, _producer)
active (active_fr, idactive)
Bon ben non, les indexes n'ont rien changé malheureusement...
Le 20/09/2010 11:38, Etienne a écrit :
Le 19/09/2010 18:20, SQLpro a écrit :
Si ces index n'existent pas :
eproc_tarif (idcatalog, idproduct);
product (idobject, _producer)
active (active_fr, idactive)
Bon ben non, les indexes n'ont rien changé malheureusement...
Le 20/09/2010 11:38, Etienne a écrit :Le 19/09/2010 18:20, SQLpro a écrit :Si ces index n'existent pas :
eproc_tarif (idcatalog, idproduct);
product (idobject, _producer)
active (active_fr, idactive)
Bon ben non, les indexes n'ont rien changé malheureusement...
Mais pour aller un peu plus loin, est ce que cela veut dire que pour
améliorer une jointure, il faut faire un index sur deux colonnes (les
deux colonnes liant les deux tables) ?
Mais pour aller un peu plus loin, est ce que cela veut dire que pour
améliorer une jointure, il faut faire un index sur deux colonnes (les
deux colonnes liant les deux tables) ?
Mais pour aller un peu plus loin, est ce que cela veut dire que pour
améliorer une jointure, il faut faire un index sur deux colonnes (les
deux colonnes liant les deux tables) ?
La table active permettait de savoir si un produit était actif ou pas.
donc elle est utile car je ne souhaite pas conserver les marques pour
Essayez en décomposant et en regardant si vous y gagnez à chaque étape
avec un index sur les champs pertinents.
SELECT idproduct FROM eproc_tarif WHERE eproc_tarif.idcatalog = 1392086
C'est mieux avec un index sur idcatalog, ou pas ?
Bitmap Heap Scan on eproc_tarif (cost7.34..2102.01 rowsX14
c'est rigolo ca.
je n'ai pas d'index sur idcatalog par contre j'en ai une sur (idcatalog,
idproduct).
Je ne pensais pas qu'un index sur deux colonnes pouvait être utilisé ici
!
Essayez de remplacer le DISTINCT par un GROUP BY aussi.
DISTINCT et GROUP BY même résultat.
Finalement, j'ai intégré ma table active dans la table product en
remplacent ca par un fameux bitfield tellement... cool :)
donc la c'est logique une jointure de moins ca va plus vite je passe de
135ms a 103ms.
Mais comme (et là c'est quand même mystérieux) vous venez de me montrer
que un IN peut parfois (toujours peut-être) aller plus vite qu'un INNER
JOIN ben j'ai modifié ma requete qui devient
La table active permettait de savoir si un produit était actif ou pas.
donc elle est utile car je ne souhaite pas conserver les marques pour
Essayez en décomposant et en regardant si vous y gagnez à chaque étape
avec un index sur les champs pertinents.
SELECT idproduct FROM eproc_tarif WHERE eproc_tarif.idcatalog = 1392086
C'est mieux avec un index sur idcatalog, ou pas ?
Bitmap Heap Scan on eproc_tarif (cost7.34..2102.01 rowsX14
c'est rigolo ca.
je n'ai pas d'index sur idcatalog par contre j'en ai une sur (idcatalog,
idproduct).
Je ne pensais pas qu'un index sur deux colonnes pouvait être utilisé ici
!
Essayez de remplacer le DISTINCT par un GROUP BY aussi.
DISTINCT et GROUP BY même résultat.
Finalement, j'ai intégré ma table active dans la table product en
remplacent ca par un fameux bitfield tellement... cool :)
donc la c'est logique une jointure de moins ca va plus vite je passe de
135ms a 103ms.
Mais comme (et là c'est quand même mystérieux) vous venez de me montrer
que un IN peut parfois (toujours peut-être) aller plus vite qu'un INNER
JOIN ben j'ai modifié ma requete qui devient
La table active permettait de savoir si un produit était actif ou pas.
donc elle est utile car je ne souhaite pas conserver les marques pour
Essayez en décomposant et en regardant si vous y gagnez à chaque étape
avec un index sur les champs pertinents.
SELECT idproduct FROM eproc_tarif WHERE eproc_tarif.idcatalog = 1392086
C'est mieux avec un index sur idcatalog, ou pas ?
Bitmap Heap Scan on eproc_tarif (cost7.34..2102.01 rowsX14
c'est rigolo ca.
je n'ai pas d'index sur idcatalog par contre j'en ai une sur (idcatalog,
idproduct).
Je ne pensais pas qu'un index sur deux colonnes pouvait être utilisé ici
!
Essayez de remplacer le DISTINCT par un GROUP BY aussi.
DISTINCT et GROUP BY même résultat.
Finalement, j'ai intégré ma table active dans la table product en
remplacent ca par un fameux bitfield tellement... cool :)
donc la c'est logique une jointure de moins ca va plus vite je passe de
135ms a 103ms.
Mais comme (et là c'est quand même mystérieux) vous venez de me montrer
que un IN peut parfois (toujours peut-être) aller plus vite qu'un INNER
JOIN ben j'ai modifié ma requete qui devient
Sauf que le LEFT OUTER fait que vous conservez toutes les lignes
nécessairement. Donc il y a quelque chose qui ne colle pas entre ce que
vous dites vouloir faire et ce que vous faites...
oui mais au final le where active.active_fr = 't' finissait par enlever
les lignes.
5814 lignes... ce sont des petites tables ! Ca tient entiérement en
RAM, même un accès séquentiel sera rapide. Pas la peine de se batailler
avec des index...
Il n'y a pas de petite optimisation :)
Dans le cas d'un index sur n-colonnes il peut être utilisé lors d'une
recherche impliquant les m premières colonnes (m< n) avec les éléments
dans le même ordre.
Ben on en apprends tous les jours :)
Finalement, j'ai intégré ma table active dans la table product en
remplacent ca par un fameux bitfield tellement... cool :)
Bof; Je ne suis toujours pas convaincu du cas dénormalisé. Et/ou je
n'ai pas bien compris votre schéma et besoin, désolé.
ben en fait chaque produit est disponible (ou pas) selon les pays.
Donc ma table active permettait simplement de dire si le produit faisait
partie du catalogue francais, anglais, belge, ...
J'avais décidé de mettre ca dans une table à part qui avait autant de
champs booleens que de pays.
Alors j'aurai pu mettre les champs booleens dans la table product sans
me compliquer la vie avec mon champs de bit, mais... pour une raison
esthetique je préfère mon champs de bit qui m'évite d'avoir x colonnes
lorsque je fais un SELECT * FROM product sous le shell de postgres.
Alors ok, c'est pas une raison valable, mais c'est pourtant la mienne :)
Vous allez me dire qu'avec une vue, je peux remédier au problème. Mais
je ne suis pas fan des vues. Je trouve ça pénible à manipuler.
Sauf que le LEFT OUTER fait que vous conservez toutes les lignes
nécessairement. Donc il y a quelque chose qui ne colle pas entre ce que
vous dites vouloir faire et ce que vous faites...
oui mais au final le where active.active_fr = 't' finissait par enlever
les lignes.
5814 lignes... ce sont des petites tables ! Ca tient entiérement en
RAM, même un accès séquentiel sera rapide. Pas la peine de se batailler
avec des index...
Il n'y a pas de petite optimisation :)
Dans le cas d'un index sur n-colonnes il peut être utilisé lors d'une
recherche impliquant les m premières colonnes (m< n) avec les éléments
dans le même ordre.
Ben on en apprends tous les jours :)
Finalement, j'ai intégré ma table active dans la table product en
remplacent ca par un fameux bitfield tellement... cool :)
Bof; Je ne suis toujours pas convaincu du cas dénormalisé. Et/ou je
n'ai pas bien compris votre schéma et besoin, désolé.
ben en fait chaque produit est disponible (ou pas) selon les pays.
Donc ma table active permettait simplement de dire si le produit faisait
partie du catalogue francais, anglais, belge, ...
J'avais décidé de mettre ca dans une table à part qui avait autant de
champs booleens que de pays.
Alors j'aurai pu mettre les champs booleens dans la table product sans
me compliquer la vie avec mon champs de bit, mais... pour une raison
esthetique je préfère mon champs de bit qui m'évite d'avoir x colonnes
lorsque je fais un SELECT * FROM product sous le shell de postgres.
Alors ok, c'est pas une raison valable, mais c'est pourtant la mienne :)
Vous allez me dire qu'avec une vue, je peux remédier au problème. Mais
je ne suis pas fan des vues. Je trouve ça pénible à manipuler.
Sauf que le LEFT OUTER fait que vous conservez toutes les lignes
nécessairement. Donc il y a quelque chose qui ne colle pas entre ce que
vous dites vouloir faire et ce que vous faites...
oui mais au final le where active.active_fr = 't' finissait par enlever
les lignes.
5814 lignes... ce sont des petites tables ! Ca tient entiérement en
RAM, même un accès séquentiel sera rapide. Pas la peine de se batailler
avec des index...
Il n'y a pas de petite optimisation :)
Dans le cas d'un index sur n-colonnes il peut être utilisé lors d'une
recherche impliquant les m premières colonnes (m< n) avec les éléments
dans le même ordre.
Ben on en apprends tous les jours :)
Finalement, j'ai intégré ma table active dans la table product en
remplacent ca par un fameux bitfield tellement... cool :)
Bof; Je ne suis toujours pas convaincu du cas dénormalisé. Et/ou je
n'ai pas bien compris votre schéma et besoin, désolé.
ben en fait chaque produit est disponible (ou pas) selon les pays.
Donc ma table active permettait simplement de dire si le produit faisait
partie du catalogue francais, anglais, belge, ...
J'avais décidé de mettre ca dans une table à part qui avait autant de
champs booleens que de pays.
Alors j'aurai pu mettre les champs booleens dans la table product sans
me compliquer la vie avec mon champs de bit, mais... pour une raison
esthetique je préfère mon champs de bit qui m'évite d'avoir x colonnes
lorsque je fais un SELECT * FROM product sous le shell de postgres.
Alors ok, c'est pas une raison valable, mais c'est pourtant la mienne :)
Vous allez me dire qu'avec une vue, je peux remédier au problème. Mais
je ne suis pas fan des vues. Je trouve ça pénible à manipuler.
Le Wed, 22 Sep 2010 22:33:31 +0200, WebShaker a écrit: Avec un LEFT
OUTER JOIN sur la table active ? Bah non, par définition, ca "n'enlève"
aucune ligne, il y a autant de lignes dans le résultat que dans la
table à gauche du LEFT OUTER. Pas moins. Il y en aurait,
potentiellement moins, avec un INNER JOIN où la condition de jointure
ne serait pas réalisée.
hum. alors ja vais peut etre dire une connerie, mais avec mon LEFT OUTER
JOIN j'aurai au pire des ligne de produit avec les données de la table
active valant toutes NULL non?
donc active.active_fr valant NULL pour ce ligne il ne peut pas valloir
't'
« Premature optimization is the root of all evil ».
Je la met dans mon book de citation.
C'est de qui ?
« J'ai les goûts les plus simples du monde, je me contente du meilleur
»
Celle la aussi je la note :)
Oui j'ai bien compris, n'empèche que ca ira moins vite car ca fera plus
de jointure.
C'est fait un choix (peut etre pas top) lié à la
performance.
Je croyais cependant que c'étaient les performances qui importaient...
Les performances ou l'esthétique :-) ? Ce n'est pas évident de trouver
des solutions élégantes et pertinentes, il faut choisir parfois...
En effet...
Je me rassure en me disant que le champ de bit prend (en plusà moins de
place mémoire...
Cela se manipule pourtant exactement comme une table dans un SELECT.
Oui je ne nie pas que c'est bien, mais prenons mon cas. j'ai une vue
(car j'en ai quand même)
CREATE VIEW product_fr AS SELECT * FROM product WHERE (actif_bitfield &
1) = 1;
qui me permet d'avoir le catalogue francais. Et bien à chaque fois que
je modifier la table product, je suis bon pour modifier aussi ma vue
puisqu'elle remplace * par tous les champs...
Mon rève serait une vue qui ne soit pas une vue mais plutot une macro.
c'est a dire que mon SELECT * (entre autre) resterai un SELECT *.
Le Wed, 22 Sep 2010 22:33:31 +0200, WebShaker a écrit: Avec un LEFT
OUTER JOIN sur la table active ? Bah non, par définition, ca "n'enlève"
aucune ligne, il y a autant de lignes dans le résultat que dans la
table à gauche du LEFT OUTER. Pas moins. Il y en aurait,
potentiellement moins, avec un INNER JOIN où la condition de jointure
ne serait pas réalisée.
hum. alors ja vais peut etre dire une connerie, mais avec mon LEFT OUTER
JOIN j'aurai au pire des ligne de produit avec les données de la table
active valant toutes NULL non?
donc active.active_fr valant NULL pour ce ligne il ne peut pas valloir
't'
« Premature optimization is the root of all evil ».
Je la met dans mon book de citation.
C'est de qui ?
« J'ai les goûts les plus simples du monde, je me contente du meilleur
»
Celle la aussi je la note :)
Oui j'ai bien compris, n'empèche que ca ira moins vite car ca fera plus
de jointure.
C'est fait un choix (peut etre pas top) lié à la
performance.
Je croyais cependant que c'étaient les performances qui importaient...
Les performances ou l'esthétique :-) ? Ce n'est pas évident de trouver
des solutions élégantes et pertinentes, il faut choisir parfois...
En effet...
Je me rassure en me disant que le champ de bit prend (en plusà moins de
place mémoire...
Cela se manipule pourtant exactement comme une table dans un SELECT.
Oui je ne nie pas que c'est bien, mais prenons mon cas. j'ai une vue
(car j'en ai quand même)
CREATE VIEW product_fr AS SELECT * FROM product WHERE (actif_bitfield &
1) = 1;
qui me permet d'avoir le catalogue francais. Et bien à chaque fois que
je modifier la table product, je suis bon pour modifier aussi ma vue
puisqu'elle remplace * par tous les champs...
Mon rève serait une vue qui ne soit pas une vue mais plutot une macro.
c'est a dire que mon SELECT * (entre autre) resterai un SELECT *.
Le Wed, 22 Sep 2010 22:33:31 +0200, WebShaker a écrit: Avec un LEFT
OUTER JOIN sur la table active ? Bah non, par définition, ca "n'enlève"
aucune ligne, il y a autant de lignes dans le résultat que dans la
table à gauche du LEFT OUTER. Pas moins. Il y en aurait,
potentiellement moins, avec un INNER JOIN où la condition de jointure
ne serait pas réalisée.
hum. alors ja vais peut etre dire une connerie, mais avec mon LEFT OUTER
JOIN j'aurai au pire des ligne de produit avec les données de la table
active valant toutes NULL non?
donc active.active_fr valant NULL pour ce ligne il ne peut pas valloir
't'
« Premature optimization is the root of all evil ».
Je la met dans mon book de citation.
C'est de qui ?
« J'ai les goûts les plus simples du monde, je me contente du meilleur
»
Celle la aussi je la note :)
Oui j'ai bien compris, n'empèche que ca ira moins vite car ca fera plus
de jointure.
C'est fait un choix (peut etre pas top) lié à la
performance.
Je croyais cependant que c'étaient les performances qui importaient...
Les performances ou l'esthétique :-) ? Ce n'est pas évident de trouver
des solutions élégantes et pertinentes, il faut choisir parfois...
En effet...
Je me rassure en me disant que le champ de bit prend (en plusà moins de
place mémoire...
Cela se manipule pourtant exactement comme une table dans un SELECT.
Oui je ne nie pas que c'est bien, mais prenons mon cas. j'ai une vue
(car j'en ai quand même)
CREATE VIEW product_fr AS SELECT * FROM product WHERE (actif_bitfield &
1) = 1;
qui me permet d'avoir le catalogue francais. Et bien à chaque fois que
je modifier la table product, je suis bon pour modifier aussi ma vue
puisqu'elle remplace * par tous les champs...
Mon rève serait une vue qui ne soit pas une vue mais plutot une macro.
c'est a dire que mon SELECT * (entre autre) resterai un SELECT *.