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 :

Select qui n'utilise pas un index


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Par défaut Select qui n'utilise pas un index
    Bonjour,

    j'ai une table avec X record par date extraction, avec un index sur la zone de date d'extraction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [fk_extract_date], count( pk_broadcast )
      FROM [RMBDW_DEV].[dbo].[f_broadcast]
    group by [fk_extract_date]

    fk_extract_date    (No column name)
    20140131    233480
    20140801    1091005
    20141231    1809616
    20150109    183188
    20150116    211225
    20150130    185851
    20150206    216804
    20150213    238989
    20150220    268964
    20150227    289685
    20150306    321151
    20150313    346335
    20150320    359229
    20150327    384923
    20150403    413655
    20150410    438869
    20150417    467610
    20150424    494460
    20150501    520254
    20150508    645015
    20150515    665559
    20150522    702123
    20150529    730841
    20150605    764339
    20150612    787066
    20150619    823706
    20150626    858059
    20150703    890583
    20150710    917796
    20150713    925899
    20150714    929909
    20150715    934274
    20150716    941102
    20150717    945510
    20150720    945535
    20150721    945763
    20150722    949220
    20150723    956129
    20150724    960656
    20150727    967244

    lorsque je lance un select avec certaine valeur sur fk_extract_date :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_break from rmbdw_dev.dbo.f_broadcast where fk_extract_date = 20150206
    --> il utilise bien l'index , et la réponse est immédiate.

    et le même select sur d'autre valeur de fk_extract_date, l'index n'est pas utilisé , et l'explain plan donne un scan complet la table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_break from rmbdw_dev.dbo.f_broadcast where fk_extract_date = 20150720
    si je force l'utilisation de l'index, cela fonctionne de nouveau très bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select id_break from rmbdw_dev.dbo.f_broadcast with( INDEX (IDX_f_broadcast_extract)) where fk_extract_date = 20150720
    Quelqu'un aurai-il une idée sur la raison de la non utilisation automatique de l'index pour chaque valeur de fk_extract_date ?


    Merci.

    Franck.

  2. #2
    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
    Par défaut
    Bonjour,

    1/ est-ce que les statistiques sont a jour ?

    2/ peut-on voir le CREATE de l'index

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    1/ est-ce que les statistiques sont a jour ?

    2/ peut-on voir le CREATE de l'index

    1/ le problème continue après recalcul des statistiques sur cette table.


    2/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE NONCLUSTERED INDEX [IDX_f_broadcast_extract] ON [dbo].[f_broadcast]
    (
    	[fk_extract_date] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
    GO
    merci pour vos conseils.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    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 001
    Billets dans le blog
    6
    Par défaut
    Créez l'index suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX ??? ON [RMBDW_DEV].[dbo].[f_broadcast] ([fk_extract_date]) INCLUDE (pk_broadcast);
    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/ * * * * *

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Créez l'index suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX ??? ON [RMBDW_DEV].[dbo].[f_broadcast] ([fk_extract_date]) INCLUDE (pk_broadcast);
    A +

    Même résultat après création de l'index avec l'INCLUDE pk_broadcast

  6. #6
    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
    Par défaut
    C'est plutôt la colonne id_break qu'il faudrait inclure, car c'est sur elle que porte le SELECT.

    l'index deviendra couvrant, et devrait donc être utilisé systématiquement.

  7. #7
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Attendons effectivement les informations demandés par aieeeuuuuu mais de loin il semble que la distribution de tes données dans ton cas fait que SQL Server choisisse ou non une recherche d'index.

    En regardant rapidement le nombre d'enregistrements par date, on voit déjà que pour la date 20150720 SQL Server devra ramener 945535 lignes alors que pour la date 20150206 seulement 216804 ce qui représente 77% de données en moins. A voir également si tes statistiques reflètent la réalité. L'optimiseur peut se tromper si les statistiques ne sont pas à jour.

    Tu peux nous fournir le plan d'exécution réel dans les 2 cas stp . Tu n'aurais pas un key / RID lookup dans tes plans d'exécution par hasard?

    ++

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2015
    Messages : 6
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Attendons effectivement les informations demandés par aieeeuuuuu mais de loin il semble que la distribution de tes données dans ton cas fait que SQL Server choisisse ou non une recherche d'index.

    En regardant rapidement le nombre d'enregistrements par date, on voit déjà que pour la date 20150720 SQL Server devra ramener 945535 lignes alors que pour la date 20150206 seulement 216804 ce qui représente 77% de données en moins. A voir également si tes statistiques reflètent la réalité. L'optimiseur peut se tromper si les statistiques ne sont pas à jour.

    Tu peux nous fournir le plan d'exécution réel dans les 2 cas stp . Tu n'aurais pas un key / RID lookup dans tes plans d'exécution par hasard?

    ++
    Explain plan avec la sélection automatique de l'index.

    Nom : explain ok.JPG
Affichages : 421
Taille : 42,4 Ko


    Explain plan sans la sélection de l'index

    Nom : explain not ok.JPG
Affichages : 397
Taille : 33,7 Ko

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/11/2008, 15h31
  2. Pourquoi Oracle n'utilise pas mes index ?
    Par yaggi64 dans le forum SQL
    Réponses: 4
    Dernier message: 25/11/2007, 16h03
  3. requête de selection qui ne fonctionne pas
    Par emmablue dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/07/2006, 13h55
  4. Socket, recv et select qui ne marche pas
    Par Zapan dans le forum Réseau
    Réponses: 18
    Dernier message: 30/06/2006, 20h19
  5. Select qui n'existe pas
    Par daijoubu dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/01/2006, 18h34

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