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

MS SQL Server Discussion :

like ou substring ?


Sujet :

MS SQL Server

  1. #1
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut like ou substring ?
    bonjour à tous,

    question dont je ne trouve pas de réponse AFFIRMATIVE

    quel est le plus rapide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select 1 from Table1 where champ1 like 'Z%'
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select 1 from Table1 where substring(champ1,1,1)='Z'
    Errare humanum est, perseverare diabolicum (Sénèque)

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Points : 406
    Points
    406
    Par défaut
    De manière générale, le "LIKE" est considéré comme une fonction consommant beaucoup de ressource. La comparaison des méthode dépend des interventions que l'on souhaite effectuer et de la volumétrie des tables utilisées.

    A mon avis l'utilisation du substring pourrait être plus efficiente.
    Bon courage pour la suite.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    Je viens d'avoir le support SYBASE (je ne me souvenais pas qu'on avait un compte chez eux )

    dans les deux cas aucun index ne peut être utilisé mais

    en fait il y a deux cas:
    1° cas
    si like avec un seul % exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1 FROM Table1 WHERE champ1 LIKE 'X%'
    il vaut mieux utiliser le like car l'optimiseur le transforme en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1 FROM Table1 WHERE champ1 >='X' and champ1 < 'Y'
    et donc peut utiliser un éventuel index
    2° cas
    si like avec un deux % exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1 FROM Table1 WHERE champ1 LIKE '%X%'
    il faut utiliser le charindex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1 FROM Table1 WHERE charindex('X',champ1)> 0
    voilà
    Errare humanum est, perseverare diabolicum (Sénèque)

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 172
    Points : 25 112
    Points
    25 112
    Par défaut
    moi je pencherais plus pour le like qui sera peut etre modifié selon ce qu'on en fait en quelque chose de mieux
    le substring nécessitant à priori un balayage de table
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 52
    Points : 62
    Points
    62
    Par défaut
    Bonjour serge0934,

    Pour ton exemple, les 2 ordres SQL seront de même performance (index ou non).
    Effectivement il y a aura bien un balayage (MAIS de table ou d'index ).
    (Donc le support Sybase a peut être mal compris ta question. peut être mal formulé ? ).

    Si par contre tu modifie l'odre avec le substring
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT 1 FROM Table1 WHERE substring(champ1,2,1)='Z'
    Là tu peux avoir une très grosse différence si un index était utilisable au départ.
    Dans ce cas, pour le LIKE il y aura toujours un balayage de l'index alors que pour le SUBSTRING il y aura un balayage de table.

    Attention (on va maintenant relativiser ):
    Le fonctionnement des optimiseurs est évidemment bien compliqué.
    Pour rappel l'optimiseur SQL Server est de type CBO (il compare des coûts). Aussi, s'il estime que le coût d'un balayage de table est moins couteux que celui de l'index ... bein il y aura un table scan.
    Et donc dans mon exemple modifié SUBSTRING(x,2,1) aura le même coût que le LIKE. (TABLE SCAN pour les deux)

    Maintenant je vois venir ta question... Comment un balayage de table peut-il être préféré un balayage d'index ?
    C'est fonction de la volumétrie de ta table, de ton ordre SQL , etc ...
    Si par exemple tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Table1 WHERE champ1 LIKE 'Z%'
    Il se peut que l'index qui pouvait être utilisé ne le soit pas (sauf index couvrant). le fait de demander tous les champs de la table oblige à servir tous les champs (via l'index ou index+table).
    Dans ce cas un TABLE SCAN peut être appliqué.

    Si le sujet t'interesse, je te recommande de regarder du coté optimiseur , plan d'éxécution et Index.

    PS: un moyen de vérifier les coûts est de comparer les plans d'éxécution
    Voila en espérant que cela soit clair

  6. #6
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    Ce forum est consacré à Microsoft SQL Server, pas Sybase.
    La réponse de Zeus est excellente, j'aimerai néanmoins ajouter un détail :

    En utilisant une fonction dans l'opérande de gauche (où on spécifie la colonne), on modifie la valeur de la colonne, et donc aucun index ne peut être utilisé en seek, puisque la clé de l'index ne correspond à rien évalué dans l'expression de recherche.

    Par contre, la construction LIKE 'Z%' n'empêche en rien l'utilisation d'un index, et même le seek. SQL Server sait combien de valeurs de clé commencent par Z. Si c'est suffisamment sélectif, l'index va être recherché.
    Un LIKE '%Z%' par contre, ne peut pas à la base utiliser d'index. Mais il y a en SQL Server 2005 une optimisation sur le like, nommée résumés de chaînes (http://blogs.digineer.com/blogs/lara.../03/07/58.aspx), qui permet un meilleur choix d'index avec un LIKE '%...' dans certains cas.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

Discussions similaires

  1. Utilisation spéciale de LIKE
    Par tonyskn dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/07/2024, 16h08
  2. Probleme dans une clause like !
    Par adil dans le forum Langage SQL
    Réponses: 6
    Dernier message: 15/07/2003, 16h47
  3. [VB6] [ADO] Like sur base Access
    Par dlpxlid dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 24/01/2003, 11h03
  4. Réponses: 2
    Dernier message: 10/07/2002, 11h51
  5. Créer un interpréteur de langage inspiré du Basic
    Par Picasso dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 11/05/2002, 17h10

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