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éveloppement SQL Server Discussion :

Index sur champs datetime


Sujet :

Développement SQL Server

Vue hybride

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut Index sur champs datetime
    Bonjour,
    J'ai la requête suivante de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select * 
    from TABLE 
    where date >= '01/01/2008' 
    and date <'01/01/2009'
    1) Le champs date est de type datetime.
    2) Cette requête requete renvoie 500 000 lignes sur 1 000 000.
    3) Il existe un unique clustered index TABLE_PK sur cette table (sur un autre champs que date).
    4) Il existe un index IX_TABLE_date non clustered sur le champs date.
    5) Les statistiques sont à jour.

    Le plan d'exécution de la requête révèle que optimiseur a fait un clustered Index scan sur l'index TABLE_PK. Pourquoi n'utilise t'il pas l'index IX_TABLE_date ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    2 raisons à cela :

    - parce que l'optimiseur a estimé qu'il lui coûterait moins cher de parcourir toute la table (vous retournez un nombre important de lignes par rapport au nombre total de lignes de la table)

    - parce que vous avez mis SELECT *, donc aucun index ne couvre la requête, donc l'optimiseur choisit de parcourir la table.

    N'utilisez jamais * dans une requête de production, sauf pour le prédicat EXISTS, ou la fonction d'aggrégat COUNT, qui sont optimisées pour

    @++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut Merci
    Merci, j'ai appris un truc.
    C'est spécifique à sqlserver ?

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Vous voulez dire pour "*" ? Non, je ne pense pas

    @++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut pour finir
    Pourriez vous me donner une source officielle indiquant qu'il ne faut pas utiliser select * ?
    Je n'arrive pas à trouver ça sur le net.

    Merci encore pour votre aide.

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Malheureusement je ne peux pas, mais à votre avis que fait le moteur de base de données quand vous spécifiez SELECT * ?

    Il va chercher dans les tables système le nom des colonnes de la table pour bâtir ensuite le plan de requête optimal.
    Vous créez donc ainsi un peu plus de surcharge au serveur ...
    Je vous laisse imaginer ce que cela fait quand vous spécifiez des jointures ...

    @++

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

Discussions similaires

  1. Problème d'index sur champ
    Par acrobaz dans le forum 4D
    Réponses: 1
    Dernier message: 16/10/2008, 21h10
  2. Index sur champs float
    Par tiboel dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/02/2008, 12h22
  3. Indexer un champ datetime
    Par dellys2 dans le forum Requêtes
    Réponses: 0
    Dernier message: 19/02/2008, 15h31
  4. Requete sur champ datetime
    Par BigZ444 dans le forum Requêtes
    Réponses: 1
    Dernier message: 28/06/2007, 09h27

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