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 17/11/2014 12:31:54

lemjid
Membre

lenteur de lecture sur les foreign tables.

Bonjour tout le monde,

Après avoir mis en place foreign_data_wrapper sur postgresql, Je rencontre un énorme lenteur sur l'exploitation des tables. Le temps de réponse de select sur des petite tables est multiplié par *5 voir par *10.

Le problème c'est que les foreign tables n'ont ni clé primaire ni index et je suis désolé de dire que je ne sais pas comment créer une clé voir un index sur foreign table.

l'ordre de creation de foreign table n'accepte pas le (CONSTRAINT) et je suis à court d'idées. sad
--
voici quelques infos:
--------------------------------------------------------------------------------------------------------------
PostgreSQL 9.2.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3), 64-bit
--
plan d'exécution select count(*);
===
table réelle:
=========
explain analyze select count(*) from accord;
                                                 QUERY PLAN
-------------------------------------------------------------------------------------------------------------
Aggregate  (cost=31.00..31.01 rows=1 width=0) (actual time=3.473..3.474 rows=1 loops=1)
   ->  Seq Scan on accord  (cost=0.00..27.60 rows=1360 width=0) (actual time=0.026..1.823 rows=1360 loops=1)
Total runtime: 3.581 ms
(3 rows)
=======
foreign table:
===========
explain analyze select count(*) from accord;
                                                     QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Aggregate  (cost=220.92..220.93 rows=1 width=0) (actual time=11.130..11.132 rows=1 loops=1)
   ->  Foreign Scan on accord  (cost=100.00..212.39 rows=3413 width=0) (actual time=2.786..9.258 rows=1360 loops=1)
Total runtime: 37.167 ms
(3 rows)

==>
Merci d'avance pour votre aide.

Hors ligne

#2 17/11/2014 13:25:45

lemjid
Membre

Re : lenteur de lecture sur les foreign tables.

Est ce que quelqu'un pourras m'aider ou m'aiguiller SVP?

Hors ligne

#3 17/11/2014 15:06:33

gleu
Administrateur

Re : lenteur de lecture sur les foreign tables.

Il n'est pas possible de créer un index sur une foreign table. Il faut la créer sur la table locale (ceci dit, ça ne servira à rien pour un count(*) sur une foreign table).


Guillaume.

Hors ligne

#4 17/11/2014 15:23:57

lemjid
Membre

Re : lenteur de lecture sur les foreign tables.

Merci Guillaume,

le count(*) n'est qu'un exemple.
Est ce que je sous entend que si on crée un index sur une table (toto) en locale est bénéfique pour l'exploitation de la foreign table?

Bien à toi

Hors ligne

#5 17/11/2014 16:09:25

gleu
Administrateur

Re : lenteur de lecture sur les foreign tables.

Si le FDW est assez intelligent, oui.


Guillaume.

Hors ligne

#6 17/11/2014 16:18:36

lemjid
Membre

Re : lenteur de lecture sur les foreign tables.

Est il possible de le rendre intelligent et Comment?

Hors ligne

#7 18/11/2014 11:06:40

lemjid
Membre

Re : lenteur de lecture sur les foreign tables.

Bonjour tout le monde,

Je suis vraiment dans une impasse et je suis à court d'idées, donc si quelqu'un pourra m'aiguiller ça sera sympa.

Bien à vous

Hors ligne

#8 18/11/2014 12:56:03

rjuju
Administrateur

Re : lenteur de lecture sur les foreign tables.

Le principal problème semble être la bande passante entre vos deux serveurs. Savez-vous le type de lien entre ceux-ci ? La bande passante disponible ainsi que la latence ?

SInon avez-vous regardé la documentation de postgres_fdw ? http://docs.postgresql.fr/9.3/postgres-fdw.html Vous avez notamment le paramètre use_remote_estimate qui peut être utile si les statistiques sont à jour sur la tables du serveur distant mais qu'aucun analyze n'a été fait sur la foreign table.

Hors ligne

#9 18/11/2014 19:22:00

lemjid
Membre

Re : lenteur de lecture sur les foreign tables.

Bonjour,

Merci rjuju d'avoir redonner vie à mon post.
Tu pourras me dire le valeur qu'il faut mettre: true or false.

Merci d'avance.

Hors ligne

#10 18/11/2014 21:44:20

rjuju
Administrateur

Re : lenteur de lecture sur les foreign tables.

Pour le paramètre use_remote_estimate, idéalement il faut le laisser à false et exécuter des analyze sur la foreign table. Le mettre à true permet d'utiliser les statistiques de la vraie table, mais cela implique un coût supérieur (des explain seront effectués). La vraie réponse est donc d'avoir une politique de maintenance correcte.

Hors ligne

#11 19/11/2014 13:32:06

lemjid
Membre

Re : lenteur de lecture sur les foreign tables.

J'ai lu attentivement la doc officiel de la page que tu m'as communiqué (merci).
Mon problème initiale c'est le temps de réponse des requêtes SQL lancé sur la base ou les tables sont "wrappées", quand je lance la même requête (exactement la même) sur les tables d'origine du serveur maître j'ai un rapport de 10 voir plus sur le temps de réponse. (voir exemple)
==
Table d'origine
=========
explain analyze select pays_id, accord_groupe_id from  dw_fait_indice_net where pays_id = '82';
                                                     QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
Seq Scan on dw_fait_indice_net  (cost=0.00..92.90 rows=1352 width=16) (actual time=0.017..0.913 rows=1352 loops=1)
   Filter: (pays_id = 82::bigint)
Total runtime: 1.138 ms
(3 rows)

====
Foreign table:
=========
Foreign Scan on dw_fait_indice_net  (cost=100.00..219.94 rows=1352 width=16) (actual time=2.486..20.993 rows=1352 loops=1)
Total runtime: 21.642 ms
(2 rows)

Du coup avec des requêtes plus compliquées le temps de réponse risque d'être interminable.
Est ce qu'il y a un moyen de réduire ce coût? sachant que je ne peut pas créer d'index.

Hors ligne

#12 19/11/2014 17:58:49

rjuju
Administrateur

Re : lenteur de lecture sur les foreign tables.

Avant d'aller plus loin, il faut savoir quelle est la capacité du réseau entre ces deux machines, en terme de bande passante et de latence.

Hors ligne

#13 19/11/2014 18:18:20

lemjid
Membre

Re : lenteur de lecture sur les foreign tables.

Bonjour,

Voici les tests fait:
ifconfig eth0 | grep -Eo "MTU:[0-9]+"
MTU:1500 ==> Pour les deux machines donc latence 7,7772ms
==
dd if=/dev/zero of=test bs=100M count=1; scp test usertest@xxxxx1:/dev/null;
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 0.297704 s, 352 MB/s
test                                                                                                                     100%  100MB  50.0MB/s   00:02
===========

Est ce que je devrai fournir d'autres metriques?

Bien à toi

Hors ligne

#14 19/11/2014 19:00:19

gleu
Administrateur

Re : lenteur de lecture sur les foreign tables.

Je ne vois pas comment vous pouvez comparer les deux, ce n'est pas du tout la même chose. En local, vous ne faites qu'exécuter la requête. À distance, vous devez faire la connexion au serveur distant, exécuter la requête, récupérer les données, fermer la connexion. C'est évidemment plus long. L'intérêt d'un FDW n'est pas sa rapidité, c'est plutôt d'aller récupérer des données qu'on ne pourrait pas avoir autrement. Et d'accepter en échange de cet intérêt des performances qui sont moindres sur ce type d'objet.


Guillaume.

Hors ligne

#15 20/11/2014 09:02:06

uruvela
Membre

Re : lenteur de lecture sur les foreign tables.

Si effectivement le temps de réponse est un problème, il faudrait envisager une autre solution comme de récupérer les données distantes via un ETL pour les avoir en local (en fonction de vos usages bien sur).

Hors ligne

#16 20/11/2014 10:30:40

lemjid
Membre

Re : lenteur de lecture sur les foreign tables.

Bonjour,

Merci pour les réponses et l'aide que vous m'avez apporté. Pour (gleu), je sais bien que le temps de réponse ne soit le même, ce que j'essaye c'est d'optimiser ce temps là le maximum (si c'est possible bien sûre). Pour (uruvela), le choix d'un ETL est judicieux le seul problème c'est que la MAJ des donnée ne soit pas au temps réel.
Merci encore à vous et j'attend l'avis de rjuju.

Hors ligne

#17 20/11/2014 11:22:50

rjuju
Administrateur

Re : lenteur de lecture sur les foreign tables.

Je suis de l'avis des autres. Vous aurez un temps minimum d'exécution bien supérieur du à la connexion/déconnexion et la latence du réseau. Et sans connaître votre besoin, difficile de dire si l'utilisation d'un foreign data wrapper est la meilleure solution.

Hors ligne

#18 20/11/2014 15:22:01

lemjid
Membre

Re : lenteur de lecture sur les foreign tables.

Le besoin initial est d'avoir un serveur Postgresql pour le reporting. Une architecture de hot-standby à été mise en oeuvre master/slave. Le reporting s'effectue sur l'esclave. Le problème c'est que l'application de reporting fait "CREATE UNLOGGED table from t1, join, where...", comme sur l'esclave ce n'est pas possible de faire des DDL on a choisit de faire une base avec FW pour le besoin de l'appli. Voila l'origine du problème.

Bien à toi

Hors ligne

#19 20/11/2014 19:49:36

gleu
Administrateur

Re : lenteur de lecture sur les foreign tables.

Si vous voulez des performances, utilisez Slony.


Guillaume.

Hors ligne

#20 20/11/2014 22:20:55

rjuju
Administrateur

Re : lenteur de lecture sur les foreign tables.

Les unlogged tables sont crées afin d'effectuer plusieurs requêtes sur celles-ci avant d'être détruites ou s'agit-il d'une solution pour facilité l'écriture des requêtes ?

Hors ligne

#21 21/11/2014 10:42:47

ruizsebastien
Membre

Re : lenteur de lecture sur les foreign tables.

Bonjour,

Si vous faites du reporting sur l'esclave et que vous n'avez pas besoin des données à jour en temps réel (par exemple j-1) vous pouvez toujours créer un deuxième esclave que vous activez (en read/write) pour votre application de reporting.

Cordialement,


Cordialement,

Sébastien.

Hors ligne

Pied de page des forums