PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 12/07/2012 17:06:50

yannok
Membre

Optimisation requête répétée

Bonjour,

J'ai 2 tables : table_ref et table_courante

chacune de ces tables à 64 colonnes desc_0, desc_1 desc ... desc_63

Lors d'une requête j'ai besoin de calculer une distance " euclidienne "  de la façon suivante

table_ref.desc_0 - table_courante.desc_0) * (table_ref.desc_0 - table_courante.desc_0) + (table_ref.desc_1 - table_courante.desc_1) * (table_ref.desc_1 - table_courante.desc_1) +... + (table_ref.desc_63 - table_courante.desc_63) * (table_ref.desc_63 - table_courante.desc_63)

J'ai remarqué que plus je rajoute de colonnes, plus ma requête prend du temps (normal) :
ainsi faire select (table_ref.desc_0 - table_courante.desc_0) * (table_ref.desc_0 - table_courante.desc_0) from table_ref , table_courante prend par ex 100 ms
le fait de rajouter  (table_ref.desc_1 - table_courante.desc_1) * (table_ref.desc_1 - table_courante.desc_1) prend 50 ms de plus etc...

ma question est la suivante : est ce que ce serait possible d'optimiser cette requête puisqu'il s'agit toujours du mm type de calcul seul l'appel des colonnes change.

Merci !

Hors ligne

#2 12/07/2012 22:13:34

gleu
Administrateur

Re : Optimisation requête répétée

En dehors de précalculer les valeurs, je ne vois pas trop ce que vous pouvez faire de plus. Et même en précalculant, vu la rapidité de la requête, le temps de calcul est minime par rapport au temps de récupération de la donnée sur disque ou en mémoire.


Guillaume.

Hors ligne

#3 17/07/2012 18:21:53

SQLpro
Membre

Re : Optimisation requête répétée

yannok a écrit :

Bonjour,

J'ai 2 tables : table_ref et table_courante

chacune de ces tables à 64 colonnes desc_0, desc_1 desc ... desc_63

Déjà la modélisation n'est pas bonne. Vous violez par élision la première forme normale, dans le sens ou ces 64 colonnes aurait pu figurer dans un tableau et pourquoi d'ailleurs se limiter à 64 ? (en outre y a t-il des colonnes vides - NULL ?)

Remodélisez en déplaçant ces 64 colonne dans une table liée à la précédente en relation 1:n (n variant de 0 à 64).
Ensuite indexez les tables correctement.

Reprenez vos requêtes et comparez.

A +


Frédéric Brouard, alias SQLpro,  ARCHITECTE DE DONNÉES,  Expert langage SQL
Le site sur les SGBD relationnel et langage SQL   : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * *  Enseignant CNAM PACA, ISEN Toulon,  CESI Aix en Provence  * * * * *

Hors ligne

Pied de page des forums