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

#1 Re : Optimisation » Optimisation des tables de joinutre » 16/03/2020 17:26:24

La solution de rajouter artificiellement une super clef à la clef naturelle de jointure n'a d'intérêt que si vous avez des tables filles faisant référence à cette table de jointure. Dans tous les autres cas, je vous confirme les propos de rjuju, surtout une volumétrie accrue, la chute de performance en n'étant problématique que pour les mises à jour, pas pour les SELECT.

A +

#2 Re : Optimisation » Poids des tables (Octets/Megabytes) dans une base Postgresql » 16/03/2020 17:23:19

Le problème est que la compression systématique des LOBs avec TOAST joue en votre défaveur sur les données spatiales, car le contenu des données spatiale est assez aléatoire ce qui fait que le volume augmente légèrement au lieu de diminuer. Et il n'y a aucun moyen de désactiver TOAST, à moins de recoder le moteur PostgreSQL… (vous pouvez le faire!!!).
De plus PostgreSQL ne supporte pas la compression des données des tables et des index que l'on trouve dans d'autres SGBDR comme Microsoft SQL Server… ce qui permettrait de réduire considérablement le volume des autres données purement relationnelles.

Bref, PostgreSQL c'est double peine ! Compression obligatoire des LOBs, parfois inutile et contre-performantes pour certaines données, et impossibilité de compresser les autres données !

A +

#3 Re : Général » Clé primaire ET clé étrangère ? » 16/03/2020 17:09:13

Si tel est le cas votre modèle est mal fait. En effet ce que vous indiquez correspond à une association de type 1 à 1 dans un MCD, comme :
Homme <--> (marié) <--> femme
Dans un tel cas, le MPD correspondant est le suivant :

CREATE TABLE A (A_ID INT PRIMARY KEY, A_LIBELLE VARCHAR(32));
CREATE TABLE B (B_ID INT PRIMARY KEY, B_LIBELLE VARCHAR(32), A_ID INT REFERENCES A (A_ID));
ALTER TABLE A ADD B_ID INT REFERENCES B (B_ID);

Avec en sus 2 déclencheurs obligeant les couples A_ID et B_ID des deux tables d'avoir une correspondances absolue.

A +

#4 Re : Général » Migration des CAF sous PostgreSQL » 11/03/2020 12:49:38

Bonjour,

La CAF vient de migrer ses bases PostgreSQL sous Oracle en cloud, réduisant ainsi quelques 150 bases (et presque autant de serveur) à une seule base, de manière, notamment, à réduire ses coûts…

A +

#5 Général » Restauration ineffective » 28/01/2017 15:14:05

SQLpro
Réponses : 1

Bonjour à tous.

J'ai sauvegardé une base PG v 9.6.1 (64 bits sous Windows 10 pro) via la commande :

"C:\Program Files\PostgreSQL\9.6\bin\pg_dump.exe" --host localhost --port 5432 --username postgres --blobs --format=d -f "C:\SAVE_DB\DB_GEOPG.BAK" DB_GEO

Ceci a produit un fichier contenant les commandes SQL CREATE/INSERT.

La base a été supprimée.

Je n'arrive pas à restaurer malgré différents essais avec différentes syntaxes. Par exemple celle-ci :

"C:\Program Files\PostgreSQL\9.6\bin\pg_restore.exe" --host localhost --port 5432 --username postgres -f "C:\SAVE_DB\DB_GEOPG.BAK"

Ne fais rien, mais ne termine pas la commande....

Auriez vous un idée de la manière qu'il faut s'y prendre pour restaurer une base ?

D'avance merci

#6 Re : Général » PostgreSQL vs MySQL » 01/06/2015 21:28:05

De toutes façons, PostGreSQL est encore très loin des standards en matière de collation.  Voici une base créée avec la collation "French.France.1252" (qui est en fait un jeu de caractères et pas vraiment une collation). Démonstration :

CREATE TABLE T_MOT (MOT VARCHAR(32));

INSERT INTO T_MOT VALUES ('Retraite'), ('retraite'), ('retraité'), ('Retraité'), ('RETRAITÉ'), ('RETRAITE');

SELECT * FROM T_MOT ORDER BY MOT;

Résultat :


"retraite"
"Retraite"
"RETRAITE"
"retraité"
"Retraité"
"RETRAITÉ"


Or la règle en français est de placer les mots accentués avant les mots sans accents...


Le mot clef  COLLATE est très mal supporté et la documentation est plus que obscure... Impossible de savoir quelle combinaison de jeux de caractères / collation il faut pour pouvoir :
* faire indifféremment des recherches sensibles ou non à la casse (indépendamment des accents et autres caractères diacritiques)
* faire indifféremment des recherches sensibles ou non aux caractères diacritiques (indépendamment de la casse)


Un cas pertinent est de pouvoir trouver le mot "maïs" sans obtenir le mot "mais" quelque soit la casse.

INSERT INTO T_MOT VALUES ('maïs'), ('MAÏS'), ('Maïs'), ('Mais'), ('mais'), ('MAIS');  

SELECT * FROM T_MOT WHERE MOT = 'maïs';

Il reste la solution de faire un LOWER, mais cela ne devient plus "sargable" donc les performances sont en chute libre !


A +

#7 Re : Général » Optimisation de la vitesse d'insertion d'une bd importante » 11/03/2015 14:47:07

Un moyen d'accélérer le traitement d'import est de saucissonner vos fichiers pour que vous n'ayez pas d'opération d'écriture physique avant la fin de le mise en cache de l'intégralité des données du fichier.
Essayez avec des fichiers de moins de shared_buffer / 3

Le second moyen est de placer le journal qui est écrit de manière synchrone sur un RAID multiplexé (10 ou 0+1) en jouant sur le nombre de disque (par exemple 8 disque en //). Ceci devrait nettement améliorer le débit transactionnel.
Assurez vous cependant que votre carte RAID supporte la parallélisation des accès et le load balancing...

Par exemple les cartes bas de gamme livré par DEL (PERC H700 et PERC 6/I) ne savent ni faire du parallélisme ni du load balancing...

En particulier, la gamme de serveur Dell PowerEdge R210 n'est absolument pas adaptée aux serveurs de type SGBDR si l'on veut obtenir des performances. Le controleur interne ne sait faire que du RAID 5 / 6 et toutes combinaisons (50/60), ce qui pénalise les opérations de journalisation, d’où une contention importante.

A +

#8 Re : Optimisation » Dimensionnement de serveur pour un postgres » 22/01/2015 18:32:46

Le problème vient du fait que vous faites du décisionnel sur un serveur de bases de données relationnel (ROLAP). Or dans ce cas, la plupart du temps, il faudra lire séquentiellement l'intégralité des lignes des tables en jeu. Il vous faut donc une RAM au moins équivalent à la plus grande table, voire à la base entière si jointure il y a...


Le mieux serait d'avoir un véritable moteur décisionnel, car ces derniers ne stockent pas les données de la même façon, afin d'accélérer les manipulations :
1) il y a compression des données (contrairement aux bases relationnelles ou cela couterait trop cher du fait des mises à jour incessantes)
2) le NULL n'est pas stocké (contrairement aux bases relationnel ou le changement d'état d'une donnée est courante, passant du NULL à une valeur)
3) certains agrégats sont pré-calculés afin de diminuer l'accès aux données (voir la règle 4 de Codd sur le décisionnel : "la rapidité d'extraction de l'information ne doit pas être dépendante du volume des données à traiter, mais du volume des données restituées")
4) certains SGBD Décisionnel font du cache de résultat en sus de la règle 3


Ces deux dernières règles n'ayant aucun intérêt dans un SGBD Relationnel, car l'état des informations changent tout le temps du fait des multiples transactions dans la journée, ce qui n'est pas le cas du décisionnel dans lequel on "statifie" les données.


Parmi les SGBD Décisionnel il y a :
* Terradata
* Oracle (BI Suite)
* SQL Server (SSAS/SSRS)




A +

#9 Re : Général » Découvrez Open PostgreSQL Monitoring (OPM) » 22/01/2015 12:07:53

Quand vous dites :

Vi a écrit :

Cette version publique initiale ...

Voulez-vous dire qu'à l'avenir cela va devenir payant ?


A +

#10 Re : Général » Gérer par le serveur PostgreSQL des fichiers stockés sur disque » 22/01/2015 12:05:08

rjuju a écrit :

Tout simplement, postgres (comme la plupart des autres moteurs de données) ne vont pas bien gérer le stockage d'objets volumineux en base, car c'est n'est pas prévu pour. Vous pouvez cependant le faire, vous n'aurez aucun problème de fiabilité, juste portentiellement des problèmes de performances différents.

Au passage, le standard SQL/MED (et plus particulièrement la partie datalink, voir https://wiki.postgresql.org/wiki/DATALINK) permet de s'affranchir du problème en utilisant le stockage disque standard pour cela, avec le même principe que pour la base(ACID), mais très peu de moteurs l'implémentent (ce n'est pas le cas de postgres).

Désolé de vous contredire, mais la plupart des SGBD Relationnels comme Oracle ou SQL Server proposent une méthode identique ou similaire pour ce faire. Oracle avec BFile et SQL Server avec FILESTREAM (depuis le version 2005, soit 10 ans)...

A +

#11 Re : Général » Contrainte d'exclusivite » 22/01/2015 11:54:30

Il faut implémenter une série de déclencheurs dans chacune des tables fille en sus de l'intégrité référentielle traditionnelle. Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/mode … /heritage/


A +

#12 Re : Général » Lenteur requêtes Postgres » 22/01/2015 11:49:09

Effectivement ce sont les "round trips" c'est à dire les aller et retour entre serveur et client, autrement dit les temps réseau, qui bouffent (à vue de nez) 99,9% de votre temps de traitement...


Ceci n'est pas nouveau et c'est généralement lié au style de développement. Plus vous mettrez de code ensembliste côté serveur SGBDR plus les performances seront importante...


À me lire : http://img1.lemondeinformatique.fr/fich … aisses.pdf



A +

#14 Re : Général » Multiple DB vs. Schema » 16/06/2014 10:48:13

scfi a écrit :

Bonjour,

Il ne me semble pas avoir trouvé de discussion sur ce sujet.

J'ai une problématique simple sur une application :
- Une DB "mère" dans laquelle se retrouve des infos "globales"
- Une DB par client. Chaque DB client est identique.

Ma question est donc simple. D'un point de vue performance vaut-il mieux une DB avec un schema public par client, ou une seule DB avec un schema par client ?
D'un point de vue montée en charge des données sur un schema, quel serait l'impact sur les autres schema puisqu'ils seraient dans la même DB ?

Après plusieurs recherches sur internet, ça reste assez vague... Une idée globale semble sortir tout de même, la méthode multiple DB est "ancienne", alors que la multiple schema est "moderne".

Mais rarement de discussion sur les performances.

Merci par avance,


Vous n'avez pas bien cherché : Une seule base de données ou plusieurs ?

De plus PostGreSQL n'est pas multibase dans le sens ou il n'est pas possible de faire des requêtes (SELECT, INSERT, UPDATE, DELETE) facilement entre différentes bases (il faut passer par des db_link) et encore moins des transactions entre différentes bases...

Enfin la catastrophe arrive si vous considérez le point de vue des sauvegardes/restauration. En effet rien ne permet der synchroniser la sauvegardes des différentes bases, ce qui fait qu'à la restauration vous pouvez avoir des factures sans client, des lignes de commande sans commande.....

A +

#15 Re : Optimisation » mauvais choix de l'optimiseur » 25/04/2014 16:25:22

Pouvez vous récrire votre requête en isolant les parties agrégées/clef des données non clef et en rajoutant les données non clef en liant avec la clef en final ?

Si vous ne me comprenez pas, donnez le DDL de vos tables / vues et on vous la récrira.

A +

#16 Re : Général » Les index et l'optimisation » 25/04/2014 16:22:09

Crackerz a écrit :

en tout cas, de ce que je comprends de votre explication, vos clés secondaires n'ont aucune existence du côté du SGBD. C'est juste une clé unique, qui est proche d'une clé primaire mais pas identique.

Oui c'est bien ça ! Dans un ouvrage que j'ai lu il déclarer les clés secondaire à l'aide du mot clé "UNIQUE" mais je ne sais pas si cette même notion est repris dans PostgreSql. Certains SGBDR y dépose un index non nécessairement unique ce qui reviens à ce que vous avez compris.

La notion de clef secondaire n'existe pas; On parle de :
clef primaire (NOT NULL et UNIQUE)
clef alternative ou subrogée (UNIQUE et NULLable)

A +

#17 Re : Général » Bug PostGreSQL : FULL OUTER JOIN » 25/04/2014 16:14:18

De mémoire, la vitesse de correction des bugs de MS est de moins de 3 mois. Le faible nombre de bugs, comme la rapidité de correction est le fait du Microsoft's Secure Development Lifecycle, une méthodologie destinée à aider les développeurs de MS à construire des systèmes plus résilients et naturellement plus fiables. À l'époque de 2005, l'équipe de test était constitué d'une quinzaine de personne, mais surtout de plus de 160 machines de tests et le système tournait toutes les nuits pour rendre le résultat le matin aux équipes...


Le pire bugs en durée de correction avait été des télescopages de clef auto-incrémentées lorsque le nombre de requête d'insertion simultanées dans la même table dépassait le nombre de cœurs pour des machines de plus de 64 cœurs et lorsque la requête est parallélisée.... pas le genre de bugs que l'on risque de trouver sur PG qui ne sait pas faire des requête parallélisées !


Je trouve le site de publication/correction des bugs de MS (connect), nettement mieux fait et plus pratique que ce que propose PG avec sa liste... ! La preuve, c'est que je m'y suis trompé et on me l'a reproché !!!


L'étude de Coverity m'avait beaucoup fait rire, car c'est un spécialiste de l'open source (slogan : "Coverity Scan: free code analysis service for open source developers"), n'ayant visiblement aucune compétence, dans le code MS ou autre (IBM par exemple)... Et qui trouve bon ce qu'il sait auditer et pas le reste !!! vraiment de quoi se marrer !!!!

guk92 a écrit :

Mais pourquoi parle-t-on toujours de bug ? Le problème de base est lié à une limitation tongue

NON ! Quelque chose qui renvoie une erreur alors qu'il n'y a pas lieu c'est un bug.

A +

#18 Re : Général » Bug PostGreSQL : FULL OUTER JOIN » 24/04/2014 18:30:19

guk92 a écrit :

Bonsoir,


Ce n'est pas comme s'il n'y avait pas de bug sous SQL Server.

Voici un topic qui détaille un problème majeur que j'ai rencontré avec SQL Server 2005 :
http://www.developpez.net/forums/d11183 … -bug-like/

Il ne s'agit même pas d'un FULL JOIN, mais du pauvre opérateur LIKE...


Je préfère de loin avoir un SGBDR gratuit qui m'avertit ne pas gérer une fonctionnalité, qu'un SGBDR payant qui me sort des conneries.


En ce qui concerne la bug list de SQL Server, on peut lire sur internet :

Microsoft doesn't really keep a public list of open bugs. The ones that are the most important (e.g. anything involving security) are kept private for obvious reasons - they actually aren't published until they are fixed (and even then they often remain private).

Source : http://dba.stackexchange.com/questions/ … er-sp4-cu4

Le nombre de bug de SQL Server est bien moindre, tous moteurs confondus (SQL Server contient un ETL de nom SSIS, un moteur de stockage décisionnel en plus du relationnel, des outils de data mining et de formation de datamart SSAS, des outils de reporting SSRS et de très nombreux outils de maintenance, audit et admin......etc.) que ceux de PG... SQL Server compte à peu près 30 fois plus de code que PG, pour juste 20 fois moins de bug... Lisez les métriques du NIST par exemple sur les vulnérabilités... N'avez vous pas eu récemment une vulnérabilité importante sur PG récemment ? Depuis 2010, 26 vulnérabilités ont été recensées dans PG (http://www.postgresql.org/support/security/) contre 5 dans SQL Server (source NIST)... Comparez au volume de code, cela fait donc 150 fois plus de problème relativement dans PG que dans SQL Server... une toute petite paille !

A +

#19 Re : PL/pgSQL » Sommer des pluies journaliéres » 10/04/2014 16:22:06

Comme vos données ne sont pas calées sur un pas de temps spécifique, le mieux est de créer une table de chronodatation avec le ou les pas demandés la mettre en PK et faire une jointure dessus en RIGHT OUTER JOIN. Ensuite c'est du SUM / GROUP BY.


A +

#20 Re : Général » Bug PostGreSQL : FULL OUTER JOIN » 09/04/2014 14:21:58

ioguix a écrit :

Oh, soit. Vous n'étiez pas obligé de savoir que pgsql-bugs est une liste de diffusion...
Ceci dit, notez que Tom Lane vous a répondu avec cette liste en copie et non en privé:

je tenais aussi à signaler que lorsque j'ai posté le bug dans la liste celui-ci n'a pas été publié... Peut être une modération à priori.. Ok, mais par exemple dans Microsoft Connect, il n'y a pas de modération (PostGreSQL aurait-il il des choses à cacher ???). Certes, il faut se faire reconnaître préalablement chhez MS, mais cela ne prends que quelques secondes...
Raisons pour laquelle j'ai ignoré la liste :
1) par le fait que le mail m'ait été adressé personnellement
2) parce que celui ci n'étais pas diffusé sur la liste au moment ou je suis aller y regardé.
3) mon client de messagerie, ne propose par par défaut l'option inclus donc le mail dans la liste de diffusion... (c'est d'ailleurs un outil Free : Mozilla !!!!! va falloir que je change pour OutLook...)


Avez-vous vu sa réponse à propos du plan de SQL Serveur que vous lui avez fourni en privé ?

Ce midi, oui, et je fais le même constat que lui....
Comme je n'ais pas d'autres commentaires et que je gâche du temps à répondre à vos inepties...

Disons que face à votre non contribution, je me posais bien des questions. Maintenant, je comprends que vous ne suivez simplement pas la liste de discussion, et donc la discussion à propos de votre bug.

je n'ai tout simplement pas eu le temps... Je ne consacre pas tout mon temps à PG... Je travaille aussi !

Quand à ma "non contribution" je considère qu'il s'agit de votre part d'une insukte. En effet une contribution pour éradiquer un bug qu'il ne vous plait pas de voir exposer est une insulte intellectuelles, à peu près équivalentes à celles des totalitarismes, qui ne supportent pas de voir exposer des défaillances dans leurs systèmes et préfèrent couper la tête à ceux qui les exposent !

Vous auriez pu proposer les deux représentations par soucis du détail. Ceci dit, ça ne fait pas de vous un crétin, peut-être en faite vous un peu trop non ?

MAIS C 'EST EXACTEMENT CE QUE J'AI FAIT !!!! J'AI ENVOYÉ LES DEUX À TOM LANE (ET MÊME 3 VERSION PAR SÉCURITÉ : TEXTE, XML et GRAPHIQUE !). DE PLUS JE VOUS L'AI DIT DANS MON PRÉCÉDENT POST MAIS VISIBLEMENT VOUS AVEZ UN PROBLÈME DE VUE !!!!

A +

#21 Re : Général » Concurrence multithread non explicable » 09/04/2014 14:12:42

MichaelN a écrit :

Bonjour,

Je réalise actuellement un POC sur les traitements de masse à l'aide de Spring Batch et lors de la mise en place du multi-threading j'ai remarquer un problème de performance.
Lors de mes test avec 12 threads mes perfs ne sont pas du tout à la hauteur, suites a plusieurs tests je me suis rendu compte que quelque soit le nombre de threads (de 2 à 16) mes perfs batch sont les même. J'ai identifier que le problème provient de mon SGBD postgresql.

L'insertion massive dans mon SGBD par plusieurs thread créer de la concurrence qui augmente très significativement les temps de chaque insert.
Je suis dans un contexte où je ne peux pas utiliser de mécanisme de masse de postgres (COPY) et je ne peux que faire des action unitaire (insert), élément par élément.

Je vous présente mon cas de test que j'ai réalisé pour mettre en évidence mon problème :

Mon processus principal se charge de créer un nombre variable de threads, il se charge de répartir 1 million d'insert parmis les threads et va attendre la fin de chaque thread.
Chaque thread fait le nombre d'insert qu'il à reçu du processus principal, chaque requête insert est la même pour simplifier le test.

Lest résultat de mes test :

Pour 2 threads, les 1 million d'insert se font en 2 minutes
Pour 12 threads, les 1 million d'insert se font en 1 minute

Or, l'ensemble des inserts sont indépendant, mon test se place dans un cas des plus standard : 1 seule table, uniquement un insert, pas d'index, pas de contrainte autre que la clé primaire.

Ma config est des plus puissante pour le SGBD : 6 CPU Intel(R) Xeon(R) CPU E5-2667 0 @ 2.90GHz , le reste étant du même niveau.

J'ai exploré le problème dans tous les sens, j'ai passé plusieurs jours avec mes DataBase Administrator pour essayer de trouver la cause de mon problème mais rien n'y fait, c'est pourquoi je me tourne vers vous.
Les cause classique ont pour la plupart était écarter par les DBA.

le problème est clair : Lors d'un insert unitaire de masse multithreadé, il y a concurrence sans explication ...

Infos diverses :

Chaque thread se connecte une fois et effectue tous les inserts, aucun commit entre les insert.

SGBD en configuration standard, JBoss configuré pour pouvoir gérer les multiples connexion au SGBD.

La requête d'insert est classique "INSERT INTO declarant.entreprise ( dt_creation, dt_maj, version, cd_cat_juridique, cd_motif_siren_annule, cd_naf, dt_cessation_activ_economique, dt_cessation_juridique, dt_creation_entreprise, dt_derniere_maj_emetteur, nb_etablissements_actifs, raison_sociale, sigle, siren ) VALUES ( '2014-04-07 15:54:04.451', '2014-04-07 15:54:04.451', '0', '1000', NULL, '1111Z', '2009-06-01', NULL, '1993-07-28', '2010-09-02', '0', 'RAISON SOCIALE', NULL, '333222111' );"

Au niveau applicatif tout est bien gérer le problème ne peux pas provenir de cette partie.

Analyse pgBadger du test

Total duration    Times executed    Min duration    Max duration    Avg duration

Pour 12 Threads
51.333s               254,332              0.000s                  0.029s               0.000s

Pour 2 Threads
14.866s               254,332              0.000s                  0.011s           0.000s


Je suis de prêt ce post, si vous avez besoin de toute autre information je vous les donnerais.

J'espère que quelqu'un pourra m'aider à trouver la raison ^^

D'avance, merci !

Le frein est très certainement le JT; En effet, l'écriture dans le JT est un point de contention, car il n'est pas possible de paralléliser les écritures dans le journal de PG...

A +

#22 Re : Général » Bug PostGreSQL : FULL OUTER JOIN » 09/04/2014 11:31:59

Vos questions sont puériles, mais je vais vous répondre !

ioguix a écrit :

...pourquoi ne pas avoir répondu à  sa demande de plan des autres moteurs publiquement ?

Ayant reçu un mail privé, j'ai répondu à ce mail. Est-ce mal ? Suis-je stupide ?

Avez-vous vu sa réponse à propos du plan de SQL Serveur que vous lui avez fourni en privé ?

Je n'ais pas eu de réponse en retour de mon mail envoyé en privé !

Avez vous une réponse à lui apporter ?

N'ayant pas eu son retour je ne voit pas quelle réponse à apporter à aucune question en retour...

Ouvrez vous un bug pour être constructif ou pour d'autres raisons ?

Et vous, avec ce post, pensez-vous réellement constructifs ? Moi je pense que vous maîtrisez l'art d'enculer les mouches...
D'autre part, il se trouve que je travaille et hier j'étais chez Alstom, un de mes clients, oub comme par hasard nous allons passer d'une base PostGreSQL qui donne des performances lamentables à une base SQL Server....
je suis revenu à 21h chez moi et j'avoue que je n'avais plus le temps de me consacrer àn PG...
Peut être êtes vous un fonctionnaire effectuant 32 h par semaine avec 8 semaines de congés payé.. pas moi, j'ai une boite à faire fonctionner et des cours à donner à des ingénieurs...

Ps: Pourquoi dieu est-il nécessaire de faire un screenshot pour récupérer un plan sous SQL Serveur ?!


Vous simplifiez de manière parfaitement stupide l'envoi que j'ai fait; J'espère que c'est par ignorance... Car si c'était pas volonté, cela prouverait votre niveau de mauvaise foi...
Donc pour faire simple :
les plans de requête détaillés sont fournit par SQL Server sous forme XML dont voici un exemple :


<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.1" Build="10.50.4000.0" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
  <BatchSequence>
    <Batch>
      <Statements>
        <StmtSimple StatementCompId="1" StatementEstRows="4" StatementId="1" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" StatementSubTreeCost="0.0133358" StatementText="SELECT *&#xD;&#xA;FROM   T_CLIENT_CLI AS C&#xD;&#xA;       FULL OUTER JOIN T_PROSPECT_PSP AS P&#xD;&#xA;            ON C.CLI_SIREN = P.PSP_SIREN&#xD;&#xA;            OR C.CLI_ENSEIGNE = P.PSP_ENSEIGNE" StatementType="SELECT" QueryHash="0x9365EE9F42E3675B" QueryPlanHash="0xBC472FE59224297A">
          <StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
          <QueryPlan CachedPlanSize="24" CompileTime="5" CompileCPU="5" CompileMemory="280">
            <RelOp AvgRowSize="57" EstimateCPU="0.00581814" EstimateIO="0.000939" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="4" LogicalOp="Full Outer Join" NodeId="0" Parallel="false" PhysicalOp="Merge Join" EstimatedTotalSubtreeCost="0.0133358">
              <OutputList>
                <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_ID" />
                <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_ENSEIGNE" />
                <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_SIREN" />
                <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_ID" />
                <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_ENSEIGNE" />
                <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_SIREN" />
              </OutputList>
              <Merge ManyToMany="true">
                <InnerSideJoinColumns />
                <OuterSideJoinColumns />
                <Residual>
                  <ScalarOperator ScalarString="[tempdb].[dbo].[T_CLIENT_CLI].[CLI_SIREN] as [C].[CLI_SIREN]=[tempdb].[dbo].[T_PROSPECT_PSP].[PSP_SIREN] as [P].[PSP_SIREN] OR [tempdb].[dbo].[T_CLIENT_CLI].[CLI_ENSEIGNE] as [C].[CLI_ENSEIGNE]=[tempdb].[dbo].[T_PROSPECT_PSP].[PSP_ENSEIGNE] as [P].[PSP_ENSEIGNE]">
                    <Logical Operation="OR">
                      <ScalarOperator>
                        <Compare CompareOp="EQ">
                          <ScalarOperator>
                            <Identifier>
                              <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_SIREN" />
                            </Identifier>
                          </ScalarOperator>
                          <ScalarOperator>
                            <Identifier>
                              <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_SIREN" />
                            </Identifier>
                          </ScalarOperator>
                        </Compare>
                      </ScalarOperator>
                      <ScalarOperator>
                        <Compare CompareOp="EQ">
                          <ScalarOperator>
                            <Identifier>
                              <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_ENSEIGNE" />
                            </Identifier>
                          </ScalarOperator>
                          <ScalarOperator>
                            <Identifier>
                              <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_ENSEIGNE" />
                            </Identifier>
                          </ScalarOperator>
                        </Compare>
                      </ScalarOperator>
                    </Logical>
                  </ScalarOperator>
                </Residual>
                <RelOp AvgRowSize="33" EstimateCPU="0.0001603" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="3" LogicalOp="Clustered Index Scan" NodeId="1" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="0.0032853" TableCardinality="3">
                  <OutputList>
                    <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_ID" />
                    <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_ENSEIGNE" />
                    <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_SIREN" />
                  </OutputList>
                  <IndexScan Ordered="false" ForcedIndex="false" ForceScan="false" NoExpandHint="false">
                    <DefinedValues>
                      <DefinedValue>
                        <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_ID" />
                      </DefinedValue>
                      <DefinedValue>
                        <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_ENSEIGNE" />
                      </DefinedValue>
                      <DefinedValue>
                        <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Alias="[C]" Column="CLI_SIREN" />
                      </DefinedValue>
                    </DefinedValues>
                    <Object Database="[tempdb]" Schema="[dbo]" Table="[T_CLIENT_CLI]" Index="[PK__T_CLIENT__D0BA12001DE57479]" Alias="[C]" IndexKind="Clustered" />
                  </IndexScan>
                </RelOp>
                <RelOp AvgRowSize="33" EstimateCPU="0.0001614" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimateRows="4" LogicalOp="Clustered Index Scan" NodeId="2" Parallel="false" PhysicalOp="Clustered Index Scan" EstimatedTotalSubtreeCost="0.0032864" TableCardinality="4">
                  <OutputList>
                    <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_ID" />
                    <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_ENSEIGNE" />
                    <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_SIREN" />
                  </OutputList>
                  <IndexScan Ordered="false" ForcedIndex="false" ForceScan="false" NoExpandHint="false">
                    <DefinedValues>
                      <DefinedValue>
                        <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_ID" />
                      </DefinedValue>
                      <DefinedValue>
                        <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_ENSEIGNE" />
                      </DefinedValue>
                      <DefinedValue>
                        <ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Alias="[P]" Column="PSP_SIREN" />
                      </DefinedValue>
                    </DefinedValues>
                    <Object Database="[tempdb]" Schema="[dbo]" Table="[T_PROSPECT_PSP]" Index="[PK__T_PROSPE__3FA9CAA424927208]" Alias="[P]" IndexKind="Clustered" />
                  </IndexScan>
                </RelOp>
              </Merge>
            </RelOp>
          </QueryPlan>
        </StmtSimple>
      </Statements>
    </Batch>
  </BatchSequence>
</ShowPlanXML>

Trouvez vous cela plus facile que la représentation graphique ?

Bien entendu, c'est ce XML qui est interprété graphiquement. mais n'étant pas sur que Tom lane dispose de l'outil de lecture des plans, j'ai envoyé les deux par sécurité...
Ais-je bien fait ou suis-je à vos yeux un crétin ?

Ahahah smile
Avec tant d'humour, vos cours en école d'ingé doivent être tellement amusants !


Effectivement, vous en avez tellement !!!


Mais ce qui est pire dans votre comportement, c'est que vous ne me donnez pas du tout envie de continuer à traiter ce sujet et donc votre mail aura l'effet inverse de celui escompté : j'abandonne la partie ! Ayant dû consacré 1h pour répondre à vos attaques infantiles, c'est 1h de perdu pour répondre à Tom lane...


A +

#23 Re : Général » Bug PostGreSQL : FULL OUTER JOIN » 08/04/2014 00:05:07

Pas un bug !!!!

Là franchement je rigole....

Ne pas pouvoir fournir un résultat sur une requête triviale c'est quand même un peu gros... D'autant que Oracle et SQL Server le font sans problème !

Si c'était une limitation, ce serait précisé dans les manuels de PG...
regardez vous même : http://www.postgresql.org/docs/9.3/stat … sions.html
ça n'y est pas....

Quand à Tom Lane, il m'a bien amusé en disant, "c'est pas bien grave, personne ne s'en sert..." !
Peut être sous PG, les gens hésitent à faire des jointures de peur de casser le moteur... smile
Pour ma part je l'enseigne dans différentes écoles d'ingé et je l'utilise quotidiennement dans le cadre de la gestion de la qualité des données pour effectuer des rapprochements "flous"...

A +

#24 Re : Général » Bug PostGreSQL : FULL OUTER JOIN » 07/04/2014 14:47:38

gleu a écrit :

En l'occurence, ce n'est pas un bug mais une limitation (comme le dit le titre de votre article). À mon avis, c'est la réponse qu'ils vous donneront. Et ensuite, je pense qu'ils vous diront que si vous pouviez proposer un patch implémentant ça, ce serait d'une grande aide. Et je les joins tout à fait sur ces deux remarques smile

Oui, enfin, ça me fait penser aux temps anciens ou MS traitait ses bugs de "fonctionnalité particulière..." yikes

Appelons un chat un chat. C'est un bug lié à une limitation du moteur SQL.

Je poste dans la bug liste en testant sur la dernière version 9.3.4.

A +

#25 Général » Bug PostGreSQL : FULL OUTER JOIN » 07/04/2014 12:39:52

SQLpro
Réponses : 17

Bonjour,

j'ai mis cela dans les publications, car il s'agit à l'évidence d'un bug majeur mais j'ai écrit un article là dessus :
Une étrange limitation de PostGreSQL

En effet, PostgreSQL sort une erreur lorsque l'on fait une jointure externe bilatérale et que le prédicat de jointure n'est pas "cherchable".


Pouvez-vous m'indiquer qui/ou contacter le staff de PG pour faire une demande de correction ?


D'avance merci


PS : je cherche une solution temporaire et rajouterais une entrée à ce blog dès que j'ai trouvé une voie de contournement...

Pied de page des forums

Propulsé par FluxBB