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 :

Optimisation, Index Seek plus lent que Table Scan sur clé multiple


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut Optimisation, Index Seek plus lent que Table Scan sur clé multiple
    Bonjour,

    J'ai une table dans laquelle la clé est une combinaison de 3 id, il en resulte la création d'un index cluster sur cette clé primaire. Lorsque je requête cette table j'obtiens un comportement que je ne comprends pas :
    un requête du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id1,id2
    FROM ma_table
    WHERE id1 IN (...) AND id2 IN (...) AND id3 IN (...)
    sera très lente (voir plantera le serveur) avec ma clé primaire, par contre si je supprime la clé, la requête est instantanée.

    J'ai passé la requête dans l'analyseur et j'obtiens le résultat suivant :
    Avec la clé
    clustered index seek
    nombre de lignes 8
    taille des lignes 15
    cout estimé : 8
    Sans la clé
    table scan :
    nombre de lignes 8
    taille des lignes : 24
    cout estimé : 3
    En général un Index seek est plus rapide qu'un table scan ; je n'arrive pas à comprendre comment je peux obtenir l'inverse et surtout avec une telle différence.

    J'ai résolu la lenteur en supprimant la clé, je vais recoder une partie de l'appli pour eviter les insertions multiples, par contre j'aimerai bien comprendre la cause pour éviter de reproduire la même erreur.

    Merci !

  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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Attention aux coûts, ils sont relatifs au temps total de requête.
    Avez-vous comparé les temps de requête avec et sans index cluster ?
    Pouvez-vous nous fournir le plan de requête dans les deux cas ?

    A+

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 774
    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 : 21 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Vos IN multiples ne permettent pas d'activer une recherche sur l'index. Le prédicat n'est pas sargable.

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

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : Pays-Bas

    Informations forums :
    Inscription : Décembre 2005
    Messages : 186
    Points : 133
    Points
    133
    Par défaut
    Merci pour vos réponses !

    Attention aux coûts, ils sont relatifs au temps total de requête.
    Avez-vous comparé les temps de requête avec et sans index cluster ?
    Pouvez-vous nous fournir le plan de requête dans les deux cas ?
    Le plan est très simple car il n'y a qu'une table de lue :
    Sans index
    Table scan : coût 100%
    Filter : coût 0%
    Select : coût 100%

    Temps d'éxecution < 1s
    Avec index
    clustered index seek : coût 100%
    Select : coût 0%

    Temps d'éxecution = 2min13
    Vos IN multiples ne permettent pas d'activer une recherche sur l'index. Le prédicat n'est pas sargable.
    D'après ce que j'avais lu les index sur plusieurs colonnes sont stockés de manière concaténée ; comment aurais-je pu profiter d'un index sur plusieurs colonnes (avec une clause where du type (where id1=.. and id2=.. and id3=..) ? Comment ce fait-il que SQL Server n'ait pas choisi d'ignorer mon index puisque le prédicat n'est pas sargable ?

  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
    21 774
    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 : 21 774
    Points : 52 746
    Points
    52 746
    Billets dans le blog
    5
    Par défaut
    Parce que lire un index même en faisant un scan est souvent moins couteux que de lire une table entière... L'index est bien souvent plus petit que la table elle même...

    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. [Optimisation] Delete beaucoup plus lent que select
    Par GyZmoO dans le forum Requêtes
    Réponses: 17
    Dernier message: 18/07/2017, 19h08
  2. Réponses: 76
    Dernier message: 29/03/2011, 16h15
  3. [Système] Mozilla plus lent que IE
    Par Halleck dans le forum Langage
    Réponses: 6
    Dernier message: 22/06/2005, 17h26
  4. [Firebird][Optimisation]Plus lent que le BDE!
    Par vincentj dans le forum Débuter
    Réponses: 3
    Dernier message: 07/02/2005, 15h48
  5. DBExpress est plus lent que BDE?
    Par palassou dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 08h39

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