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

Langage SQL Discussion :

Requête sur plusieurs champs avec LIKE


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 90
    Par défaut Requête sur plusieurs champs avec LIKE
    Bonjour,

    Je fais appel à vous car nous rencontrons un problème actuellement avec une de nos requêtes que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *
      FROM table1, table2
     WHERE (table1.ID = table2.ID)
       AND ((   (UPPER (table1.NAME) LIKE UPPER ('%toto%'))
             OR (UPPER (table1.sname) LIKE UPPER ('%toto%'))
             OR (UPPER (table1.notes) LIKE UPPER ('%toto%'))
             OR (UPPER (table2.champ1) LIKE UPPER ('%toto%'))
             OR (UPPER (table2.champ2) LIKE UPPER ('%toto%'))
            )
           )
    table1 compte 3 millions de tuples, table2 450 000.

    Le problème de cette requête est qu'elle est de plus en plus utilisée, qu'elle dure plus de 5 mn (encore plus longue depuis passage sous Oracle 10g), et que ça devient carrément insupportable dès que 2 utilisateurs la font simultanément !!

    Comment peut-on "bien" écrire ce type de requête ? (je sais que les LIKE et les OR, au niveau optimisation... ).

    Merci pour votre aide

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Vous pouvez déjà l'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT * 
    FROM   table1 T1
           INNER JOIN table2 T2
                 ON  T1.ID = T2.ID
    WHERE T1.NAME   LIKE '%toto%' COLLATE French_CI_AS
       OR T1.SNAME  LIKE '%toto%' COLLATE French_CI_AS
       OR T1.NOTES  LIKE '%toto%' COLLATE French_CI_AS
       OR T1.CHAMP1 LIKE '%toto%' COLLATE French_CI_AS
       OR T1.CHAMP2 LIKE '%toto%' COLLATE French_CI_AS
    Cependant ne confondez pas base de données et traitement de texte. La recherche d'un LIKE '%quelquechose%' ne sera jamais performante.
    Tout au plus pouvez vous empêcher que les différents utilisateurs se vérrouillent mutuellement en utilsiant un niveau d'iolation READ UNCOMIITTED.

    Le seul moyen de rendre ce type de requête performante est d'implémenter une recherche en index textuel. Il existe un module pour cela et il faut utiliser la clause CONTAINS de SQL.

    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/indextextuelle/

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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 90
    Par défaut
    Merci pour votre réponse.

    J'essaie la requête que vous proposez mais le "COLLATE French_CI_AS" ne semble pas reconnu sous TOAD.

    Je sais bien que cette requête est tout sauf optimale et qu'il faut absolument l'écrire différemment, cela n'était pas une priorité mais le devient maintenant. Je vais donc lire votre article

  4. #4
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    Citation Envoyé par zestrellita
    le "COLLATE French_CI_AS" ne semble pas reconnu sous TOAD.
    Toad n'est qu'une interface entre la base de données et le développeur. La vérification se fait par la base de données sous-jacente en l'occurrence Oracle. donc il faudrait dire : n'est pas reconnu par Oracle.

    Sinon à ma connaissance COLLATE n'existe pas sous Oracle en tout cas pas avec cette syntaxe mais c'est le reste de la requête qu'il faut lire (notamment la jointure dans le INNER et les filtres dans le WHERE)

    Par contre si les LIKE sont insuffisants il ne faut pas perdre de vue cette suggestion:
    Citation Envoyé par SQLpro
    Le seul moyen de rendre ce type de requête performante est d'implémenter une recherche en index textuel. Il existe un module pour cela et il faut utiliser la clause CONTAINS de SQL.
    , CONTAINS que je ne connaissais pas: Oracle.com: Text SQL Statements and Operators

  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
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    CONTAINS fait partie de la norme SQL:1999 module MM... Lisez mon livre sur SQL aux pages 90 et suivantes.

    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. Réponses: 9
    Dernier message: 09/05/2009, 17h34
  2. Réponses: 1
    Dernier message: 25/04/2009, 11h31
  3. Requête sur plusieurs tables avec DLookup ?
    Par Falcdyr dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 07/05/2008, 08h50
  4. Requête sur plusieurs champs
    Par pierrot67 dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/02/2007, 16h33
  5. Requête sur plusieurs champs
    Par pierrot67 dans le forum Bases de données
    Réponses: 6
    Dernier message: 21/02/2007, 10h51

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