IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Décisions SGBD Discussion :

Performances comparatives PostGreSQL vs SQL Server


Sujet :

Décisions SGBD

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par marc.collin Voir le message
    est-ce qu'il y aura un test avec une requête optimisé pour postgres avec un résultat déplorable sous ms sql server?

    ou bien c'est impossible, ms sql server le surpasse pour quoi?
    Question philosophique… pourquoi croyez vous que je gens payent du Oracle ou du SQL Server ? Parce que les entreprises aiment jeter leur argent par les fenêtres ? S'il n'y avait pas un intérêt, notamment en terme de performances, tout le monde prendrait PostgreSQL et Microsoft comme Oracle auraient fait faillite. Or ce n'est pas le cas...

    Dans le benchmark sur le spatial, les requêtes Q2 et Q4 sont meilleures avec PostgreSQL…

    Quand à trouver des résultats ou PostgreSQL explose les performances par rapport à SQL Server, j'avoue en avoir rarement rencontré en prod… Peut être parce que je ne pratique PostgreSQL pas suffisamment…. Mais je me souvient que du temps d'avant la version 2016, SQL Server ne disposait pas de la fonction STRING_AGG et on était obligé de passer par du XML pour ce faire, alors que PostgreSQL l'implémentait… Dans ce cas, les différences étaient très sensibles !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  2. #2
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Billets dans le blog
    1
    Par défaut
    Crier à la diffamation c'est vraiment le bas du bas des derniers degrés de recours quand on sait qu'on perd un débat

    Citation Envoyé par SQLpro Voir le message
    Question philosophique… pourquoi croyez vous que je gens payent du Oracle ou du SQL Server ? Parce que les entreprises aiment jeter leur argent par les fenêtres ? S'il n'y avait pas un intérêt, notamment en terme de performances, tout le monde prendrait PostgreSQL et Microsoft comme Oracle auraient fait faillite. Or ce n'est pas le cas...
    Peut-être parce que Microsoft et Oracle font du démarchage auprès des entreprises et pas les solutions open-source..

  3. #3
    Membre chevronné
    Homme Profil pro
    Ingénieur en génie logiciel
    Inscrit en
    Juin 2012
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en génie logiciel
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juin 2012
    Messages : 948
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Question philosophique… pourquoi croyez vous que je gens payent du Oracle ou du SQL Server ? Parce que les entreprises aiment jeter leur argent par les fenêtres ? S'il n'y avait pas un intérêt, notamment en terme de performances, tout le monde prendrait PostgreSQL et Microsoft comme Oracle auraient fait faillite. Or ce n'est pas le cas...

    A +
    j'ai arrêté de compté les fois où des licences étaient acheté mais que le produit n'était directement pas utilisé
    ou bien que le produit choisie était un exagé pour les besoins

    tel qu'oracle doit être utilisé car l'entreprise à beaucoup de donnée... et que tu te rends compte que beaucoup c'est même pas 10gig...

    des décideurs pressés, c'est pas ça qui manque dans cette industrie

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2006
    Messages
    756
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 756
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Ce qui est dit dans la page que tu cite :
    https://use-the-index-luke.com/fr/sq...sql/operations
    Contient des erreurs... En effet, l'auteur dit :
    "L'opération Index Scan réalise un parcours de B-tree, passe au travers des nœuds feuilles pour trouver toutes les entrées correspondantes, et récupère les données correspondantes de la table"
    C'est totalement faux ! Ceci identifie un accès de type range et non scan...
    C'est bien pour ça qu'il écrit: "C'est identique à un INDEX RANGE SCAN suivi d'un TABLE ACCESS BY INDEX ROWID. "

    Citation Envoyé par SQLpro Voir le message
    Et comme la petite mention sous le titre l'indique "Table des matières › Plans d'exécution › PostgreSQL › " c'est spécifique à PostgreSQL….
    OK alors sur le même site je vois: https://use-the-index-luke.com/fr/sq...cle/operations
    Ici on parle de RANGE SCAN mais quand tu lis la définition tu retrouves exactement la même chose que ce qui était associé à INDEX SCAN dans la page précédente.
    Mais c'est spécifique à Oracle.
    Donc: les deux bases utilisent une terminologie différente pour désigner la même chose.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par esperanto Voir le message
    ...
    Donc: les deux bases utilisent une terminologie différente pour désigner la même chose.
    C'est pour cela que je vous renvoie sur les papiers fondamentaux de recherche ou la terminologie est précise et en dehors de toute considération commerciale !

    Vous noterez que je vous ai mis un + !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2006
    Messages
    756
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 756
    Par défaut Essai
    Citation Envoyé par SQLpro Voir le message
    Si quelqu'un à des idées pour améliorer les performances de PostgreSQL je suis preneur. Bien entendu pour le second test on peut utiliser le module unaccent, mais cela modifie la structure de la table et oblige de réécrire les requêtes…
    Euh, oui. J'essaie au moins pour la première partie (sensibilité à la casse), j'essaierai peut-être pour les accents plus tard.

    Comme je ne connais pas bien la syntaxe SQL Server, quand j'ai vu la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM   T_CASSE WHERE  DATUM = 'méli-mélo';
    , je me suis d'abord demandé où diable la conversion de casse avait bien pu passer. T'emballes pas, j'ai vite compris qu'elle était implicite du fait de l'utilisation de , c'est bien cela?

    Dans les requêtes PostgreSQL, en effet tu dois faire un appel à LOWER ou ILIKE dans le WHERE parce que ce n'est pas implicitement déclaré au moment de créer la table.
    Oui, mais l'index dans tout ça?

    Comment veux-tu donc faire une recherche insensible à la casse dans un index qui est basé sur la chaîne initiale, donc sensible à la casse? La dernière fois tu m'as reproché de ne pas avoir regardé le résultat du EXPLAIN, cette fois c'est toi qui aurais dû le faire, tu te serais aperçu qu'aucune des 3 requêtes PostgreSQL ne peut utiliser l'index!
    Pour qu'il le soit, l'index doit contenir les chaînes en minuscules, comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX X_CASSE ON T_CASSE (LOWER(DATUM));
    Dans le cas de SQL Server, tu n'avais pas à le faire parce que comme la colonne était déclarée avec , il a compris tout seul que l'index devait lui aussi être insensible à la casse. Faute de cette déclaration dans PostgreSQL, il faut utiliser LOWER à chaque fois, y compris au moment de créer l'index.

    Evidemment tu vas me dire qu'alors SQL Server est meilleur parce qu'on ne déclare l'insensibilité à la casse qu'une seule fois. Honnêtement, moi je préfèrerais un serveur SQL qui offre les deux possibilités (mais je suppose que SQL Server le fait?): parfois on se dit de prime abord qu'une colonne doit être insensible à la casse, mais longtemps après on change d'avis... mais c'est plus facile de recréer un index qu'une table! Autre avantage, rien n'empêche d'avoir à la fois un index sur DATUM et un autre sur LOWER(DATUM), des fois qu'on ait beaucoup de requêtes avec et sans sensibilité à la casse - avec une déclaration associée à la colonne, c'est un peu plus difficile.

    Oh, et avant que j'oublie, tant qu'on se limite à la question de la casse, il faudrait aussi faire le test en remplaçant VARCHAR par CITEXT (note: c'est un module externe à charger au préalable), comme ça tout, y compris l'index, se voit déjà appliquer l'insensibilité à la casse.

    Comme je n'ai pas exactement le même matériel que toi (et que je n'ai pas SQL Server), je t'invite donc à refaire le test et à voir si la différence est toujours aussi flagrante. J'attends avec intérêt (et sans aucun à priori) de lire le résultat.

    Pour le second problème avec les accents, je suppose qu'il faudrait écrire quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX X_CASSE ON T_CASSE (remove_fr_accents(DATUM));
    là encore ça vaut le coup de tester. Quoique, en y réfléchissant, aucune chance d'égaler ta requête SQL Server parce que "COLLATE French_CI_AI" est probablement implémenté en C, donc ce n'est pas une fonction en SQL procédural qui pourra rivaliser. Pour comparer objectivement, il faut:
    • soit implémenter la fonction remove_fr_accents dans SQL Server et comparer quand les deux serveurs l'utilisent
    • Soit implémenter remove_fr_accents sous la forme d'un module externe dans PostgreSQL. Pour ce faire j'aurais tendance à faire un lien avec la librairie ICU, écrite en C et particulièrement optimisée pour la langue française (je ne serais pas surpris d’apprendre que COLLATE French_CI_AI soit implémenté avec cette librairie en réalité)

  7. #7
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Billets dans le blog
    1
    Par défaut
    J'ai posté la solution en début de topic. Sa réponse a été en gros "nianiania mais je veux rien toucher à mon code !"

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2006
    Messages
    756
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 756
    Par défaut
    Citation Envoyé par Sodium Voir le message
    J'ai posté la solution en début de topic. Sa réponse a été en gros "nianiania mais je veux rien toucher à mon code !"
    En effet, je n'avais pas vu. Du coup j'ai un peu regardé les autres réponses

    Citation Envoyé par MaitrePylos Voir le message
    En fait, les bench de ce genre servent à quoi ?
    Pourquoi ajouter un fonction de lower à la requête de Postgres ?
    Tout simplement parce que dans la version SQL Server il y a bien une comparaison sans sensibilité à la casse, donc il faut comparer avec une recherche insensible à la casse. Sinon c'est trop facile, je compare d'un côté un simple = et de l'autre lower(sans_accent(sans_espace(sans_les_dents(datum))) et évidemment je dis que du côté gauche on est quand même 1048576 fois plus rapide...

    Citation Envoyé par StringBuilder Voir le message
    Réécrire pour porter d'un SGBD a un coût.
    Ainsi, s'il faut 200 jours de dev pour porter un produit qui fonctionne correctement sous SQL Server vers PostgreSQL, alors le gain est nul, voir négatif.
    Donc l'objectif, lors d'un portage, c'est de toucher un minimum de code.
    Ridicule.
    L'objectif d'un portage, c'est de changer de SGBD. On peut avoir différentes raisons de changer, pas forcément liées aux performances (changement de plateforme, problème de licences, etc.) mais l'objectif est bien de changer de SGBD, réécrire le code ou le ré-exécuter tel quel n'est que le moyen d'y parvenir.
    Quant au gain éventuel, on le mesure sur l'utilisation qu'on fait de la base après le portage, pas sur le portage lui-même, dont le gain est forcément négatif.

    Mais là on n'est pas réellement dans un vrai projet de portage, on est juste dans une tentative de comparatif totalement biaisé.

    Citation Envoyé par StringBuilder Voir le message
    Il ne me semble pas avoir vu passer un "lower()" dans la requête d'origine.
    Et moi il ne me semble pas avoir vu de "COLLATE French_CI_AS" dans la version Postgres: alors soit tu trouves l'équivalent de cette propriété dans Postgres, soit tu acceptes l'équivalent proposé. En faisant l'hypothèse, bien entendu, que tu comprennes ce que "COLLATE French_CI_AS" fait.

    Citation Envoyé par SQLpro Voir le message
    Quand on fait un portage on essaye de ne récrire aucun requête…
    Trop drôle, donc en fait entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM   T_CASSE WHERE  DATUM = 'méli-mélo';
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM   T_CASSE WHERE   LOWER(DATUM) = 'méli-mélo';;
    il n'y a aucune ré-écriture de requête? Par contre, rajouter LOWER dans la création de l'index, ça, c'est trop de travail?

    Citation Envoyé par MaximeCh Voir le message
    Note : les collations non sensibles à la casse sont arrivées avec la version 12 de postgres.
    https://www.postgresql.org/docs/12/c...NDETERMINISTIC
    Merci beaucoup, j'étais resté à Postgres 10 mais voila une fonction qui m'intéresse bien. Surtout que dans mon message précédent je suggérais justement l'utilisation de ICU...

  9. #9
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Billets dans le blog
    1
    Par défaut
    Bon à savoir pour la mise à jour, même si dans mon application, à part le backend, toutes les recherches se font via elastic search.

  10. #10
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    1 616
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 616
    Par défaut
    j'ai jeté un oeil à la doc de postgresql pour cette version 12 : je ne crois pas que des options du type CI ou AI y soient. En tout cas je vois plein de locales dans la collections de collations, mais pas d'options de ce type.

    Moi ce qui m'interpelle vraiment, c'est parce que j'ai l'habitude de lire SQL pro, et donc j'ai lu ses cours, et relu régulièrement, et depuis le début, parce que c'est pas ma spécialité. Et là quand je vois ce micmac sur les collations, ça m'interpelle. En attendant vous lirez le commandement n°7 de cette page :
    https://blog.developpez.com/sqlpro/p...s_sur_ms_sql_s

    Et je me suis fait fort de retrouver le cours ici sur ce forum où il est aussi question des collations et où SQLPRO si j'ai bon souvenir attire fort l'attention sur la collation par défaut French_CI_AS. Un cours qui a des années.
    C'est ici : https://sqlpro.developpez.com/cours/...er/collations/

    Et je l'ai lu ce cours, presque religieusement. Parce que faut pas croire, collation peut vouloir dire collision. On va passer sous silence la notion de mot de passe complètement datée puisque aujourd'hui un hash de très bon niveau est nécessaire pour le stockage en base.
    Mais on y lit quand même, en conclusion :
    Évitez les collations faibles. Installez SQL Server avec une collation forte, voire binaire. N'utilisez des collations faibles que de manière exceptionnelle pour des colonnes relevant de traitements particuliers.
    Bref...

    Moi j'ai fait les essais sur ce serveur win2016 évoqué hier, j'avais déja installé SQL server 2017 dev d'un coté, j'ai installé postgresql de l'autre, version 12. C'est un win2016, 10 Go RAM, un XEon E3-1220 V2 4 coeurs à 3,10 GHZ. Un vieux truc, c'est une workstation à la base. Le sous-système disque est un SCSI en RAID5 mais pas sur.

    J'ai fait des tests vite fait sur les scripts de la première page. Effectivement ça donne à peu près ça.
    Par contre la table T_CASSE, si on crée DATUM en French_CS_AS c'est plus la même histoire.

    la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM   T_CASSE
    WHERE  lower(DATUM) = 'méli-mélo';
    met 16311 ms sur postgresql et 1905ms sur MSSQLSRV
    Ca fait 8,5 fois plus, pas 300 000
    Ilike met 2 secondes de plus environ

    Le truc, c'est que quand je vais voir le moniteur de ressources, SQL serveur utilise une mémoire de 3 Go, postgresql 20 Mo. Donc postgresql bosse sur le disque probablement
    J'ai essayé de changer le paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    shared_buffers = 4096MB
    dans postgresql.conf et redémarrer le service mais ça n'a rien changé en fait
    Alors je suis peut-être pas au bon endroit pour ça

    Et effectivement les index s'imposent probablement pour postgresql

    Bon sinon le peu que je découvre de pgadmin4, c'est vraiment pas mal

    Et je suis désolé mais WSUS impose des redémarrages, et les clusters, c'est au minimum doubler le prix des matériels, voir licences, etc.

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par esperanto Voir le message

    Trop drôle, donc en fait entre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM   T_CASSE WHERE  DATUM = 'méli-mélo';
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM   T_CASSE WHERE   LOWER(DATUM) = 'méli-mélo';;
    il n'y a aucune ré-écriture de requête? Par contre, rajouter LOWER dans la création de l'index, ça, c'est trop de travail?

    Merci beaucoup, j'étais resté à Postgres 10 mais voila une fonction qui m'intéresse bien. Surtout que dans mon message précédent je suggérais justement l'utilisation de ICU...

    Dans l'article complet il y a plus de texte… (il fait déjà 90 pages) et je n'ai pas trouvé le moyen de ne pas avoir de requête récrite pour l'insensibilité à la casse.
    Donc soit tu ne récrit pas la requête, mais ça fait pas le job, SOIT IL FAUDRA RECRITE TOUTES LES REQUÊTES SANS EXCEPTION, (les bases SQL Server étant généralement créées en CI)…
    J'ai donc présenté une requête avec LOWER puisqu'il n'existe pas de solution sans récriture.

    En sus l'index sur fonction du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX X ON Table  (LOWER(Colonne))
    Résout bien le problème de performances, mais oblige toujours à récrire la requête !

    Quand à la seconde requête qui est 300 000 fois moins rapide, celle avec les accents et autres caractères diacritique, je constate que personne ici, ni même Sodium, n'a trouvé une solution pour un temps de réponse raisonnable !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Membre éclairé
    Inscrit en
    Janvier 2006
    Messages
    756
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 756
    Par défaut CITEXT
    Citation Envoyé par SQLpro Voir le message
    Dans l'article complet il y a plus de texte… (il fait déjà 90 pages) et je n'ai pas trouvé le moyen de ne pas avoir de requête récrite pour l'insensibilité à la casse.
    Donc soit tu ne récrit pas la requête, mais ça fait pas le job, SOIT IL FAUDRA RECRITE TOUTES LES REQUÊTES SANS EXCEPTION, (les bases SQL Server étant généralement créées en CI)…
    J'ai donc présenté une requête avec LOWER puisqu'il n'existe pas de solution sans récriture.
    Pourtant j'ai déjà donné un moyen: remplacer TEXT ou VARCHAR par CITEXT dans la déclaration de la table. L'effet est de rajouter implicitement des LOWER partout où on fait des comparaisons, y compris dans la création de l'index.
    Note: ne pas oublier d'exécuter d'abord "create extension citext;" sinon le type n'est pas défini.

    Citation Envoyé par fredoche Voir le message
    j'ai jeté un oeil à la doc de postgresql pour cette version 12 : je ne crois pas que des options du type CI ou AI y soient. En tout cas je vois plein de locales dans la collections de collations, mais pas d'options de ce type.
    Leur nom est peut-être un peu moins explicite (basé sur CDLR) mais explication ci-après:

    Citation Envoyé par SQLpro Voir le message
    Quand à la seconde requête qui est 300 000 fois moins rapide, celle avec les accents et autres caractères diacritique, je constate que personne ici, ni même Sodium, n'a trouvé une solution pour un temps de réponse raisonnable !
    Avec PostgreSQL 12, je viens de faire le test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE COLLATION ignore_accents (provider = icu, locale = 'fr-u-ks-level1-kc-false', deterministic=false);
    CREATE TABLE T_ACCENTS (ID      SERIAL PRIMARY KEY,
                            DATUM   VARCHAR(256) COLLATE ignore_accents);
    et la requête avec DATUM = 'méli-mélo' trouve bien les variantes sans accents.
    Voila, comme je n'ai pas le même ordinateur que toi, je te laisse tester dans les mêmes conditions.

    Au passage tu noteras que ignore_accents inclut aussi l'insensibilité à la casse (sinon écrire kc-true), donc c'est aussi une bonne alternative au vieux module citext ... mais ça ne marche qu'avec PostgreSQL 12.

    Citation Envoyé par SQLpro Voir le message
    Merci de me donner un exemple… J'ai tenté mais ça ne fonctionne pas !
    Voila qui est fait juste au dessus.

  13. #13
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Citation Envoyé par SQLpro Voir le message
    Dans l'article complet il y a plus de texte… (il fait déjà 90 pages) et je n'ai pas trouvé le moyen de ne pas avoir de requête récrite pour l'insensibilité à la casse.
    Donc soit tu ne récrit pas la requête, mais ça fait pas le job, SOIT IL FAUDRA RECRITE TOUTES LES REQUÊTES SANS EXCEPTION, (les bases SQL Server étant généralement créées en CI)…
    J'ai donc présenté une requête avec LOWER puisqu'il n'existe pas de solution sans récriture.
    Il suffi de surcharger l'opérateur de comparaison pour les types concernés.

    Par exemple pour le VARCHAR :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    CREATE FUNCTION VARCHAR_EQUALITY_CI(VARCHAR, VARCHAR) RETURNS BOOLEAN
        AS 'select LOWER($1) = LOWER($2);'
        LANGUAGE SQL
        RETURNS NULL ON NULL INPUT;
     
    CREATE OPERATOR = (LEFTARG = VARCHAR, RIGHTARG = VARCHAR, PROCEDURE = VARCHAR_EQUALITY_CI);
    Et là... plus besoin de réécrire les requêtes

    Un problème se posera alors pour les requêtes où on veut justement une comparaison sensible à la casse, comme les vérifications de mot de passe. Mais elles devraient être bien nombreuses....

    en jouant avec les types, on devrait même pouvoir s'en sortir sans réécrire une seule requete

  14. #14
    Membre extrêmement actif
    Avatar de Sodium
    Femme Profil pro
    Développeuse web
    Inscrit en
    Avril 2014
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeuse web

    Informations forums :
    Inscription : Avril 2014
    Messages : 2 324
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Dans l'article complet il y a plus de texte… (il fait déjà 90 pages) et je n'ai pas trouvé le moyen de ne pas avoir de requête récrite pour l'insensibilité à la casse.
    Donc soit tu ne récrit pas la requête, mais ça fait pas le job, SOIT IL FAUDRA RECRITE TOUTES LES REQUÊTES SANS EXCEPTION, (les bases SQL Server étant généralement créées en CI)…
    J'ai donc présenté une requête avec LOWER puisqu'il n'existe pas de solution sans récriture.
    C'est rigolo car tu démontres assez bien ce que je disais sur un topic précédent : Sql est beaucoup trop verbeux, n'a aucune couche d'abstraction il est impossible de faire du code application propre en recourant uniquement à lui. Donc oué du coup tu te retrouves à réécrire des centaines de requêtes au lieu de réécrire une seule fonction qui fait la communication entre le programme et la bdd.

    Et je ne parle même pas des alias à la con (SELECT a.id, c.title, d.quechoche) que les codeurs mettent parce que le langage est trop verbeux et qui rendent les requêtes illisibles pour les autres.

    Bref :

    Nom : kaamelott-karadoc-cest-de-la-merde.jpg
Affichages : 339
Taille : 87,9 Ko

  15. #15
    Membre chevronné

    Homme Profil pro
    Consultant ERP
    Inscrit en
    Janvier 2013
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 372
    Par défaut
    Citation Envoyé par esperanto Voir le message
    Oh, et avant que j'oublie, tant qu'on se limite à la question de la casse, il faudrait aussi faire le test en remplaçant VARCHAR par CITEXT (note: c'est un module externe à charger au préalable), comme ça tout, y compris l'index, se voit déjà appliquer l'insensibilité à la casse.
    Note : les collations non sensibles à la casse sont arrivées avec la version 12 de postgres.
    https://www.postgresql.org/docs/12/c...NDETERMINISTIC

  16. #16
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par MaximeCh Voir le message
    Note : les collations non sensibles à la casse sont arrivées avec la version 12 de postgres.
    https://www.postgresql.org/docs/12/c...NDETERMINISTIC
    Merci de me donner un exemple… J'ai tenté mais ça ne fonctionne pas !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Performances temps d'insertions sql server
    Par KRis dans le forum Bases de données
    Réponses: 5
    Dernier message: 24/04/2008, 19h17
  2. Migration de PostGreSQL vers SQL Server
    Par Jidoche dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/08/2007, 18h37
  3. Migration PostGreSql vers SQL Server
    Par ZeMomoDesBois dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 09/11/2006, 07h43
  4. Outil pour comparer des bases SQL Server 2000
    Par plutonium719 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/08/2006, 07h54
  5. Postgresql vs SQL Server
    Par tanys dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/01/2005, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo