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

Requêtes PostgreSQL Discussion :

Vitesse d'exécution d'une requête


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut Vitesse d'exécution d'une requête
    Bonjour,

    J'ai une table d'article contenant + de 2300000 lignes.
    Quand je fais une une simple requête de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id AS id_article, titre, ean, auteur
    FROM site.article
    WHERE (titre LIKE UPPER('%harrington%') OR auteur LIKE UPPER('%harrington%'))
    ORDER BY titre ASC;
    Le temps de réponse est de 2 à 3 secondes.
    J'ai indexé les champs id, ean et titre et je ne sais pas si c'est vraiment utile pour le champ titre.
    Voici la structure de la table article :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
              Colonne           |       Type        |                         Modificateurs
    ----------------------------+-------------------+---------------------------------------------------------------
     id                         | integer           | non NULL Par défaut, nextval('site.article_id_seq'::regclass)
     ean                        | bigint            |
     isbn                       | character(10)     |
     titre                      | character varying | non NULL
     auteur                     | character varying |
    Index :
        "article_pkey" PRIMARY KEY, btree (id)
        "article_ean_key" UNIQUE CONSTRAINT, btree (ean)
        "idx_article_id" btree (id)
        "idx_article_ean" btree (ean)
        "idx_article_titre" btree (titre)
    Sinon, quel serait le moyen d’accélérer la recherche ? Si cela est possible biensur.

    Merci de vos conseils :-)

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    tsvector et index gist/gin

    Regardes chapitre recherche plein texte de la FAQ
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut
    ok, merci, je regarde cela.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il faudrait aussi vérifier le plan d'exécution, je ne sais pas si PostgreSQL sait réécrire la requête de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      SELECT id AS id_article, titre, ean, auteur
        FROM site.article
       WHERE titre LIKE UPPER('%harrington%')
       UNION
      SELECT id AS id_article, titre, ean, auteur
        FROM site.article
       WHERE auteur LIKE UPPER('%harrington%')
    ORDER BY titre ASC;
    Dans cette requête, l'accès se fait par l'index sur titre pour la première partie et par l'index sur auteur sur la seconde.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Non, car il y a à la fois une fonction de colonne sur les valeurs recherchées et un wildcard "%" en début de chaine de caractères
    Donc requête non sargable

    Seule une recherche plein texte peut satisfaire ce type de besoin

    Cela dit, 2 à 3 sec c'est pas si mal pour une requete non sargable qui concerne 2 300 000 lignes parcourues 2 fois puisque "OR"

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ce n'est pas en opposition à la requête plain text, c'est en complément.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut
    Je viens de tester avec les champs titre et auteur en rajoutant un champ de type TSVECTOR et en le mettant ensuite à jour comme il faut.
    La requête suivante me retourne un résultat en 2,393 ms :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT titre, ts_rank(vector_titre_auteur, to_tsquery('harrington')) FROM site.article WHERE vector_titre_auteur @@ to_tsquery('harrington');
    Ce qui est nickel.
    Par contre autre question :
    Je vais devoir inclure dans ma recherche des données provenant de tables différente, par exemple les tables editeur, disponibilite, theme, collection.
    Je dois donc être capable de lancer une recherche sur la table article et ces tables supplémentaire.
    Est-il possible de faire une recherche FTS sur plusieurs tables en même temps ?

  8. #8
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    salut
    2,393 ms= deux mille trois cent quatre vingt treize milliseconde (nous somme chez les angalis), alors
    Ce qui est nickel.

    Par ailleurs, utiliser du full text pour chercher un nom propre, je n'en vois pas l'utilité.
    Je dirais même plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cela dit, 2 à 3 sec c'est pas si mal pour une requete non sargable qui concerne 2 300 000 lignes parcourues 2 fois puisque "OR"
    c'est pas mal du tout.
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    J'ai du mal à comprendre votre intervention alassanediakite.
    Vous conseillez donc à Shiva de supprimer sa solution qui répond en 2 ms pour une solution qui répond en 3 secondes parce que ça vous paraît assez rapide ?

  10. #10
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par alassanediakite Voir le message
    salut
    Par ailleurs, utiliser du full text pour chercher un nom propre, je n'en vois pas l'utilité.
    Ce n'est qu'un exemple... J'aurai pu faire une recherche sur cela : "Honor Harrington David Weber". Sans recherche FTS je dois rechercher sur les champs titre et auteur. Et aussi comment différencier le titre de l'auteur dans les mots envoyés vu que ceux ci sont saisi dans un seul champ ? Avec FTS pas besoin de se poser la question et c'est rapide :-)

  11. #11
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    Salut
    Je voudrais comprendre
    Citation Envoyé par Shiva Voir le message
    La requête suivante me retourne un résultat en 2,393 ms :
    et
    Citation Envoyé par Waldar Voir le message
    ...solution qui répond en 2 ms pour une solution qui répond en 3 secondes parce que ça vous paraît assez rapide ?
    Peut-être que j'ai bien compris le full text. Alors, une question: le full text permet-il d’accélérer des recherches sur des noms propres?
    Merci et @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par alassanediakite Voir le message
    Salut
    Alors, une question: le full text permet-il d’accélérer des recherches sur des noms propres?
    Merci et @+
    Where nom like '%martin%' => faire un index full text si recherche fréquente et/ou table de plusieurs millions de lignes
    where nom like 'martin%' l'index full text pas n'est pas nécessaire d'un point de vue perfs (mais il a plein d'autres arguments)

  13. #13
    Membre expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Points : 3 590
    Points
    3 590
    Billets dans le blog
    8
    Par défaut
    salut
    OK, merci
    @+
    Le monde est trop bien programmé pour être l’œuvre du hasard…
    Mon produit pour la gestion d'école: www.logicoles.com

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Where nom like '%martin%' => faire un index full text si recherche fréquente et/ou table de plusieurs millions de lignes
    where nom like 'martin%' l'index full text pas n'est pas nécessaire d'un point de vue perfs (mais il a plein d'autres arguments)
    Il y a une autre solution plus pertinente pour ce cas de figure qui consiste à utiliser des index rotatifs....

    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/ * * * * *

  15. #15
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Il y a une autre solution plus pertinente pour ce cas de figure qui consiste à utiliser des index rotatifs....

    Un lien ? Cela marche sur PostgreSQL ou est-ce une exclusivité SQL Server ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  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 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    ça n'est pas implémenté à ma connaissance dans aucun SGBDR, mais dans certains moteurs. Par exemple dans Microsoft exchange pour la recherche des comptes mails.
    Je l'ai mis en place dans le cadre d'une application de text mining pour Intellixir sous MS SQL Server.
    Mais tu peut faire cela dans n'importe quel SGBDR avec un peu d'astuce !
    http://blog.developpez.com/sqlpro/p1...sql_sargable_c
    http://sqlpro.developpez.com/cours/quoi-indexer/
    http://sqlpro.developpez.com/sqlserv...tion/requetes/

    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/ * * * * *

  17. #17
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Il faut utiliser le module pg_trgm avec un index GIST qui sont faits exactement pour ce type de recherche.

    La doc:

    http://postgresql.developpez.com/doc...tion/francais/

    Citation:
    À partir de PostgreSQL™ 9.1, ces types d'index supportent aussi les recherches d'index pour LIKE et ILIKE, par exemple

    SELECT * FROM test_trgm WHERE t LIKE '%foo%bar';

  18. #18
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Il faut utiliser le module pg_trgm avec un index GIST qui sont faits exactement pour ce type de recherche.

    La doc:

    http://postgresql.developpez.com/doc...tion/francais/

    Citation:
    Effectivement, c'est une méthode similaire, mais un peu plus couteuses que l'index rotatif.

    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/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécution d'une requête à partir d'un shell
    Par Spyco dans le forum Oracle
    Réponses: 3
    Dernier message: 15/03/2006, 10h58
  2. [MySQL] Message d'erreur à l'exécution d'une requête
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/02/2006, 14h06
  3. Réponses: 1
    Dernier message: 05/12/2005, 23h24
  4. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11
  5. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 17h48

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