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 :

Problème sur une requête SQL


Sujet :

Langage SQL

  1. #21
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Car d'un point de vue performances, entre comparer une valeur à N valeurs, ou lui appliquer un masque binaire et vérifier si le résultat est différent de zéro, c'est le jour et la nuit !
    On est quand même dans le cas très particulier où N=2 et où la table personne comprend 3 colonnes (si on reprend ta définition). Le résultat serait sans doute différent si N > 2 et/ou si la table contenait plus de colonnes. Je vois une raison pour laquelle l'optimiseur n'utilise pas l'index : il voit qu'il n'y a que 2 valeurs. L'index lui indique une répartition 50/50 (à peu près hein). Avec l'index, il récupère 2 des 3 colonnes de la table personne. Dans ce cas précis, il pourrait donc être plus coûteux d'utiliser l'index que de ne pas l'utiliser ! Car s'il utilise l'index, il est ensuite obligé d'aller chercher la moitié des enregistrements dans la table, donc lire la moité de la table. Comme il y a des chances que l'index sur le sexe ne soit plas CLUSTERED, statistiquement, il sera obligé de lire quasiment toutes les pages. Donc, autant ne pas l'utiliser.

    Un test à faire, se serait de recréer l'index en incluant la colonne "nom" (je dis bien incluse, pas faisant partie de). Là, il se pourrait qu'il y ait un bénéfice pour les recherches "homme" ou "femme" (mais pas les deux, puisque cela reviendrait à renvoyer tous les enregistrements).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  2. #22
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    C'est pire que cela:
    ce n'est pas que l'optimiseur estimera que l'utilisation de l'index sera plus couteuse, c'est qu'il ne peut pas l'utiliser, car il ne sait pas quoi chercher !

    il est obligé de récupérer toutes les valeurs pour cette colonne, pour y appliquer l'opération bit à bit avant de pouvoir faire la comparaison

    La raison de non utilisation de l'index indiquée par dorinf serait plutôt justement dans le cas d'un In ou d'un OR.

  3. #23
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    ce n'est pas que l'optimiseur estimera que l'utilisation de l'index sera plus couteuse, c'est qu'il ne peut pas l'utiliser, car il ne sait pas quoi chercher !
    C'est là où j'ai un doute. Je m'explique : l'optimiseur, quand il voit la requête, il se rend compte qu'il y a une opération à effectuer avec une colonne qui est indexée. L'index connait les différentes valeurs contenues dans la colonne. Il est donc tout à fait possible de réaliser les calculs en utilisant l'index. Ainsi, le calcul est effectué... 2x uniquement pour le cas qui nous intéresse ! Une pour chaque valeur de l'index. Bon, ça c'est en théorie, en pratique, il y a peut être des limitations qui font que ce n'est pas possible.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  4. #24
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par dorinf
    . L'index connais les différentes valeurs contenues dans la colonne. Il est donc tout à fait possible de réaliser les calculs en utilisant l'index.
    tout à fait.
    Quand je disais qu'il n'était pas possible d'utiliser l'index, je voulais parler d'une recherche d'index.

    Mais en effet, l'optimiseur pourra faire le choix de scanner l'index plutôt que la table afin de réduire le nombre de pages nécessaires pour répondre au besoin (et si l'index est couvrant, l'index a en effet toutes les chances d'être utilisé... mais il sera lu intégralement ce qui réduit l’intérêt)

  5. #25
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Ah d'accord, c'est plus clair pour moi ainsi Merci.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. [MySQL] Problème sur une requête SQL
    Par julienmop dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 14/06/2015, 21h47
  2. Probléme sur une requête SQL
    Par ggoncalves dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/10/2012, 15h45
  3. Problème sur une requête SQL
    Par Jezlife dans le forum Bases de données
    Réponses: 8
    Dernier message: 18/03/2012, 10h35
  4. Problème sur une requête SQL
    Par juju05 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/06/2010, 18h20
  5. Problème sur une requête SQL (PL/SQL)
    Par goofyrocks dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/01/2009, 17h33

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