PEV2

PGSession - 21 Novembre 2019

Pierre Giraud

Il était une fois…

EXPLAIN

Et ses plans d’exécution…

  Limit  (cost=1.27..3878.21 rows=5 width=172) (actual time=0.245..2.544 rows=5 loops=1)
  ->  Nested Loop  (cost=1.27..48075.41 rows=62 width=172) (actual time=0.244..2.539 rows=5 loops=1)
        ->  Nested Loop  (cost=0.84..2420.02 rows=65 width=85) (actual time=0.137..0.151 rows=5 loops=1)
              ->  Nested Loop  (cost=0.42..2356.20 rows=5 width=85) (actual time=0.118..0.119 rows=1 loops=1)
                    ->  Seq Scan on top_challenge_list  (cost=0.00..30.26 rows=58 width=57) (actual time=0.036..0.043 rows=4 loops=1)
                          Filter: (is_active AND ((template_challenge)::text = 'top_turnover'::text))
                          Rows Removed by Filter: 26
                    ->  Index Scan using ref_people_xperf1 on ref_people  (cost=0.42..40.09 rows=1 width=28) (actual time=0.017..0.017 rows=0 loops=4)
                          Index Cond: (id_int = top_challenge_list.id_int_manager)
                          Filter: (is_active AND (id_statut <> 2) AND (COALESCE(id_qualification, 1) >= 1) AND (id_type = 5))
                          Rows Removed by Filter: 4
              ->  Index Scan using ref_genealogy_xperf5 on ref_genealogy  (cost=0.42..12.56 rows=20 width=8) (actual time=0.017..0.026 rows=5 loops=1)
                    Index Cond: (id_int = ref_people.id_int)
                    Filter: is_active
        ->  Index Scan using ref_people_xperf1 on ref_people filleuls  (cost=0.42..0.82 rows=1 width=47) (actual time=0.012..0.030 rows=1 loops=5)
              Index Cond: (id_int = ref_genealogy.id_int_level)
              Filter: (is_active AND (id_type = ANY ('{5,14}'::integer[])))
              Rows Removed by Filter: 7
        SubPlan 1
          ->  Aggregate  (cost=361.46..361.47 rows=1 width=8) (actual time=0.233..0.233 rows=1 loops=5)
                ->  Index Scan using ref_transaction_xperf4 on ref_transaction  (cost=0.42..361.46 rows=1 width=8) (actual time=0.155..0.229 rows=0 loops=5)
                      Index Cond: (id_int_agent_out = filleuls.id_int)
                      Filter: (is_active AND (date_acte IS NOT NULL) AND (date_acte >= top_challenge_list.date_deb_challenge) AND (date_acte <= top_challenge_list.date_fin_challenge) AND (id_type_transaction = 1))
                      Rows Removed by Filter: 100
        SubPlan 2
          ->  Aggregate  (cost=373.99..374.00 rows=1 width=8) (actual time=0.177..0.178 rows=1 loops=5)
                ->  Index Scan using ref_transaction_xperf3 on ref_transaction ref_transaction_1  (cost=0.42..373.99 rows=1 width=8) (actual time=0.117..0.174 rows=0 loops=5)
                      Index Cond: (id_int_agent_in = filleuls.id_int)
                      Filter: (is_active AND (date_acte IS NOT NULL) AND (date_acte >= top_challenge_list.date_deb_challenge) AND (date_acte <= top_challenge_list.date_fin_challenge) AND (id_type_transaction = 1))
                      Rows Removed by Filter: 102
Planning Time: 2.916 ms
Execution Time: 2.900 ms

Pas facile à lire, hein ?

explain.depesz.com

explain.depesz.com

  • Existe depuis longtemps,
  • Largement reconnu et utilisé,
  • Maintenu (développement actif),
  • Pratique et simple.

explain.depesz.com

Seulement voilà…

  • Pas très sexy,
  • Affichage limité,
  • Pas intégrable,
  • Sur le web.

PEV

Postgres Explain Visualizer

tatiyants.com/pev

tatiyants.com/pev

  • Plébicité (github 2.3k ★),
  • Sexy, moderne,
  • Mise en évidence des informations,
  • Pas de stockage.

tatiyants.com/pev

Seulement voilà…

  • Abandonné,
  • Pas intégrable.

Les besoins

  • Intégration dans d’autres outils (TemBoard, DebugToolbar)
  • Mise à jour (versions de PostgreSQL)
  • Ajout fonctionnalités

Décision

POC réécriture de PEV

➜ très rapide car code bien écrit

Please Welcome PEV2!

dalibo.github.io/pev2

PEV2

Nouvelles fonctionnalités & différences

Text Parsing

“ Si c’est pas capable de lire un plan au format TEXT, j’m’en servirai pas. ”
Guillaume L.

View Options

Parallelism

Mise en évidence

(PEV était limité aux superlatifs)

Utilisation comme composant

Disponible sur NPM

Intégration

(résumé)

Intégration

Intégration

Application de démo dans le dépôt github.

dalibo.github.io/pev2

fonctionne dans le navigateur, pas de rétention

Intégration

À partager

explain.dalibo.com

Brought to you with ♥ by Dalibo ;-)

explain.dalibo.com

Vous pouvez envoyer vos plans en POST.

$ curl -Ls -w %{url_effective} -d '{"plan":"Result (cost=0.00..0.01 rows=1 width=32)"}'
-H "Content-Type: application/json" -X POST https://explain.dalibo.com/new
-o /dev/null | xargs xdg-open

À venir

Diagramme (vue synthétique)

Feedbacks and contributions are welcome!

Pierre Giraud

DALIBO

github logo PEV2 on github

github logo pgira