Vous n'êtes pas identifié(e).
je retombe
Durée totale d'exécution de la requête :2687 ms.
161 lignes récupérées.
SET from_collapse_limit TO 8;
SET join_collapse_limit TO 8;
explain analyse select mdmetadata0_.id as col_0_0_ from public.md_metadata mdmetadata0_
inner join public.mf_metadata mdmetadata0_1_ on mdmetadata0_.id=mdmetadata0_1_.id
join public.content_info contentinf1_ on mdmetadata0_.id=contentinf1_.fk_metadata
left outer join public.mi_imagedesc contentinf1_1_ on contentinf1_.id=contentinf1_1_.id
left outer join public.mi_radarimagedesc contentinf1_2_ on contentinf1_.id=contentinf1_2_.id
left outer join public.mi_opticalimagedesc contentinf1_3_ on contentinf1_.id=contentinf1_3_.id
left outer join public.md_identification identifica2_ on mdmetadata0_.id=identifica2_.fk_md_metadata
left outer join public.md_dataidentification identifica2_1_ on identifica2_.id=identifica2_1_.id
join public.catalog_id catalogid3_ on identifica2_1_.fk_catalog_id=catalogid3_.id
join public.ex_temporalextent temporalex4_ on identifica2_.id=temporalex4_.fk_dataident
where contentinf1_1_.attribute_desc='DATASTRIP_SCENE'
and catalogid3_.profile='LEVEL0'
and (temporalex4_.begin_ between '2007-08-02' and '2007-08-30')
"Nested Loop (cost=52157.93..85267.26 rows=1 width=22) (actual time=1865.156..4994.184 rows=154 loops=1)"
" -> Hash Join (cost=52157.93..85266.60 rows=1 width=62) (actual time=1865.093..4990.764 rows=154 loops=1)"
" Hash Cond: ((identifica2_.id)::text = (temporalex4_.fk_dataident)::text)"
" -> Hash Join (cost=52141.56..84472.30 rows=207445 width=142) (actual time=1842.028..4870.900 rows=206718 loops=1)"
" Hash Cond: ((mdmetadata0_1_.id)::text = (mdmetadata0_.id)::text)"
" -> Hash Left Join (cost=42890.11..71257.93 rows=192868 width=186) (actual time=1543.397..4147.864 rows=206718 loops=1)"
" Hash Cond: ((contentinf1_.id)::text = (contentinf1_2_.id)::text)"
" -> Hash Left Join (cost=42877.41..70520.95 rows=192868 width=226) (actual time=1543.370..3930.902 rows=206718 loops=1)"
" Hash Cond: ((contentinf1_.id)::text = (contentinf1_3_.id)::text)"
" -> Hash Join (cost=35243.96..58789.05 rows=192868 width=226) (actual time=1251.403..3218.354 rows=206718 loops=1)"
" Hash Cond: ((identifica2_.id)::text = (identifica2_1_.id)::text)"
" -> Hash Join (cost=25911.51..45358.16 rows=192868 width=146) (actual time=921.434..2453.369 rows=206718 loops=1)"
" Hash Cond: ((contentinf1_.id)::text = (contentinf1_1_.id)::text)"
" -> Hash Join (cost=15000.19..30439.11 rows=207906 width=146) (actual time=601.957..1700.817 rows=223620 loops=1)"
" Hash Cond: ((mdmetadata0_1_.id)::text = (contentinf1_.fk_metadata)::text)"
" -> Hash Join (cost=7337.74..18181.87 rows=223620 width=84) (actual time=300.023..913.855 rows=223620 loops=1)"
" Hash Cond: ((identifica2_.fk_md_metadata)::text = (mdmetadata0_1_.id)::text)"
" -> Seq Scan on md_identification identifica2_ (cost=0.00..6092.20 rows=223620 width=62) (actual time=0.024..136.218 rows=223620 loops=1)"
" -> Hash (cost=4331.22..4331.22 rows=240522 width=22) (actual time=299.878..299.878 rows=240522 loops=1)"
" -> Seq Scan on mf_metadata mdmetadata0_1_ (cost=0.00..4331.22 rows=240522 width=22) (actual time=0.017..142.665 rows=240522 loops=1)"
" -> Hash (cost=4867.20..4867.20 rows=223620 width=62) (actual time=301.820..301.820 rows=223620 loops=1)"
" -> Seq Scan on content_info contentinf1_ (cost=0.00..4867.20 rows=223620 width=62) (actual time=0.027..139.955 rows=223620 loops=1)"
" -> Hash (cost=8318.25..8318.25 rows=207445 width=40) (actual time=319.357..319.357 rows=206718 loops=1)"
" -> Seq Scan on mi_imagedesc contentinf1_1_ (cost=0.00..8318.25 rows=207445 width=40) (actual time=0.033..176.137 rows=206718 loops=1)"
" Filter: ((attribute_desc)::text = 'DATASTRIP_SCENE'::text)"
" -> Hash (cost=6537.20..6537.20 rows=223620 width=80) (actual time=329.914..329.914 rows=223620 loops=1)"
" -> Seq Scan on md_dataidentification identifica2_1_ (cost=0.00..6537.20 rows=223620 width=80) (actual time=0.030..158.099 rows=223620 loops=1)"
" -> Hash (cost=4838.20..4838.20 rows=223620 width=40) (actual time=291.851..291.851 rows=223620 loops=1)"
" -> Seq Scan on mi_opticalimagedesc contentinf1_3_ (cost=0.00..4838.20 rows=223620 width=40) (actual time=0.026..136.670 rows=223620 loops=1)"
" -> Hash (cost=11.20..11.20 rows=120 width=90) (actual time=0.002..0.002 rows=0 loops=1)"
" -> Seq Scan on mi_radarimagedesc contentinf1_2_ (cost=0.00..11.20 rows=120 width=90) (actual time=0.001..0.001 rows=0 loops=1)"
" -> Hash (cost=6456.20..6456.20 rows=223620 width=22) (actual time=298.593..298.593 rows=223620 loops=1)"
" -> Seq Scan on md_metadata mdmetadata0_ (cost=0.00..6456.20 rows=223620 width=22) (actual time=0.016..150.434 rows=223620 loops=1)"
" -> Hash (cost=16.36..16.36 rows=1 width=40) (actual time=0.472..0.472 rows=172 loops=1)"
" -> Index Scan using ind_ex_temporalextent_begin_ on ex_temporalextent temporalex4_ (cost=0.00..16.36 rows=1 width=40) (actual time=0.081..0.292 rows=172 loops=1)"
" Index Cond: ((begin_ >= '2007-08-02 00:00:00'::timestamp without time zone) AND (begin_ <= '2007-08-30 00:00:00'::timestamp without time zone))"
" -> Index Scan using catalog_id_pkey on catalog_id catalogid3_ (cost=0.00..0.65 rows=1 width=40) (actual time=0.019..0.020 rows=1 loops=154)"
" Index Cond: ((identifica2_1_.fk_catalog_id)::text = (catalogid3_.id)::text)"
" Filter: ((profile)::text = 'LEVEL0'::text)"
"Total runtime: 5003.214 ms"
après un passage des commandes suivantes
CLUSTER content_info_pkey ON public.content_info
puis un restart postgres
la requête s'effectue
SET join_collapse_limit TO 15;
select mdmetadata0_.id as col_0_0_ from public.md_metadata mdmetadata0_
inner join public.mf_metadata mdmetadata0_1_ on mdmetadata0_.id=mdmetadata0_1_.id
left outer join public.content_info contentinf1_ on mdmetadata0_.id=contentinf1_.fk_metadata
left outer join public.mi_imagedesc contentinf1_1_ on contentinf1_.id=contentinf1_1_.id
left outer join public.mi_radarimagedesc contentinf1_2_ on contentinf1_.id=contentinf1_2_.id
left outer join public.mi_opticalimagedesc contentinf1_3_ on contentinf1_.id=contentinf1_3_.id
left outer join public.md_identification identifica2_ on mdmetadata0_.id=identifica2_.fk_md_metadata
left outer join public.md_dataidentification identifica2_1_ on identifica2_.id=identifica2_1_.id
left outer join public.catalog_id catalogid3_ on identifica2_1_.fk_catalog_id=catalogid3_.id
left outer join public.ex_temporalextent temporalex4_ on identifica2_.id=temporalex4_.fk_dataident
where contentinf1_1_.attribute_desc='DATASTRIP_SCENE' and catalogid3_.profile='LEVEL0' and (temporalex4_.begin_ between '2007-08-01' and '2007-08-30')
Durée totale d'exécution de la requête :93 ms.
161 lignes récupérées.
le plan d'adressage est bien meilleur car il passe systématiquement par les index vs un seq scan !!!!
Ma question : dois-je positionner le from_collapse_limit ??? qui a prioi n'est pas utile ??? , quand je supprime le join_collapse_limit , je retombe sur des seq scan , donc le bon paramete semble être join_collapse_limit
"Nested Loop (cost=0.00..53.24 rows=1 width=22) (actual time=0.299..21.167 rows=161 loops=1)"
" -> Nested Loop (cost=0.00..52.63 rows=1 width=66) (actual time=0.282..18.888 rows=161 loops=1)"
" -> Nested Loop Left Join (cost=0.00..51.96 rows=1 width=106) (actual time=0.151..16.286 rows=181 loops=1)"
" -> Nested Loop Left Join (cost=0.00..51.68 rows=1 width=106) (actual time=0.149..15.851 rows=181 loops=1)"
" -> Nested Loop (cost=0.00..51.08 rows=1 width=106) (actual time=0.131..13.248 rows=181 loops=1)"
" -> Nested Loop (cost=0.00..50.43 rows=1 width=146) (actual time=0.113..10.622 rows=181 loops=1)"
" -> Nested Loop (cost=0.00..33.98 rows=1 width=186) (actual time=0.094..7.973 rows=181 loops=1)"
" -> Nested Loop (cost=0.00..33.48 rows=1 width=124) (actual time=0.076..5.383 rows=181 loops=1)"
" -> Nested Loop (cost=0.00..32.81 rows=1 width=102) (actual time=0.058..2.845 rows=181 loops=1)"
" -> Index Scan using ind_ex_temporalextent_begin_ on ex_temporalextent temporalex4_ (cost=0.00..16.36 rows=1 width=40) (actual time=0.027..0.164 rows=181 loops=1)"
" Index Cond: ((begin_ >= '2007-08-01 00:00:00'::timestamp without time zone) AND (begin_ <= '2007-08-30 00:00:00'::timestamp without time zone))"
" -> Index Scan using md_identification_pkey on md_identification identifica2_ (cost=0.00..16.43 rows=1 width=62) (actual time=0.012..0.013 rows=1 loops=181)"
" Index Cond: ((identifica2_.id)::text = (temporalex4_.fk_dataident)::text)"
" -> Index Scan using md_metadata_pkey on md_metadata mdmetadata0_ (cost=0.00..0.66 rows=1 width=22) (actual time=0.011..0.012 rows=1 loops=181)"
" Index Cond: ((mdmetadata0_.id)::text = (identifica2_.fk_md_metadata)::text)"
" -> Index Scan using ind_content_info_fk_metadata on content_info contentinf1_ (cost=0.00..0.49 rows=1 width=62) (actual time=0.012..0.012 rows=1 loops=181)"
" Index Cond: ((mdmetadata0_.id)::text = (contentinf1_.fk_metadata)::text)"
" -> Index Scan using md_dataidentification_pkey on md_dataidentification identifica2_1_ (cost=0.00..16.43 rows=1 width=80) (actual time=0.012..0.013 rows=1 loops=181)"
" Index Cond: ((identifica2_.id)::text = (identifica2_1_.id)::text)"
" -> Index Scan using catalog_id_pkey on catalog_id catalogid3_ (cost=0.00..0.63 rows=1 width=40) (actual time=0.012..0.013 rows=1 loops=181)"
" Index Cond: ((identifica2_1_.fk_catalog_id)::text = (catalogid3_.id)::text)"
" Filter: ((profile)::text = 'LEVEL0'::text)"
" -> Index Scan using ind_mi_opticalimagedesc_multicol on mi_opticalimagedesc contentinf1_3_ (cost=0.00..0.59 rows=1 width=40) (actual time=0.012..0.012 rows=1 loops=181)"
" Index Cond: ((contentinf1_.id)::text = (contentinf1_3_.id)::text)"
" -> Index Scan using mi_radarimagedesc_pkey on mi_radarimagedesc contentinf1_2_ (cost=0.00..0.27 rows=1 width=90) (actual time=0.001..0.001 rows=0 loops=181)"
" Index Cond: ((contentinf1_.id)::text = (contentinf1_2_.id)::text)"
" -> Index Scan using ind_mi_imagedesc_id on mi_imagedesc contentinf1_1_ (cost=0.00..0.65 rows=1 width=40) (actual time=0.012..0.013 rows=1 loops=181)"
" Index Cond: ((contentinf1_.id)::text = (contentinf1_1_.id)::text)"
" Filter: ((attribute_desc)::text = 'DATASTRIP_SCENE'::text)"
" -> Index Scan using mf_metadata_pkey on mf_metadata mdmetadata0_1_ (cost=0.00..0.60 rows=1 width=22) (actual time=0.012..0.012 rows=1 loops=161)"
" Index Cond: ((mdmetadata0_.id)::text = (mdmetadata0_1_.id)::text)"
"Total runtime: 21.411 ms"
voici le plan obtenu à partir de cette requête
SET from_collapse_limit TO 15;
explain analyse select mdmetadata0_.id as col_0_0_ from public.md_metadata mdmetadata0_
inner join public.mf_metadata mdmetadata0_1_ on mdmetadata0_.id=mdmetadata0_1_.id
left outer join public.content_info contentinf1_ on mdmetadata0_.id=contentinf1_.fk_metadata
left outer join public.mi_imagedesc contentinf1_1_ on contentinf1_.id=contentinf1_1_.id
left outer join public.mi_radarimagedesc contentinf1_2_ on contentinf1_.id=contentinf1_2_.id
left outer join public.mi_opticalimagedesc contentinf1_3_ on contentinf1_.id=contentinf1_3_.id
left outer join public.md_identification identifica2_ on mdmetadata0_.id=identifica2_.fk_md_metadata
left outer join public.md_dataidentification identifica2_1_ on identifica2_.id=identifica2_1_.id
left outer join public.catalog_id catalogid3_ on identifica2_1_.fk_catalog_id=catalogid3_.id
left outer join public.ex_temporalextent temporalex4_ on identifica2_.id=temporalex4_.fk_dataident
where contentinf1_1_.attribute_desc='DATASTRIP_SCENE' and catalogid3_.profile='LEVEL0' and (temporalex4_.begin_ between '2007-08-01' and '2007-08-30')
"Nested Loop (cost=52157.93..85267.26 rows=1 width=22) (actual time=1870.443..4967.570 rows=161 loops=1)"
" -> Hash Join (cost=52157.93..85266.60 rows=1 width=62) (actual time=1870.377..4963.943 rows=161 loops=1)"
" Hash Cond: ((identifica2_.id)::text = (temporalex4_.fk_dataident)::text)"
" -> Hash Join (cost=52141.56..84472.30 rows=207445 width=142) (actual time=1847.458..4843.893 rows=206718 loops=1)"
" Hash Cond: ((mdmetadata0_1_.id)::text = (mdmetadata0_.id)::text)"
" -> Hash Left Join (cost=42890.11..71257.93 rows=192868 width=186) (actual time=1546.351..4118.596 rows=206718 loops=1)"
" Hash Cond: ((contentinf1_.id)::text = (contentinf1_2_.id)::text)"
" -> Hash Left Join (cost=42877.41..70520.95 rows=192868 width=226) (actual time=1546.325..3900.222 rows=206718 loops=1)"
" Hash Cond: ((contentinf1_.id)::text = (contentinf1_3_.id)::text)"
" -> Hash Join (cost=35243.96..58789.05 rows=192868 width=226) (actual time=1254.140..3188.293 rows=206718 loops=1)"
" Hash Cond: ((identifica2_.id)::text = (identifica2_1_.id)::text)"
" -> Hash Join (cost=25911.51..45358.16 rows=192868 width=146) (actual time=923.143..2424.479 rows=206718 loops=1)"
" Hash Cond: ((contentinf1_.id)::text = (contentinf1_1_.id)::text)"
" -> Hash Join (cost=15000.19..30439.11 rows=207906 width=146) (actual time=601.607..1670.034 rows=223620 loops=1)"
" Hash Cond: ((mdmetadata0_1_.id)::text = (contentinf1_.fk_metadata)::text)"
" -> Hash Join (cost=7337.74..18181.87 rows=223620 width=84) (actual time=299.616..912.999 rows=223620 loops=1)"
" Hash Cond: ((identifica2_.fk_md_metadata)::text = (mdmetadata0_1_.id)::text)"
" -> Seq Scan on md_identification identifica2_ (cost=0.00..6092.20 rows=223620 width=62) (actual time=0.023..138.506 rows=223620 loops=1)"
" -> Hash (cost=4331.22..4331.22 rows=240522 width=22) (actual time=299.474..299.474 rows=240522 loops=1)"
" -> Seq Scan on mf_metadata mdmetadata0_1_ (cost=0.00..4331.22 rows=240522 width=22) (actual time=0.015..142.287 rows=240522 loops=1)"
" -> Hash (cost=4867.20..4867.20 rows=223620 width=62) (actual time=301.880..301.880 rows=223620 loops=1)"
" -> Seq Scan on content_info contentinf1_ (cost=0.00..4867.20 rows=223620 width=62) (actual time=0.029..140.764 rows=223620 loops=1)"
" -> Hash (cost=8318.25..8318.25 rows=207445 width=40) (actual time=321.418..321.418 rows=206718 loops=1)"
" -> Seq Scan on mi_imagedesc contentinf1_1_ (cost=0.00..8318.25 rows=207445 width=40) (actual time=0.034..176.820 rows=206718 loops=1)"
" Filter: ((attribute_desc)::text = 'DATASTRIP_SCENE'::text)"
" -> Hash (cost=6537.20..6537.20 rows=223620 width=80) (actual time=330.886..330.886 rows=223620 loops=1)"
" -> Seq Scan on md_dataidentification identifica2_1_ (cost=0.00..6537.20 rows=223620 width=80) (actual time=0.029..158.008 rows=223620 loops=1)"
" -> Hash (cost=4838.20..4838.20 rows=223620 width=40) (actual time=292.073..292.073 rows=223620 loops=1)"
" -> Seq Scan on mi_opticalimagedesc contentinf1_3_ (cost=0.00..4838.20 rows=223620 width=40) (actual time=0.024..137.913 rows=223620 loops=1)"
" -> Hash (cost=11.20..11.20 rows=120 width=90) (actual time=0.002..0.002 rows=0 loops=1)"
" -> Seq Scan on mi_radarimagedesc contentinf1_2_ (cost=0.00..11.20 rows=120 width=90) (actual time=0.001..0.001 rows=0 loops=1)"
" -> Hash (cost=6456.20..6456.20 rows=223620 width=22) (actual time=300.994..300.994 rows=223620 loops=1)"
" -> Seq Scan on md_metadata mdmetadata0_ (cost=0.00..6456.20 rows=223620 width=22) (actual time=0.017..151.848 rows=223620 loops=1)"
" -> Hash (cost=16.36..16.36 rows=1 width=40) (actual time=0.516..0.516 rows=181 loops=1)"
" -> Index Scan using ind_ex_temporalextent_begin_ on ex_temporalextent temporalex4_ (cost=0.00..16.36 rows=1 width=40) (actual time=0.086..0.324 rows=181 loops=1)"
" Index Cond: ((begin_ >= '2007-08-01 00:00:00'::timestamp without time zone) AND (begin_ <= '2007-08-30 00:00:00'::timestamp without time zone))"
" -> Index Scan using catalog_id_pkey on catalog_id catalogid3_ (cost=0.00..0.65 rows=1 width=40) (actual time=0.020..0.020 rows=1 loops=161)"
" Index Cond: ((identifica2_1_.fk_catalog_id)::text = (catalogid3_.id)::text)"
" Filter: ((profile)::text = 'LEVEL0'::text)"
"Total runtime: 4976.187 ms"
---------------------------------------------------------
Durée totale d'exécution de la requête :2656 ms.
161 lignes récupérées.
Ok je modifie les paramètres from_collapse_limit et join_collapse_limit à la valeur de 15 ,
faut-il un restart de postgres ??? et je vérifie le plan de l'optimiseur
Mon application ne fait pas de tri explicite sur la base , mais uniquement des joins , le log_temp_files sera-il utilisé dans ce cas ???
Ok , c'est plus clair ,
maintenant cette question ; comment évaluer précisément le work-men pour un client ?? en analysant (explain) l'ensemble des requêtes passées par mon client via les log Postgres et pggfouine
Sur quelles métriques dois-je me baser pour déterminer la valeur du work-men
Qu'appelez-vous processus , d'après ma compréhension il y a un processus serveur par connexion client , dans mon cas j'ai donc aux max 10 processus serveur qui peuvent consommer au max jusqu'à' 512M chacun. Mon client hibernate n'effectue des opérations synchones sur postgres, donc je ne devrais pas arriver à 40 Gigas !!!, mais au max à 5 gigas ?
mon effective_cache_size est positionné 699050 sur mon serveur de 10 gigas
Francis
"Avoir au minimum 8 jointures pour la moindre requête me laisse supposer qu'il y a un défaut de normalisation des tables."
Ce schéma est un schéma générique (avec de l'héritage) , qui est issue de la modélisation d'un schéma XSD très complexe, une dé-normalisation de ce schéma sera la dernière amélioration qui sera faite.
Je peux passer le shared_buffers à 2Go par contre c'est votre calcul sur le work-mem qui m'interpelle (8 opérations de hachage * 10 connexions * 512 Mo, ce qui indique au minimum 40 Go.) Je pensais que le work-mem etait alloué par process et non par opérations de hachage/tri/jointure pour un process !!! , si c'est le cas je dois réduire cette taille à 50Mo => 50 * 8 opérations (mini) * 10connexions => 4 gigas
est-ce correct ???
L'estimation de la bd est 50 Gigas pour 1M d'enreg pour 90 tables jointes , donc "potentiellement" je pourrais avoir des joins sur 90 tables, au max je table sur des jointures en moyenne entre 10 et 30 tables en fonction des clauses where positionnées.
Il y a aura toujours au minimum 8 tables jointées avant de commencer à ajouter les tables associées à la clause "where"
je n'ai pas de requête avec des clauses "d'order by " ces tris sont à posteriori en java
Le principe retenu pour les recherches dans cette BD est le suivant
1) recherche uniquement des ID en effectuant les clauses de jointure correspondant à la clause Where uniquement ....
2) puis à partir des IDs trouvés récupérer les attributs associés en parcourant les tables .....
Le choix de 512 pour le work_mem proviennent d'une série de tests afin d'éviter l'écriture de fichiers tempo sur disque.
Le choix du shared_buffers à seulement 1 Go provient d'un ratio par rapport à la RAM dispo sur ce serveur.
j'ai pris comme ratio 250Mb pour 2G Ram, 500Mb pour 4G Ram donc 1Go pour 8G Ram, en laissant de la place aux work_mem(s) des différents process connectés
Mais je peux les changer a des fins de tests
Je gère le pool de connexion via hibernate donc au max j'aurais 10 connexions permanentes entre hibernate et postgres
Mon serveur est un Quadri pro à 10 gigas de Ram dédié à Postgres donc au max j'occuperais 512 *10 + le shared buffer qui est positioné à 1 Gigas
Merci pour ces infos,
si je résume si je souhaite améliorer le temps de réponse de cette requête; il faut que
1) je positionne le paramètre log_temp_files = 0 et je vérifie si des fichiers temp sont crées et si oui j'augmente le work_mem qui est positionné à 512M actuellement
2) j'essaye la version 8.4
3) je dé-normalise le schéma conceptuel pour limiter les joins !!!
????
Merci, pour votre réponse, cette requête est générée par Hibernate et nous avons peu de latitude sur l'écriture des joins entre les tables (via les primary key)
Il est vrai que les clauses de filtrage sont sur le tables très 'à droite' dans les left join,ne sont pas très restrictives.
Les questions que je me pose
- est normal de passer 2s pour ramener 116 données sur 200.000 via cette requête. cette base doit a terme contenir 1 000.000 d'entrées, la stratégie devrait donc s'adapter en fonction des statistiques, en espérant que .ce temps vas rester stable avec l'augmentation du volume de la base
- les index sur les primary key sont des btree, je me sert de ces "primary key" pour effectuer des jointures entre les tables (via les joins) pourrais-je supprimer les index btree crées par postgres et les remplacer par des index Hash ... , y-a-t-il un intérêt ???
La passage en 8.4 est envisageable car cette BD part en prod a à fin de l'année., la passage de 8.3 à 8.4 necessite -t-il une migration de base ou le remplacement des exe suffit ??,
Autre demande d'explication si on lit l'explain
Hash Cond: ((mdmetadata0_1_.id)::text = (mdmetadata0_.id)::text)"
" -> Hash Left Join (cost=42890.11..71257.93 rows=192868 width=186) (actual time=1547.823..4117.267 rows=206718 loops=1)"
" -> Hash (cost=6456.20..6456.20 rows=223620 width=22)"
" -> Seq Scan on md_metadata mdmetadata0_ (cost=0.00..6456.20 rows=223620 width=22)"
cela signifie que
1) postgres fait un seq scan sur la table md_metadata mdmetadata0_
2) puis un Hash sur chaque identifiant trouvé ?? avec la table mdmetadata0_1_ sur l'ID
exact ???
merci encore pour votre réactivité
Bonjour , je suis nouveau sur le forum , mais j'aurais besoin d'une explication sur le resultat de cet explain qui est relatif à la requete sql suivante sur une base de données postgres 8.2.7 sous linux redhat 64 bits
le pb est le suivant pourquoi les index sur les primary key (crées de base par postgres) ne sont pas utilisés lors des jointures sur les join (la fin de la commande explain liste les seq scan )
Cette Requette rameme
===============
select mdmetadata0_.id as col_0_0_ from public.md_metadata mdmetadata0_
inner join public.mf_metadata mdmetadata0_1_ on mdmetadata0_.id=mdmetadata0_1_.id
left outer join public.content_info contentinf1_ on mdmetadata0_.id=contentinf1_.fk_metadata
left outer join public.mi_imagedesc contentinf1_1_ on contentinf1_.id=contentinf1_1_.id
left outer join public.mi_radarimagedesc contentinf1_2_ on contentinf1_.id=contentinf1_2_.id
left outer join public.mi_opticalimagedesc contentinf1_3_ on contentinf1_.id=contentinf1_3_.id
left outer join public.md_identification identifica2_ on mdmetadata0_.id=identifica2_.fk_md_metadata
left outer join public.md_dataidentification identifica2_1_ on identifica2_.id=identifica2_1_.id
left outer join public.catalog_id catalogid3_ on identifica2_1_.fk_catalog_id=catalogid3_.id
left outer join public.ex_temporalextent temporalex4_ on identifica2_.id=temporalex4_.fk_dataident
where contentinf1_1_.attribute_desc='DATASTRIP_SCENE' and catalogid3_.profile='LEVEL0' and (temporalex4_.begin_ between '2007-08-01' and '2007-08-30')
"
Durée totale d'exécution de la requête :2624 ms.
161 lignes récupérées.
explain analyse
==========
"Nested Loop (cost=52157.93..85267.26 rows=1 width=22) (actual time=1872.823..4964.971 rows=161 loops=1)"
" -> Hash Join (cost=52157.93..85266.60 rows=1 width=62) (actual time=1872.756..4961.346 rows=161 loops=1)"
" Hash Cond: ((identifica2_.id)::text = (temporalex4_.fk_dataident)::text)"
" -> Hash Join (cost=52141.56..84472.30 rows=207445 width=142) (actual time=1849.891..4842.327 rows=206718 loops=1)"
" Hash Cond: ((mdmetadata0_1_.id)::text = (mdmetadata0_.id)::text)"
" -> Hash Left Join (cost=42890.11..71257.93 rows=192868 width=186) (actual time=1547.823..4117.267 rows=206718 loops=1)"
" Hash Cond: ((contentinf1_.id)::text = (contentinf1_2_.id)::text)"
" -> Hash Left Join (cost=42877.41..70520.95 rows=192868 width=226) (actual time=1547.796..3901.386 rows=206718 loops=1)"
" Hash Cond: ((contentinf1_.id)::text = (contentinf1_3_.id)::text)"
" -> Hash Join (cost=35243.96..58789.05 rows=192868 width=226) (actual time=1254.870..3189.344 rows=206718 loops=1)"
" Hash Cond: ((identifica2_.id)::text = (identifica2_1_.id)::text)"
" -> Hash Join (cost=25911.51..45358.16 rows=192868 width=146) (actual time=922.453..2421.758 rows=206718 loops=1)"
" Hash Cond: ((contentinf1_.id)::text = (contentinf1_1_.id)::text)"
" -> Hash Join (cost=15000.19..30439.11 rows=207906 width=146) (actual time=603.148..1667.861 rows=223620 loops=1)"
" Hash Cond: ((mdmetadata0_1_.id)::text = (contentinf1_.fk_metadata)::text)"
" -> Hash Join (cost=7337.74..18181.87 rows=223620 width=84) (actual time=299.561..909.856 rows=223620 loops=1)"
" Hash Cond: ((identifica2_.fk_md_metadata)::text = (mdmetadata0_1_.id)::text)"
" -> Seq Scan on md_identification identifica2_ (cost=0.00..6092.20 rows=223620 width=62) (actual time=0.024..135.173 rows=223620 loops=1)"
" -> Hash (cost=4331.22..4331.22 rows=240522 width=22) (actual time=299.419..299.419 rows=240522 loops=1)"
" -> Seq Scan on mf_metadata mdmetadata0_1_ (cost=0.00..4331.22 rows=240522 width=22) (actual time=0.017..141.733 rows=240522 loops=1)"
" -> Hash (cost=4867.20..4867.20 rows=223620 width=62) (actual time=303.476..303.476 rows=223620 loops=1)"
" -> Seq Scan on content_info contentinf1_ (cost=0.00..4867.20 rows=223620 width=62) (actual time=0.030..140.080 rows=223620 loops=1)"
" -> Hash (cost=8318.25..8318.25 rows=207445 width=40) (actual time=319.188..319.188 rows=206718 loops=1)"
" -> Seq Scan on mi_imagedesc contentinf1_1_ (cost=0.00..8318.25 rows=207445 width=40) (actual time=0.035..176.583 rows=206718 loops=1)"
" Filter: ((attribute_desc)::text = 'DATASTRIP_SCENE'::text)"
" -> Hash (cost=6537.20..6537.20 rows=223620 width=80) (actual time=332.364..332.364 rows=223620 loops=1)"
" -> Seq Scan on md_dataidentification identifica2_1_ (cost=0.00..6537.20 rows=223620 width=80) (actual time=0.031..158.848 rows=223620 loops=1)"
" -> Hash (cost=4838.20..4838.20 rows=223620 width=40) (actual time=292.814..292.814 rows=223620 loops=1)"
" -> Seq Scan on mi_opticalimagedesc contentinf1_3_ (cost=0.00..4838.20 rows=223620 width=40) (actual time=0.026..139.493 rows=223620 loops=1)"
" -> Hash (cost=11.20..11.20 rows=120 width=90) (actual time=0.002..0.002 rows=0 loops=1)"
" -> Seq Scan on mi_radarimagedesc contentinf1_2_ (cost=0.00..11.20 rows=120 width=90) (actual time=0.001..0.001 rows=0 loops=1)"
" -> Hash (cost=6456.20..6456.20 rows=223620 width=22) (actual time=302.031..302.031 rows=223620 loops=1)"
" -> Seq Scan on md_metadata mdmetadata0_ (cost=0.00..6456.20 rows=223620 width=22) (actual time=0.017..152.591 rows=223620 loops=1)"
" -> Hash (cost=16.36..16.36 rows=1 width=40) (actual time=0.507..0.507 rows=181 loops=1)"
" -> Index Scan using ind_ex_temporalextent_begin_ on ex_temporalextent temporalex4_ (cost=0.00..16.36 rows=1 width=40) (actual time=0.088..0.320 rows=181 loops=1)"
" Index Cond: ((begin_ >= '2007-08-01 00:00:00'::timestamp without time zone) AND (begin_ <= '2007-08-30 00:00:00'::timestamp without time zone))"
" -> Index Scan using catalog_id_pkey on catalog_id catalogid3_ (cost=0.00..0.65 rows=1 width=40) (actual time=0.020..0.020 rows=1 loops=161)"
" Index Cond: ((identifica2_1_.fk_catalog_id)::text = (catalogid3_.id)::text)"
" Filter: ((profile)::text = 'LEVEL0'::text)"
"Total runtime: 4972.689 ms"
Merci d'avance