diff --git a/source/concept/bdd/generic.md b/source/concept/bdd/generic.md index 66f907e5b2c6da31191af74b54941f32055de071..9fd99b0943c7234b315cb826c791a82c39aab8ec 100644 --- a/source/concept/bdd/generic.md +++ b/source/concept/bdd/generic.md @@ -56,7 +56,7 @@ Dans le cas de GTF, une base sqlite est également exploitée dans certains cas. FME permet de manipuler la quasi totalité des différent SGBDR ou noSQL. -## Terminologie courante +## Terminologies courantes - Table : Une table est une structure fondamentale dans une base de données relationnelle. Elle est composée de lignes et de colonnes et représente une entité ou un concept spécifique. Par exemple, une table "Utilisateurs" peut contenir des informations telles que les noms, les adresses e-mail et les identifiants des utilisateurs. @@ -148,6 +148,8 @@ Utiliser le type jsonb à la place du type json classique, le jsonb facilite cer Tous les objets défini dans le modèle devront appartenir à l'utilisateur u_vitis (spécificité lié au fonctionnement des RDS sur AWS). +On ne supprime pas de colonne sur une table ou une vue (ou les tables ou vue elle-même d'ailleurs) qui a été publiée en Prod chez un client de façon à préserver la rétro-compatibilité des données. + # Manipulation des données ## Langage de requête structuré (SQL) @@ -326,16 +328,16 @@ Voici un exemple pour illustrer l'utilisation de l'opérateur de fenêtrage : Supposons que nous ayons une table "Sales" qui enregistre les ventes réalisées par différents vendeurs dans une entreprise, avec les colonnes "SalesID", "Salesperson", "Product", "Amount" et "Date". Nous voulons calculer la somme cumulative des ventes de chaque vendeur, triées par date de vente. ```sql -SELECT SalesID, Salesperson, Product, Amount, Date, - SUM(Amount) OVER (PARTITION BY Salesperson ORDER BY Date) AS CumulativeAmount +SELECT SalesID, vendeur, produit, montant, Date, + SUM(montant) OVER (PARTITION BY vendeur ORDER BY Date) AS CumulativeAmount FROM Sales ``` -Dans cet exemple, nous utilisons l'opérateur de fenêtrage avec la fonction d'agrégation SUM pour calculer la somme cumulative des ventes (Amount) pour chaque vendeur (Salesperson), en les triant par date de vente (Date). +Dans cet exemple, nous utilisons l'opérateur de fenêtrage avec la fonction d'agrégation SUM pour calculer la somme cumulative des ventes (Amount) pour chaque vendeur (vendeur), en les triant par date de vente (Date). La clause OVER spécifie la fenêtre de calcul, tandis que la clause PARTITION BY définit la partition des données par vendeur. Ainsi, la somme cumulative sera calculée séparément pour chaque vendeur. -En utilisant cet opérateur de fenêtrage, la requête renverra les détails des ventes (SalesID, Salesperson, Product, Amount, Date) ainsi que la somme cumulative (CumulativeAmount) pour chaque vendeur, avec les résultats triés par date de vente. +En utilisant cet opérateur de fenêtrage, la requête renverra les détails des ventes (SalesID, vendeur, produit, montant, Date) ainsi que la somme cumulative (CumulativeAmount) pour chaque vendeur, avec les résultats triés par date de vente. L'opérateur de fenêtrage est extrêmement utile pour effectuer des calculs analytiques avancés, tels que les sommes cumulatives, les moyennes mobiles, les rangs, les pourcentages, etc. Il permet de réaliser des analyses plus précises sur des ensembles de données spécifiques, sans avoir besoin de regrouper ou de modifier la structure de la requête principale. diff --git a/source/tools/pg/images/explain_example.svg b/source/tools/pg/images/explain_example.svg new file mode 100644 index 0000000000000000000000000000000000000000..df7f6e91a24a5ed07764325c19fcf64ea62c0f27 --- /dev/null +++ b/source/tools/pg/images/explain_example.svg @@ -0,0 +1,213 @@ +<svg height="2420" width="1050" version="1.1" xmlns="https://www.w3.org/2000/svg"><defs><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr1"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr2"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr3"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr4"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr5"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr6"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr7"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr8"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr9"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr10"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr11"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr12"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr13"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr14"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr15"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr16"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr17"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr18"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker><marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10" orient="auto" refX="0" refY="2.5" id="arr19"><polygon points="0,0,0,5,10,2.5,0,0" fill="rgba(0, 0, 0, 0.87)"></polygon></marker></defs><g transform="matrix(1,0,0,1,0,0)"><rect x="0" y="0" width="1050" height="2420" rx="5" ry="5" fill="#fafafa"></rect><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ze2ZpbGw6bm9uZTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0xe3N0cm9rZTojNjY2YmQxO30uY2xzLTJ7ZmlsbDojNjY2YmQxO30uY2xzLTN7c3Ryb2tlOiM4ZDgxMTk7fS5jbHMtNHtmaWxsOiM4ZDgxMTk7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5leF9uZXN0ZWQ8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE3LjIzLDIwYTYsNiwwLDAsMSw2LTZoMjJhNiw2LDAsMCwxLDYsNlY0NGE2LDYsMCwwLDEtNiw2aC0yMmE2LDYsMCwwLDEtNi02VjMyLjI3Ii8+PHBvbHlnb24gY2xhc3M9ImNscy0yIiBwb2ludHM9IjE3LjIzIDI3LjMxIDEyLjc3IDMzLjI2IDIxLjY4IDMzLjI2IDE3LjIzIDI3LjMxIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMjQuMjMsMjVjMC0zLjMuNy00LDQtNGgxMmMzLjMsMCw0LC43LDQsNFYzOWMwLDMuMy0uNyw0LTQsNEgyOC43MmMtMy4zLDAtNC0uNy00LTRWMzMuNzIiLz48cG9seWdvbiBjbGFzcz0iY2xzLTQiIHBvaW50cz0iMjQuNjcgMzEuMzQgMjAuNzEgMzYuMSAyOC4yMyAzNi4xIDI0LjY3IDMxLjM0Ii8+PC9zdmc+" preserveAspectRatio="none" x="950" y="50" width="50" height="50" style="cursor:pointer"><title>Node Type: Nested Loop +Parallel Aware: false +Async Capable: false +Join Type: Left +Actual Rows: 1 +Actual Loops: 1 +Inner Unique: true +loops: 1 +</title></image><text x="980" y="120" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>Nested Loop Left</tspan><tspan dy="1.2em" x="980">Join</tspan></text></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ze2ZpbGw6bm9uZTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0xe3N0cm9rZTojNjY2YmQxO30uY2xzLTJ7ZmlsbDojNjY2YmQxO30uY2xzLTN7c3Ryb2tlOiM4ZDgxMTk7fS5jbHMtNHtmaWxsOiM4ZDgxMTk7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5leF9uZXN0ZWQ8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE3LjIzLDIwYTYsNiwwLDAsMSw2LTZoMjJhNiw2LDAsMCwxLDYsNlY0NGE2LDYsMCwwLDEtNiw2aC0yMmE2LDYsMCwwLDEtNi02VjMyLjI3Ii8+PHBvbHlnb24gY2xhc3M9ImNscy0yIiBwb2ludHM9IjE3LjIzIDI3LjMxIDEyLjc3IDMzLjI2IDIxLjY4IDMzLjI2IDE3LjIzIDI3LjMxIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMjQuMjMsMjVjMC0zLjMuNy00LDQtNGgxMmMzLjMsMCw0LC43LDQsNFYzOWMwLDMuMy0uNyw0LTQsNEgyOC43MmMtMy4zLDAtNC0uNy00LTRWMzMuNzIiLz48cG9seWdvbiBjbGFzcz0iY2xzLTQiIHBvaW50cz0iMjQuNjcgMzEuMzQgMjAuNzEgMzYuMSAyOC4yMyAzNi4xIDI0LjY3IDMxLjM0Ii8+PC9zdmc+" preserveAspectRatio="none" x="650" y="50" width="50" height="50" style="cursor:pointer"><title>Node Type: Nested Loop +Parent Relationship: Outer +Parallel Aware: false +Async Capable: false +Join Type: Left +Actual Rows: 1 +Actual Loops: 1 +Inner Unique: true +Join Filter: ("user".domain_id = domain.domain_id) +Rows Removed by Join Filter: 0 +loops: 1 +</title></image><text x="680" y="120" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>Nested Loop Left</tspan><tspan dy="1.2em" x="680">Join</tspan></text><line x1="725" x2="788.3333333333334" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="787.3333333333334" x2="851.6666666666666" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="851.6666666666666" x2="915" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr2")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ze2ZpbGw6bm9uZTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0xe3N0cm9rZTojNjY2YmQxO30uY2xzLTJ7ZmlsbDojNjY2YmQxO30uY2xzLTN7c3Ryb2tlOiM4ZDgxMTk7fS5jbHMtNHtmaWxsOiM4ZDgxMTk7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5leF9uZXN0ZWQ8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE3LjIzLDIwYTYsNiwwLDAsMSw2LTZoMjJhNiw2LDAsMCwxLDYsNlY0NGE2LDYsMCwwLDEtNiw2aC0yMmE2LDYsMCwwLDEtNi02VjMyLjI3Ii8+PHBvbHlnb24gY2xhc3M9ImNscy0yIiBwb2ludHM9IjE3LjIzIDI3LjMxIDEyLjc3IDMzLjI2IDIxLjY4IDMzLjI2IDE3LjIzIDI3LjMxIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMjQuMjMsMjVjMC0zLjMuNy00LDQtNGgxMmMzLjMsMCw0LC43LDQsNFYzOWMwLDMuMy0uNyw0LTQsNEgyOC43MmMtMy4zLDAtNC0uNy00LTRWMzMuNzIiLz48cG9seWdvbiBjbGFzcz0iY2xzLTQiIHBvaW50cz0iMjQuNjcgMzEuMzQgMjAuNzEgMzYuMSAyOC4yMyAzNi4xIDI0LjY3IDMxLjM0Ii8+PC9zdmc+" preserveAspectRatio="none" x="350" y="50" width="50" height="50" style="cursor:pointer"><title>Node Type: Nested Loop +Parent Relationship: Outer +Parallel Aware: false +Async Capable: false +Join Type: Left +Actual Rows: 1 +Actual Loops: 1 +Inner Unique: true +loops: 1 +</title></image><text x="380" y="120" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>Nested Loop Left</tspan><tspan dy="1.2em" x="380">Join</tspan></text><line x1="425" x2="488.3333333333333" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="487.3333333333333" x2="551.6666666666666" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="551.6666666666666" x2="615" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr3")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="50" y="50" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: Outer +Parallel Aware: false +Async Capable: false +Relation Name: user +Alias: user +Actual Rows: 1 +Actual Loops: 1 +Filter: (((login)::name = "current_user"()) OR s_vitis.is_vitis_admin()) +Rows Removed by Filter: 0 +loops: 1 +</title></image><text x="80" y="120" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>user</tspan></text><line x1="125" x2="188.33333333333334" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="187.33333333333334" x2="251.66666666666669" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="251.66666666666669" x2="315" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr4")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojNzQ3NDc0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MC43NXB4O30uY2xzLTIsLmNscy04e2ZpbGw6I2YwZWNiNjt9LmNscy0ze2ZpbGw6I2MxOGYzNTt9LmNscy00e2ZpbGw6I2FkZGZmMzt9LmNscy01e2ZpbGw6IzI5ODBiOTt9LmNscy02e2ZpbGw6I2MxOGYzNjt9LmNscy03e29wYWNpdHk6MC44O30uY2xzLTh7c3Ryb2tlOiNjMThmMzY7c3Ryb2tlLW1pdGVybGltaXQ6MTA7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5leF9pbmRleF9zY2FuPC90aXRsZT48bGluZSBjbGFzcz0iY2xzLTEiIHgxPSIxMy44NSIgeTE9IjM2LjIzIiB4Mj0iMTkuMTIiIHkyPSI0NC43Ii8+PGxpbmUgY2xhc3M9ImNscy0xIiB4MT0iMTMuODUiIHkxPSIzNi4yMyIgeDI9IjE5LjA5IiB5Mj0iMjcuOTIiLz48bGluZSBjbGFzcz0iY2xzLTEiIHgxPSIyNy42NCIgeTE9IjQ0LjMzIiB4Mj0iMzUuNjQiIHkyPSI1MC4yMyIvPjxsaW5lIGNsYXNzPSJjbHMtMSIgeDE9IjI3LjY0IiB5MT0iNDQuMzMiIHgyPSIzNS42NCIgeTI9IjM4LjkyIi8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIxOS4yNiIgeT0iNDEuNjUiIHdpZHRoPSI3Ljk4IiBoZWlnaHQ9IjUuNjkiIHJ4PSIxLjUiIHJ5PSIxLjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yNS43NSw0Mi4xNWEzLjU0LDMuNTQsMCwwLDEsLjkuMDdoMGEyLjQsMi40LDAsMCwxLC4xLjkzdjIuNjlhMy4xOCwzLjE4LDAsMCwxLS4wOC45cy0uMTkuMS0uOTIuMWgtNWEzLjExLDMuMTEsMCwwLDEtLjktLjA4aDBhMi4yNSwyLjI1LDAsMCwxLS4xLS45MlY0My4xNWEzLjE4LDMuMTgsMCwwLDEsLjA4LS45cy4xOS0uMS45Mi0uMWg1bTAtMWgtNWMtMS42NSwwLTIsLjM1LTIsMnYyLjY5YzAsMS42NS4zNSwyLDIsMmg1YzEuNjUsMCwyLS4zNSwyLTJWNDMuMTVjMC0xLjY1LS4zNS0yLTItMloiLz48bGluZSBjbGFzcz0iY2xzLTEiIHgxPSIyNy42NCIgeTE9IjI3LjgzIiB4Mj0iMzUuNjQiIHkyPSIzMy43MyIvPjxsaW5lIGNsYXNzPSJjbHMtMSIgeDE9IjI3LjY0IiB5MT0iMjcuODMiIHgyPSIzNS42NCIgeTI9IjIyLjQyIi8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIxOS4yNiIgeT0iMjUuMTUiIHdpZHRoPSI3Ljk4IiBoZWlnaHQ9IjUuNjkiIHJ4PSIxLjUiIHJ5PSIxLjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yNS43NSwyNS42NWEzLjU0LDMuNTQsMCwwLDEsLjkuMDdoMGEyLjQsMi40LDAsMCwxLC4xLjkzdjIuNjlhMy4xOCwzLjE4LDAsMCwxLS4wOC45cy0uMTkuMS0uOTIuMWgtNWEzLjExLDMuMTEsMCwwLDEtLjktLjA4aDBhMi4yNSwyLjI1LDAsMCwxLS4xLS45MlYyNi42NWEzLjE4LDMuMTgsMCwwLDEsLjA4LS45cy4xOS0uMS45Mi0uMWg1bTAtMWgtNWMtMS42NSwwLTIsLjM1LTIsMnYyLjY5YzAsMS42NS4zNSwyLDIsMmg1YzEuNjUsMCwyLS4zNSwyLTJWMjYuNjVjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik02LjYxLDQwLjg5Yy0xLjM4LDAtMS41LS4xMy0xLjUtMS41VjM1LjJoOHY0LjE5YzAsMS4zNy0uMTMsMS41LTEuNSwxLjVaIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMTIuNTksMzUuN3YzLjY5YTIuNywyLjcsMCwwLDEtLjA4LjlzLS4xOS4xLS45Mi4xaC01YTMsMywwLDAsMS0uOS0uMDhoMGEyLjQ1LDIuNDUsMCwwLDEtLjA5LS45MlYzNS43aDdtMS0xaC05djQuNjljMCwxLjY1LjM1LDIsMiwyaDVjMS42NSwwLDItLjM1LDItMlYzNC43WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMTEsMzUuMjZWMzMuMDdjMC0xLjM4LjEyLTEuNSwxLjUtMS41aDVjMS4zNywwLDEuNS4xMiwxLjUsMS41djIuMTlaIi8+PHBhdGggY2xhc3M9ImNscy01IiBkPSJNMTEuNTksMzIuMDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjEuNjloLTdWMzMuMDdhMy43MSwzLjcxLDAsMCwxLC4wNy0uOSwyLjE2LDIuMTYsMCwwLDEsLjkzLS4xaDVtMC0xaC01Yy0xLjY1LDAtMiwuMzUtMiwydjIuNjloOVYzMy4wN2MwLTEuNjUtLjM1LTItMi0yWiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTM1Ljc0LDUzLjQ3Yy0xLjM4LDAtMS41LS4xMi0xLjUtMS41VjE5LjUzSDU4Ljg5VjUyYzAsMS4zOC0uMTMsMS41LTEuNSwxLjVaIi8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNNTguMzksMjBWNTJhMi43LDIuNywwLDAsMS0uMDguOXMtLjE5LjEtLjkyLjFIMzUuNzRhMy41NCwzLjU0LDAsMCwxLS45LS4wN2gwYTIuMTYsMi4xNiwwLDAsMS0uMS0uOTNWMjBINTguMzltMS0xSDMzLjc0VjUyYzAsMS42NS4zNSwyLDIsMkg1Ny4zOWMxLjY1LDAsMi0uMzUsMi0yVjE5WiIvPjxnIGNsYXNzPSJjbHMtNyI+PGxpbmUgY2xhc3M9ImNscy04IiB4MT0iNDIuNDQiIHkxPSI1Mi45NyIgeDI9IjQyLjQ0IiB5Mj0iMTkuOTciLz48bGluZSBjbGFzcz0iY2xzLTgiIHgxPSI1MC42MyIgeTE9IjUyLjk3IiB4Mj0iNTAuNjMiIHkyPSIxOS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtOCIgeDE9IjM0LjczIiB5MT0iMjcuOTciIHgyPSI1OC4zNyIgeTI9IjI3Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy04IiB4MT0iMzQuNzMiIHkxPSIzNi4zNCIgeDI9IjU4LjM3IiB5Mj0iMzYuMzQiLz48bGluZSBjbGFzcz0iY2xzLTgiIHgxPSIzNC43MyIgeTE9IjQ0LjcxIiB4Mj0iNTguMzciIHkyPSI0NC43MSIvPjwvZz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik01MC43LDE5LjUzdi05aDYuNjljMS4zOCwwLDEuNS4xMiwxLjUsMS41djcuNVoiLz48cGF0aCBjbGFzcz0iY2xzLTUiIGQ9Ik01Ny4zOSwxMWEzLjQ0LDMuNDQsMCwwLDEsLjkuMDdoMGEyLjYyLDIuNjIsMCwwLDEsLjA5LjkzdjdINTEuMlYxMWg2LjE5bTAtMUg1MC4yVjIwaDkuMTlWMTJjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0zNC4yMywxOS41M1YxMmMwLTEuMzguMTMtMS41LDEuNS0xLjVoNi43djlaIi8+PHBhdGggY2xhc3M9ImNscy01IiBkPSJNNDEuOTMsMTF2OGgtNy4yVjEyYTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWMTBaIi8+PHJlY3QgY2xhc3M9ImNscy00IiB4PSI0Mi40NSIgeT0iMTAuNTMiIHdpZHRoPSI4LjE3IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTUiIGQ9Ik01MC4xMiwxMXY4SDQzVjExaDcuMTdtMS0xSDQyVjIwaDkuMTdWMTBaIi8+PC9zdmc+" preserveAspectRatio="none" x="50" y="210" width="50" height="50" style="cursor:pointer"><title>Node Type: Index Scan +Parent Relationship: Inner +Parallel Aware: false +Async Capable: false +Scan Direction: Forward +Index Name: pk_billinggroup_id +Relation Name: billinggroup +Alias: billinggroup +Actual Rows: 0 +Actual Loops: 1 +Index Cond: (billinggroup_id = "user".billinggroup_id) +Rows Removed by Index Recheck: 0 +loops: 1 +</title></image><text x="80" y="280" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pk_billinggroup_id</tspan></text><line x1="125" x2="188.33333333333334" y1="235" y2="235" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="187.33333333333334" x2="251.66666666666669" y1="235" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="251.66666666666669" x2="315" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr5")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="350" y="370" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: Inner +Parallel Aware: false +Async Capable: false +Relation Name: domain +Alias: domain +Actual Rows: 0 +Actual Loops: 1 +loops: 1 +</title></image><text x="380" y="440" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>domain</tspan></text><line x1="425" x2="488.3333333333333" y1="395" y2="395" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="487.3333333333333" x2="551.6666666666666" y1="395" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="551.6666666666666" x2="615" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr6")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTF7ZmlsbDpub25lO3N0cm9rZTojNzQ3NDc0O3N0cm9rZS1saW5lY2FwOnJvdW5kO3N0cm9rZS1saW5lam9pbjpyb3VuZDtzdHJva2Utd2lkdGg6MC43NXB4O30uY2xzLTIsLmNscy04e2ZpbGw6I2YwZWNiNjt9LmNscy0ze2ZpbGw6I2MxOGYzNTt9LmNscy00e2ZpbGw6I2FkZGZmMzt9LmNscy01e2ZpbGw6IzI5ODBiOTt9LmNscy02e2ZpbGw6I2MxOGYzNjt9LmNscy03e29wYWNpdHk6MC44O30uY2xzLTh7c3Ryb2tlOiNjMThmMzY7c3Ryb2tlLW1pdGVybGltaXQ6MTA7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5leF9pbmRleF9zY2FuPC90aXRsZT48bGluZSBjbGFzcz0iY2xzLTEiIHgxPSIxMy44NSIgeTE9IjM2LjIzIiB4Mj0iMTkuMTIiIHkyPSI0NC43Ii8+PGxpbmUgY2xhc3M9ImNscy0xIiB4MT0iMTMuODUiIHkxPSIzNi4yMyIgeDI9IjE5LjA5IiB5Mj0iMjcuOTIiLz48bGluZSBjbGFzcz0iY2xzLTEiIHgxPSIyNy42NCIgeTE9IjQ0LjMzIiB4Mj0iMzUuNjQiIHkyPSI1MC4yMyIvPjxsaW5lIGNsYXNzPSJjbHMtMSIgeDE9IjI3LjY0IiB5MT0iNDQuMzMiIHgyPSIzNS42NCIgeTI9IjM4LjkyIi8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIxOS4yNiIgeT0iNDEuNjUiIHdpZHRoPSI3Ljk4IiBoZWlnaHQ9IjUuNjkiIHJ4PSIxLjUiIHJ5PSIxLjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yNS43NSw0Mi4xNWEzLjU0LDMuNTQsMCwwLDEsLjkuMDdoMGEyLjQsMi40LDAsMCwxLC4xLjkzdjIuNjlhMy4xOCwzLjE4LDAsMCwxLS4wOC45cy0uMTkuMS0uOTIuMWgtNWEzLjExLDMuMTEsMCwwLDEtLjktLjA4aDBhMi4yNSwyLjI1LDAsMCwxLS4xLS45MlY0My4xNWEzLjE4LDMuMTgsMCwwLDEsLjA4LS45cy4xOS0uMS45Mi0uMWg1bTAtMWgtNWMtMS42NSwwLTIsLjM1LTIsMnYyLjY5YzAsMS42NS4zNSwyLDIsMmg1YzEuNjUsMCwyLS4zNSwyLTJWNDMuMTVjMC0xLjY1LS4zNS0yLTItMloiLz48bGluZSBjbGFzcz0iY2xzLTEiIHgxPSIyNy42NCIgeTE9IjI3LjgzIiB4Mj0iMzUuNjQiIHkyPSIzMy43MyIvPjxsaW5lIGNsYXNzPSJjbHMtMSIgeDE9IjI3LjY0IiB5MT0iMjcuODMiIHgyPSIzNS42NCIgeTI9IjIyLjQyIi8+PHJlY3QgY2xhc3M9ImNscy0yIiB4PSIxOS4yNiIgeT0iMjUuMTUiIHdpZHRoPSI3Ljk4IiBoZWlnaHQ9IjUuNjkiIHJ4PSIxLjUiIHJ5PSIxLjUiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0yNS43NSwyNS42NWEzLjU0LDMuNTQsMCwwLDEsLjkuMDdoMGEyLjQsMi40LDAsMCwxLC4xLjkzdjIuNjlhMy4xOCwzLjE4LDAsMCwxLS4wOC45cy0uMTkuMS0uOTIuMWgtNWEzLjExLDMuMTEsMCwwLDEtLjktLjA4aDBhMi4yNSwyLjI1LDAsMCwxLS4xLS45MlYyNi42NWEzLjE4LDMuMTgsMCwwLDEsLjA4LS45cy4xOS0uMS45Mi0uMWg1bTAtMWgtNWMtMS42NSwwLTIsLjM1LTIsMnYyLjY5YzAsMS42NS4zNSwyLDIsMmg1YzEuNjUsMCwyLS4zNSwyLTJWMjYuNjVjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTIiIGQ9Ik02LjYxLDQwLjg5Yy0xLjM4LDAtMS41LS4xMy0xLjUtMS41VjM1LjJoOHY0LjE5YzAsMS4zNy0uMTMsMS41LTEuNSwxLjVaIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMTIuNTksMzUuN3YzLjY5YTIuNywyLjcsMCwwLDEtLjA4LjlzLS4xOS4xLS45Mi4xaC01YTMsMywwLDAsMS0uOS0uMDhoMGEyLjQ1LDIuNDUsMCwwLDEtLjA5LS45MlYzNS43aDdtMS0xaC05djQuNjljMCwxLjY1LjM1LDIsMiwyaDVjMS42NSwwLDItLjM1LDItMlYzNC43WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTUuMTEsMzUuMjZWMzMuMDdjMC0xLjM4LjEyLTEuNSwxLjUtMS41aDVjMS4zNywwLDEuNS4xMiwxLjUsMS41djIuMTlaIi8+PHBhdGggY2xhc3M9ImNscy01IiBkPSJNMTEuNTksMzIuMDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjEuNjloLTdWMzMuMDdhMy43MSwzLjcxLDAsMCwxLC4wNy0uOSwyLjE2LDIuMTYsMCwwLDEsLjkzLS4xaDVtMC0xaC01Yy0xLjY1LDAtMiwuMzUtMiwydjIuNjloOVYzMy4wN2MwLTEuNjUtLjM1LTItMi0yWiIvPjxwYXRoIGNsYXNzPSJjbHMtMiIgZD0iTTM1Ljc0LDUzLjQ3Yy0xLjM4LDAtMS41LS4xMi0xLjUtMS41VjE5LjUzSDU4Ljg5VjUyYzAsMS4zOC0uMTMsMS41LTEuNSwxLjVaIi8+PHBhdGggY2xhc3M9ImNscy02IiBkPSJNNTguMzksMjBWNTJhMi43LDIuNywwLDAsMS0uMDguOXMtLjE5LjEtLjkyLjFIMzUuNzRhMy41NCwzLjU0LDAsMCwxLS45LS4wN2gwYTIuMTYsMi4xNiwwLDAsMS0uMS0uOTNWMjBINTguMzltMS0xSDMzLjc0VjUyYzAsMS42NS4zNSwyLDIsMkg1Ny4zOWMxLjY1LDAsMi0uMzUsMi0yVjE5WiIvPjxnIGNsYXNzPSJjbHMtNyI+PGxpbmUgY2xhc3M9ImNscy04IiB4MT0iNDIuNDQiIHkxPSI1Mi45NyIgeDI9IjQyLjQ0IiB5Mj0iMTkuOTciLz48bGluZSBjbGFzcz0iY2xzLTgiIHgxPSI1MC42MyIgeTE9IjUyLjk3IiB4Mj0iNTAuNjMiIHkyPSIxOS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtOCIgeDE9IjM0LjczIiB5MT0iMjcuOTciIHgyPSI1OC4zNyIgeTI9IjI3Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy04IiB4MT0iMzQuNzMiIHkxPSIzNi4zNCIgeDI9IjU4LjM3IiB5Mj0iMzYuMzQiLz48bGluZSBjbGFzcz0iY2xzLTgiIHgxPSIzNC43MyIgeTE9IjQ0LjcxIiB4Mj0iNTguMzciIHkyPSI0NC43MSIvPjwvZz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik01MC43LDE5LjUzdi05aDYuNjljMS4zOCwwLDEuNS4xMiwxLjUsMS41djcuNVoiLz48cGF0aCBjbGFzcz0iY2xzLTUiIGQ9Ik01Ny4zOSwxMWEzLjQ0LDMuNDQsMCwwLDEsLjkuMDdoMGEyLjYyLDIuNjIsMCwwLDEsLjA5LjkzdjdINTEuMlYxMWg2LjE5bTAtMUg1MC4yVjIwaDkuMTlWMTJjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTQiIGQ9Ik0zNC4yMywxOS41M1YxMmMwLTEuMzguMTMtMS41LDEuNS0xLjVoNi43djlaIi8+PHBhdGggY2xhc3M9ImNscy01IiBkPSJNNDEuOTMsMTF2OGgtNy4yVjEyYTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWMTBaIi8+PHJlY3QgY2xhc3M9ImNscy00IiB4PSI0Mi40NSIgeT0iMTAuNTMiIHdpZHRoPSI4LjE3IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTUiIGQ9Ik01MC4xMiwxMXY4SDQzVjExaDcuMTdtMS0xSDQyVjIwaDkuMTdWMTBaIi8+PC9zdmc+" preserveAspectRatio="none" x="650" y="530" width="50" height="50" style="cursor:pointer"><title>Node Type: Index Scan +Parent Relationship: Inner +Parallel Aware: false +Async Capable: false +Scan Direction: Forward +Index Name: pk_formatdate_id +Relation Name: rt_formatdate +Alias: rt_formatdate +Actual Rows: 1 +Actual Loops: 1 +Index Cond: ((formatdate_id)::text = ("user".formatdate_id)::text) +Rows Removed by Index Recheck: 0 +loops: 1 +</title></image><text x="680" y="600" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pk_formatdate_id</tspan></text><line x1="725" x2="788.3333333333334" y1="555" y2="555" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="787.3333333333334" x2="851.6666666666666" y1="555" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="851.6666666666666" x2="915" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr7")"></line></g><g><rect x="225" y="290" width="500" height="1185" rx="5" stroke="#444444" stroke-width="1.2" fill="gray" fill-opacity="0.2" pointer-events="none"></rect><tspan x="437.5" y="505" font-size="15px" text-anchor="start" fill="red">SubPlan 2</tspan><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ze2ZpbGw6bm9uZTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0xe3N0cm9rZTojNjY2YmQxO30uY2xzLTJ7ZmlsbDojNjY2YmQxO30uY2xzLTN7c3Ryb2tlOiM4ZDgxMTk7fS5jbHMtNHtmaWxsOiM4ZDgxMTk7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5leF9uZXN0ZWQ8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE3LjIzLDIwYTYsNiwwLDAsMSw2LTZoMjJhNiw2LDAsMCwxLDYsNlY0NGE2LDYsMCwwLDEtNiw2aC0yMmE2LDYsMCwwLDEtNi02VjMyLjI3Ii8+PHBvbHlnb24gY2xhc3M9ImNscy0yIiBwb2ludHM9IjE3LjIzIDI3LjMxIDEyLjc3IDMzLjI2IDIxLjY4IDMzLjI2IDE3LjIzIDI3LjMxIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMjQuMjMsMjVjMC0zLjMuNy00LDQtNGgxMmMzLjMsMCw0LC43LDQsNFYzOWMwLDMuMy0uNyw0LTQsNEgyOC43MmMtMy4zLDAtNC0uNy00LTRWMzMuNzIiLz48cG9seWdvbiBjbGFzcz0iY2xzLTQiIHBvaW50cz0iMjQuNjcgMzEuMzQgMjAuNzEgMzYuMSAyOC4yMyAzNi4xIDI0LjY3IDMxLjM0Ii8+PC9zdmc+" preserveAspectRatio="none" x="650" y="715" width="50" height="50" style="cursor:pointer"><title>Node Type: Nested Loop +Parent Relationship: SubPlan +Subplan Name: SubPlan 2 +Parallel Aware: false +Async Capable: false +Join Type: Inner +Actual Rows: 2 +Actual Loops: 1 +Inner Unique: false +Join Filter: (pg_authid_1.oid = ANY ((SubPlan 1))) +Rows Removed by Join Filter: 0 +loops: 1 +</title></image><text x="680" y="785" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>Nested Loop Inner</tspan><tspan dy="1.2em" x="680">Join</tspan></text><line x1="725" x2="788.3333333333334" y1="740" y2="740" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="787.3333333333334" x2="851.6666666666666" y1="740" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="851.6666666666666" x2="915" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr8")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="325" y="715" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: Outer +Parallel Aware: false +Async Capable: false +Relation Name: pg_authid +Alias: pg_authid_1 +Actual Rows: 1 +Actual Loops: 1 +Filter: (("user".login)::name = rolname) +Rows Removed by Filter: 19 +loops: 1 +</title></image><text x="355" y="785" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pg_authid</tspan></text><line x1="400" x2="471.6666666666667" y1="740" y2="740" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="470.6666666666667" x2="543.3333333333334" y1="740" y2="740" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="543.3333333333334" x2="615" y1="740" y2="740" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr9")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="325" y="875" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: Inner +Parallel Aware: false +Async Capable: false +Relation Name: pg_authid +Alias: pg_authid +Actual Rows: 2 +Actual Loops: 1 +Filter: ((NOT rolcanlogin) AND ((rolname = 'vitis_admin'::name) OR (rolname = 'vitis_user'::name))) +Rows Removed by Filter: 18 +loops: 1 +</title></image><text x="355" y="945" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pg_authid</tspan></text><line x1="400" x2="471.6666666666667" y1="900" y2="900" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="470.6666666666667" x2="543.3333333333334" y1="900" y2="740" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="543.3333333333334" x2="615" y1="740" y2="740" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr10")"></line></g><g><rect x="262.5" y="1005" width="137.5" height="1160" rx="5" stroke="#444444" stroke-width="1.2" fill="gray" fill-opacity="0.2" pointer-events="none"></rect><tspan x="293.75" y="1035" font-size="15px" text-anchor="start" fill="red">SubPlan 1</tspan><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="325" y="1060" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: SubPlan +Subplan Name: SubPlan 1 +Parallel Aware: false +Async Capable: false +Relation Name: pg_auth_members +Alias: pg_auth_members +Actual Rows: 2 +Actual Loops: 2 +Filter: (roleid = pg_authid.oid) +Rows Removed by Filter: 8 +loops: 1 +</title></image><text x="355" y="1130" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pg_auth_members</tspan></text><line x1="400" x2="471.6666666666667" y1="1085" y2="1085" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="470.6666666666667" x2="543.3333333333334" y1="1085" y2="740" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="543.3333333333334" x2="615" y1="740" y2="740" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr11")"></line></g><g><rect x="225" y="870" width="500" height="1765" rx="5" stroke="#444444" stroke-width="1.2" fill="gray" fill-opacity="0.2" pointer-events="none"></rect><tspan x="437.5" y="1085" font-size="15px" text-anchor="start" fill="red">SubPlan 4</tspan><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ze2ZpbGw6bm9uZTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0xe3N0cm9rZTojNjY2YmQxO30uY2xzLTJ7ZmlsbDojNjY2YmQxO30uY2xzLTN7c3Ryb2tlOiM4ZDgxMTk7fS5jbHMtNHtmaWxsOiM4ZDgxMTk7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5leF9uZXN0ZWQ8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE3LjIzLDIwYTYsNiwwLDAsMSw2LTZoMjJhNiw2LDAsMCwxLDYsNlY0NGE2LDYsMCwwLDEtNiw2aC0yMmE2LDYsMCwwLDEtNi02VjMyLjI3Ii8+PHBvbHlnb24gY2xhc3M9ImNscy0yIiBwb2ludHM9IjE3LjIzIDI3LjMxIDEyLjc3IDMzLjI2IDIxLjY4IDMzLjI2IDE3LjIzIDI3LjMxIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMjQuMjMsMjVjMC0zLjMuNy00LDQtNGgxMmMzLjMsMCw0LC43LDQsNFYzOWMwLDMuMy0uNyw0LTQsNEgyOC43MmMtMy4zLDAtNC0uNy00LTRWMzMuNzIiLz48cG9seWdvbiBjbGFzcz0iY2xzLTQiIHBvaW50cz0iMjQuNjcgMzEuMzQgMjAuNzEgMzYuMSAyOC4yMyAzNi4xIDI0LjY3IDMxLjM0Ii8+PC9zdmc+" preserveAspectRatio="none" x="650" y="1295" width="50" height="50" style="cursor:pointer"><title>Node Type: Nested Loop +Parent Relationship: SubPlan +Subplan Name: SubPlan 4 +Parallel Aware: false +Async Capable: false +Join Type: Inner +Actual Rows: 0 +Actual Loops: 0 +Inner Unique: false +Join Filter: (pg_authid_3.oid = ANY ((SubPlan 3))) +Rows Removed by Join Filter: 0 +loops: 1 +</title></image><text x="680" y="1365" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>Nested Loop Inner</tspan><tspan dy="1.2em" x="680">Join</tspan></text><line x1="725" x2="788.3333333333334" y1="1320" y2="1320" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="787.3333333333334" x2="851.6666666666666" y1="1320" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="851.6666666666666" x2="915" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr12")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="325" y="1295" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: Outer +Parallel Aware: false +Async Capable: false +Relation Name: pg_authid +Alias: pg_authid_3 +Actual Rows: 0 +Actual Loops: 0 +Filter: (("user".login)::name = rolname) +Rows Removed by Filter: 0 +loops: 0 +</title></image><text x="355" y="1365" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pg_authid</tspan></text><line x1="400" x2="471.6666666666667" y1="1320" y2="1320" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="470.6666666666667" x2="543.3333333333334" y1="1320" y2="1320" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="543.3333333333334" x2="615" y1="1320" y2="1320" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr13")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="325" y="1455" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: Inner +Parallel Aware: false +Async Capable: false +Relation Name: pg_authid +Alias: pg_authid_2 +Actual Rows: 0 +Actual Loops: 0 +Filter: ((NOT rolcanlogin) AND ((rolname = 'vitis_admin'::name) OR (rolname = 'vitis_user'::name))) +Rows Removed by Filter: 0 +loops: 0 +</title></image><text x="355" y="1525" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pg_authid</tspan></text><line x1="400" x2="471.6666666666667" y1="1480" y2="1480" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="470.6666666666667" x2="543.3333333333334" y1="1480" y2="1320" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="543.3333333333334" x2="615" y1="1320" y2="1320" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr14")"></line></g><g><rect x="262.5" y="1585" width="137.5" height="1740" rx="5" stroke="#444444" stroke-width="1.2" fill="gray" fill-opacity="0.2" pointer-events="none"></rect><tspan x="293.75" y="1615" font-size="15px" text-anchor="start" fill="red">SubPlan 3</tspan><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="325" y="1640" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: SubPlan +Subplan Name: SubPlan 3 +Parallel Aware: false +Async Capable: false +Relation Name: pg_auth_members +Alias: pg_auth_members_1 +Actual Rows: 0 +Actual Loops: 0 +Filter: (roleid = pg_authid_2.oid) +Rows Removed by Filter: 0 +loops: 0 +</title></image><text x="355" y="1710" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pg_auth_members</tspan></text><line x1="400" x2="471.6666666666667" y1="1665" y2="1665" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="470.6666666666667" x2="543.3333333333334" y1="1665" y2="1320" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="543.3333333333334" x2="615" y1="1320" y2="1320" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr15")"></line></g><g><rect x="225" y="1450" width="500" height="2345" rx="5" stroke="#444444" stroke-width="1.2" fill="gray" fill-opacity="0.2" pointer-events="none"></rect><tspan x="437.5" y="1665" font-size="15px" text-anchor="start" fill="red">SubPlan 6</tspan><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0ze2ZpbGw6bm9uZTtzdHJva2UtbGluZWNhcDpyb3VuZDtzdHJva2UtbGluZWpvaW46cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0xe3N0cm9rZTojNjY2YmQxO30uY2xzLTJ7ZmlsbDojNjY2YmQxO30uY2xzLTN7c3Ryb2tlOiM4ZDgxMTk7fS5jbHMtNHtmaWxsOiM4ZDgxMTk7fTwvc3R5bGU+PC9kZWZzPjx0aXRsZT5leF9uZXN0ZWQ8L3RpdGxlPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE3LjIzLDIwYTYsNiwwLDAsMSw2LTZoMjJhNiw2LDAsMCwxLDYsNlY0NGE2LDYsMCwwLDEtNiw2aC0yMmE2LDYsMCwwLDEtNi02VjMyLjI3Ii8+PHBvbHlnb24gY2xhc3M9ImNscy0yIiBwb2ludHM9IjE3LjIzIDI3LjMxIDEyLjc3IDMzLjI2IDIxLjY4IDMzLjI2IDE3LjIzIDI3LjMxIi8+PHBhdGggY2xhc3M9ImNscy0zIiBkPSJNMjQuMjMsMjVjMC0zLjMuNy00LDQtNGgxMmMzLjMsMCw0LC43LDQsNFYzOWMwLDMuMy0uNyw0LTQsNEgyOC43MmMtMy4zLDAtNC0uNy00LTRWMzMuNzIiLz48cG9seWdvbiBjbGFzcz0iY2xzLTQiIHBvaW50cz0iMjQuNjcgMzEuMzQgMjAuNzEgMzYuMSAyOC4yMyAzNi4xIDI0LjY3IDMxLjM0Ii8+PC9zdmc+" preserveAspectRatio="none" x="650" y="1875" width="50" height="50" style="cursor:pointer"><title>Node Type: Nested Loop +Parent Relationship: SubPlan +Subplan Name: SubPlan 6 +Parallel Aware: false +Async Capable: false +Join Type: Inner +Actual Rows: 0 +Actual Loops: 0 +Inner Unique: false +Join Filter: (pg_authid_5.oid = ANY ((SubPlan 5))) +Rows Removed by Join Filter: 0 +loops: 1 +</title></image><text x="680" y="1945" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>Nested Loop Inner</tspan><tspan dy="1.2em" x="680">Join</tspan></text><line x1="725" x2="788.3333333333334" y1="1900" y2="1900" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="787.3333333333334" x2="851.6666666666666" y1="1900" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="851.6666666666666" x2="915" y1="75" y2="75" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr16")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="325" y="1875" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: Outer +Parallel Aware: false +Async Capable: false +Relation Name: pg_authid +Alias: pg_authid_5 +Actual Rows: 0 +Actual Loops: 0 +Filter: (("user".login)::name = rolname) +Rows Removed by Filter: 0 +loops: 0 +</title></image><text x="355" y="1945" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pg_authid</tspan></text><line x1="400" x2="471.6666666666667" y1="1900" y2="1900" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="470.6666666666667" x2="543.3333333333334" y1="1900" y2="1900" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="543.3333333333334" x2="615" y1="1900" y2="1900" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr17")"></line></g><g><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="325" y="2035" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: Inner +Parallel Aware: false +Async Capable: false +Relation Name: pg_authid +Alias: pg_authid_4 +Actual Rows: 0 +Actual Loops: 0 +Filter: ((NOT rolcanlogin) AND ((rolname = 'vitis_admin'::name) OR (rolname = 'vitis_user'::name))) +Rows Removed by Filter: 0 +loops: 0 +</title></image><text x="355" y="2105" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pg_authid</tspan></text><line x1="400" x2="471.6666666666667" y1="2060" y2="2060" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="470.6666666666667" x2="543.3333333333334" y1="2060" y2="1900" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="543.3333333333334" x2="615" y1="1900" y2="1900" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr18")"></line></g><g><rect x="262.5" y="2165" width="137.5" height="2320" rx="5" stroke="#444444" stroke-width="1.2" fill="gray" fill-opacity="0.2" pointer-events="none"></rect><tspan x="293.75" y="2195" font-size="15px" text-anchor="start" fill="red">SubPlan 5</tspan><image href="data:image/svg+xml;base64,PHN2ZyBpZD0iXzEiIGRhdGEtbmFtZT0iMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNjQgNjQiPjxkZWZzPjxzdHlsZT4uY2xzLTEsLmNscy0yLC5jbHMtOHtmaWxsOiMyOTgwYjk7fS5jbHMtMSwuY2xzLTJ7c3Ryb2tlOiMyOTgwYjk7c3Ryb2tlLWxpbmVqb2luOnJvdW5kO30uY2xzLTJ7c3Ryb2tlLWxpbmVjYXA6cm91bmQ7c3Ryb2tlLXdpZHRoOjJweDt9LmNscy0zLC5jbHMtNntmaWxsOiNmMGVjYjY7fS5jbHMtNHtmaWxsOiNjMThmMzY7fS5jbHMtNXtvcGFjaXR5OjAuODt9LmNscy02e3N0cm9rZTojYzE4ZjM2O3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTd7ZmlsbDojYWRkZmYzO308L3N0eWxlPjwvZGVmcz48dGl0bGU+ZXhfc2NhbjwvdGl0bGU+PHBvbHlnb24gY2xhc3M9ImNscy0xIiBwb2ludHM9IjkuMDYgNTAuNzggNS41OCA0Ni4xNCAxMi41NCA0Ni4xNCA5LjA2IDUwLjc4Ii8+PGxpbmUgY2xhc3M9ImNscy0yIiB4MT0iOS4wNiIgeTE9IjQ2Ljc3IiB4Mj0iOS4wNiIgeTI9IjE1LjgiLz48cGF0aCBjbGFzcz0iY2xzLTMiIGQ9Ik0xOC40Myw1Ny40N2MtMS4zOCwwLTEuNS0uMTItMS41LTEuNVYxNS41M2g0MVY1NmMwLDEuMzgtLjEyLDEuNS0xLjUsMS41WiIvPjxwYXRoIGNsYXNzPSJjbHMtNCIgZD0iTTU3LjQxLDE2VjU2YTMuNzEsMy43MSwwLDAsMS0uMDcuOSwyLjE2LDIuMTYsMCwwLDEtLjkzLjFoLTM4YTMuNTQsMy41NCwwLDAsMS0uOS0uMDdoMGEyLjE2LDIuMTYsMCwwLDEtLjEtLjkzVjE2aDQwbTEtMWgtNDJWNTZjMCwxLjY1LjM1LDIsMiwyaDM4YzEuNjUsMCwyLS4zNSwyLTJWMTVaIi8+PGcgY2xhc3M9ImNscy01Ij48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIyNS4xMyIgeTE9IjU2Ljk3IiB4Mj0iMjUuMTMiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjQxLjUyIiB5MT0iNTYuOTciIHgyPSI0MS41MiIgeTI9IjE1Ljk3Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMzMuMzIiIHkxPSI1Ni45NyIgeDI9IjMzLjMyIiB5Mj0iMTUuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSI0OS43MiIgeTE9IjU2Ljk3IiB4Mj0iNDkuNzIiIHkyPSIxNS45NyIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iMjMuOTciIHgyPSI1Ny40IiB5Mj0iMjMuOTciLz48bGluZSBjbGFzcz0iY2xzLTYiIHgxPSIxNy40MiIgeTE9IjMyLjM0IiB4Mj0iNTcuNCIgeTI9IjMyLjM0Ii8+PGxpbmUgY2xhc3M9ImNscy02IiB4MT0iMTcuNDIiIHkxPSI0MC43MSIgeDI9IjU3LjQiIHkyPSI0MC43MSIvPjxsaW5lIGNsYXNzPSJjbHMtNiIgeDE9IjE3LjQyIiB5MT0iNDkuMDgiIHgyPSI1Ny40IiB5Mj0iNDkuMDgiLz48L2c+PHBhdGggY2xhc3M9ImNscy03IiBkPSJNNDkuNzMsMTUuNTN2LTloNi42OWMxLjM3LDAsMS41LjEyLDEuNSwxLjV2Ny41WiIvPjxwYXRoIGNsYXNzPSJjbHMtOCIgZD0iTTU2LjQyLDdhMy41NCwzLjU0LDAsMCwxLC45LjA3aDBhMi4xNiwyLjE2LDAsMCwxLC4xLjkzdjdINTAuMjNWN2g2LjE5bTAtMUg0OS4yM1YxNmg5LjE5VjhjMC0xLjY1LS4zNS0yLTItMloiLz48cGF0aCBjbGFzcz0iY2xzLTciIGQ9Ik0xNi45MiwxNS41M1Y4YzAtMS4zOC4xMy0xLjUsMS41LTEuNWg2Ljd2OVoiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik0yNC42Miw3djhoLTcuMlY4YTMuMTgsMy4xOCwwLDAsMSwuMDgtLjksMi4wOCwyLjA4LDAsMCwxLC45Mi0uMWg2LjJtMS0xaC03LjJjLTEuNjUsMC0yLC4zNS0yLDJ2OGg5LjJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjQxLjUyIiB5PSI2LjUzIiB3aWR0aD0iOC4xOSIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNNDkuMjEsN3Y4SDQyVjdoNy4xOW0xLTFINDFWMTZoOS4xOVY2WiIvPjxyZWN0IGNsYXNzPSJjbHMtNyIgeD0iMzMuMzMiIHk9IjYuNTMiIHdpZHRoPSI4LjE5IiBoZWlnaHQ9IjkiLz48cGF0aCBjbGFzcz0iY2xzLTgiIGQ9Ik00MSw3djhIMzMuODNWN0g0MW0xLTFIMzIuODNWMTZINDJWNloiLz48cmVjdCBjbGFzcz0iY2xzLTciIHg9IjI1LjE0IiB5PSI2LjUzIiB3aWR0aD0iOC4xNyIgaGVpZ2h0PSI5Ii8+PHBhdGggY2xhc3M9ImNscy04IiBkPSJNMzIuODEsN3Y4SDI1LjY0VjdoNy4xN20xLTFIMjQuNjRWMTZoOS4xN1Y2WiIvPjwvc3ZnPg==" preserveAspectRatio="none" x="325" y="2220" width="50" height="50" style="cursor:pointer"><title>Node Type: Seq Scan +Parent Relationship: SubPlan +Subplan Name: SubPlan 5 +Parallel Aware: false +Async Capable: false +Relation Name: pg_auth_members +Alias: pg_auth_members_2 +Actual Rows: 0 +Actual Loops: 0 +Filter: (roleid = pg_authid_4.oid) +Rows Removed by Filter: 0 +loops: 0 +</title></image><text x="355" y="2290" fill="rgba(0, 0, 0, 0.87)" style="font-size:15px;text-anchor:middle"><tspan>pg_auth_members</tspan></text><line x1="400" x2="471.6666666666667" y1="2245" y2="2245" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="470.6666666666667" x2="543.3333333333334" y1="2245" y2="1900" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4"></line><line x1="543.3333333333334" x2="615" y1="1900" y2="1900" stroke="rgba(0, 0, 0, 0.87)" stroke-width="4" style="marker-end:url("#arr19")"></line></g></g></svg> \ No newline at end of file diff --git a/source/tools/pg/images/interface_configuration.png b/source/tools/pg/images/interface_configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..46356144cd27e50e003653632f711e46c3a63785 Binary files /dev/null and b/source/tools/pg/images/interface_configuration.png differ diff --git a/source/tools/pg/images/interface_pgadmin.png b/source/tools/pg/images/interface_pgadmin.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae337f0c955c8f10a2b67ad8f6b2a2ede3cb995 Binary files /dev/null and b/source/tools/pg/images/interface_pgadmin.png differ diff --git a/source/tools/pg/images/pgadmin4_logo.png b/source/tools/pg/images/pgadmin4_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dc1beca38c054565a9a992592e84afb41861d298 Binary files /dev/null and b/source/tools/pg/images/pgadmin4_logo.png differ diff --git a/source/tools/pg/images/pgadmin_consultation.png b/source/tools/pg/images/pgadmin_consultation.png new file mode 100644 index 0000000000000000000000000000000000000000..994f5daae26a1c6ddf93abca82f52d76127074cf Binary files /dev/null and b/source/tools/pg/images/pgadmin_consultation.png differ diff --git a/source/tools/pg/index.rst b/source/tools/pg/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..6f6782b50b8373eae2a73c737548a31e7f2f4279 --- /dev/null +++ b/source/tools/pg/index.rst @@ -0,0 +1,19 @@ +PgAdmin 4 et PgModeler +============================================ + +.. image:: ./images/pgadmin4_logo.png + :width: 300 px + :align: center + :target: # + + +PgAdmin 4 est un outil permettant de simplifier l'administration d'une base de données postgres, ainsi que la consultation de donnée. + +PgModeler est un outil qui permet la modélisation graphique d'un modèle de donnée et la génération du code SQL de ce dernier. + +============================================ + +.. toctree:: + :maxdepth: 2 + + pgadmin.md \ No newline at end of file diff --git a/source/tools/pg/pgadmin.md b/source/tools/pg/pgadmin.md new file mode 100644 index 0000000000000000000000000000000000000000..25275dc0261312f81059d40465e3726b69699c45 --- /dev/null +++ b/source/tools/pg/pgadmin.md @@ -0,0 +1,125 @@ +# PgAdmin 4 + +PgAdmin 4 est un outil open source développé comme une application Web Jquery/Bootstrap ainsi que d'un serveur développé en Python avec la librairie Flask. + +Le but de cet outil est de simplifier l'administration et la consultation de serveur de BDD Postgresql pour les responsables d'infrastructures et les développeurs. + +## Consultation et modification de la donnée + + + +Vous pouvez voir la donnée d'une table/vue soit par le bouton au dessus de l'arbre, soit via le menu contextuel en faisant un clique droit sur l'objet en question. + +## Visualisation de données spatiale + +Sur une colonne de type géométrie, il y aura un bouton permettant la visualisation des géométrie WKB sur une carte OpenLayers comportant un fond OSM. + +Le fond de plan ne sera présent que si la géométrie est sotcké en WGS84 (4326). + +## Administration de la base de données + +### Visualiser la configuration de la base + + + +En sélectionnant le serveur, il est possible d'accéder à un tableau permettant de voir la configuration postgresQl du serveur. + +Ce qui peut être pratique pour voir par exemple l'algorithme de hashage des mots de passe par exemple. + +### Créer une sauvegarde + +Il existe deux binaires permettant de réaliser ces opérations, pg_dump et pg_dumpall. L'utilisation de ces deux commande peut trés vite être casse tête à cause du nombre de paramètre à passer dans ces commandes. + +Heureusement pgAdmin permet de réaliser ces opérations. + +En faisant un clique droit sur un serveur, une base, un schéma ou une table on peut lancer la commande pg_dump (pg_dumpall dans le cas du serveur), ce qui va permettre d'ouvrir une modale de configuration qui va vous permettre de lancer la création de la sauvegarde. + +Il est possible de sauvegarder les roles de connexion, la structure de données et les données (tout ces objets ou seulement certains, les roles ne sont récupérable qu'en sauvegardant le serveur). + +Il est possible de générer différents types de fichier, comme le format SQL qui va permettre d'avoir des requêtes SQL textuelle, ou un fichier backup binaire qui sera plus simple à restaurer. + +La commande sera ensuite exécuté de manière asynchrone, ce qui vous permettra d'utiliser l'application pendant ce temps. La commande sera écrit dans el log ce qui vous permettra de la copier pour sauvegarder régulièrement votre base via une tâche CRON par exemple. + +### Restaurer une sauvegarde + +Comme pour la sauvegarde il existe un binaire pg_restore qui permet de réaliser cette opération. + +Comme pour la sauvegarde en réalisant un clique droit sur l'objet à restaurer on peut configurer la commande et la lancer de manière asynchrone. + +Le format binaire est préfèrable pour la restauration car plus rapide et plus léger. + +## Génération de code SQL + +Une section permet de récupérer le code SQL de l'objet sélectionné. + + + +Via le menu contextuel sur une table ou une vue il est aussi possible de récupérer une requêtes simple sur cet objet (sous-menu `Scripts`). + +## Exécution de code SQL + +En cliquant sur un des boutons en haut de l'arbre de gauche, on peut ouvrir un fenère d'éxécution SQL sur la base sélectionnée (ou la base contenant l'objet sélectionné s'il s'agit d'un sous objet de la base). + +Cet outil se comporte comme une éxécution du binaire psql, certaines commande ont un impact sur l'outil de manière définitive, il faut alors ouvrir un nouvel outil pour revenir à l'état initial (comme le set Role par exemple). + +### Conseil d'utilisation sur une base de production + +Il pourra vous arriver de lancer des requêtes UPDATE ou DELETE sur la base lors de mise à jour ou d'opération de maintenance. Il est préférable dans ce cas de désactivé l'auto-commit. + +Dans ce cas, vous pouvez lancer votre commande, elle n'aura aucun impact sur la base tant que la transction n'est pas explicitement résolue. +Le commit ou le rollback se font d'un simple bouton sur l'interface. + +Lorsque vous fermer l'outil de requête, il va vous demander si vous voulez sauvegarder le code sql saisie (comme d'habitude), puis si la transaction n'est aps résolue, alors il ouvrira une deuxième fenètre de confirmation pour savoir si vous voulez commit ou rollback la transaction. + +## Utilisation du Explain/Analyze + +PgAdmin vous permet d'obtenir un diagramme bien plus simple à exploiter que le retour classique d'un Explain Analyze. + +exmple la requête ci-dessous : + +```sql +SELECT "user".user_id, + "user".login, + "user".name, + "user".email, + "user".company, + "user".department, + "user".ip_constraint, + domain.domain, + "user".domain_id, + "user".last_connection, + "user".restriction, + CASE + WHEN array_to_string(ARRAY( SELECT pg_group.groname + FROM pg_group + JOIN pg_roles ON pg_roles.oid = ANY (pg_group.grolist) + WHERE "user".login::name = pg_roles.rolname AND (pg_group.groname = 'vitis_admin'::name OR pg_group.groname = 'vitis_user'::name)), '|'::text) = 'vitis_user|vitis_admin'::text OR array_to_string(ARRAY( SELECT pg_group.groname + FROM pg_group + JOIN pg_roles ON pg_roles.oid = ANY (pg_group.grolist) + WHERE "user".login::name = pg_roles.rolname AND (pg_group.groname = 'vitis_admin'::name OR pg_group.groname = 'vitis_user'::name)), '|'::text) = 'vitis_admin|vitis_user'::text THEN 'admin'::text + WHEN array_to_string(ARRAY( SELECT pg_group.groname + FROM pg_group + JOIN pg_roles ON pg_roles.oid = ANY (pg_group.grolist) + WHERE "user".login::name = pg_roles.rolname AND (pg_group.groname = 'vitis_admin'::name OR pg_group.groname = 'vitis_user'::name)), '|'::text) = 'vitis_user'::text THEN 'user'::text + ELSE ''::text + END AS role, + "user".dataencrypt, + "user".secretkey, + "user".billinggroup_id, + billinggroup.billinggroup, + "user".phone, + "user".acceptnotification, + "user".timezone_id, + "user".formatdate_id, + rt_formatdate.formatdate, + "user".comp_data + FROM s_vitis."user" + LEFT JOIN s_vitis.domain ON "user".domain_id = domain.domain_id + LEFT JOIN s_vitis.billinggroup ON "user".billinggroup_id = billinggroup.billinggroup_id + LEFT JOIN s_vitis.rt_formatdate ON "user".formatdate_id::text = rt_formatdate.formatdate_id::text + WHERE "user".login::name = "current_user"() OR s_vitis.is_vitis_admin(); +``` + +va donner le diagramme suivant : + + \ No newline at end of file