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 deux colonnes


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 201
    Points : 69
    Points
    69
    Par défaut Index sur deux colonnes
    Bonjour,

    Je dispose de table avec plusieurs colonnes dont 2 colonnes id1 et id2 en integer.

    Je fais souvent des requetes sur l'id1 ou sur l'id2 ou sur les deux dans un ordre (id1,id2) ou dans l'autres (id2,id1).

    J'ai de nombreuses tables avec ces deux ids

    Pour rendre les requetes plus efficace, je voudrais créer des index sur ces deux champs.

    Ma question est:
    Pour rendre les requetes plus efficace, est ce que créer un index unique sur (id1,id2) suffit ou est qu'il faut que:
    • je crée un index sur (id1,id2)
    • Je crée un index sur (id2,id1)
    • Je crée un index sur id1
    • Je crée un index sur id2



    Merci pour vos lumières

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 169
    Points : 9 645
    Points
    9 645
    Par défaut
    Je créerais un index sur (id1,id2) et un autre sur (id2, id1).
    Si tu crées ces 2 index, les 2 autres deviennent totalement inutiles.
    Si un traitement a besoin idéalement d'un index sur id1, le moteur devrait normalement constater que l'index sur (id1, id2) fait le job aussi bien.

  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 933
    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 933
    Points : 51 748
    Points
    51 748
    Billets dans le blog
    6
    Par défaut
    Il n'est pas possible de répondre aussi simplement sans savoir les requêtes que vous lancez.

    En effet, cela dépend des opérateurs de comparaisons que vous faites (=, >, >=, <, <=, <>, LIKE, BETWEEN) et des différents prédicats du WHERE, de la clause HAVING, de la jointure et de l'option OFFSET / FETCH dans la clause ORDER BY (tout cela sont des prédicats de recherche susceptibles d'utiliser l'index en mode "seek" ou "lookup"). Mais aussi du regroupement (GROUP BY, DISTINCT, UNION) et des colonnes utilisées dans les autres clauses (SELECT, ORDER BY, HAVING...), cela pouvant conduire à l'ajout d'une clause INCLUDE à la définition de votre index. Et bien entendu de la distribution des données pour ces colonnes...

    Commencez par poster les requêtes (complètes) et là on pourra vous aider !

    À me lire :
    https://sqlpro.developpez.com/cours/quoi-indexer

    A +

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2014
    Messages : 201
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Merci pour vos retours.
    Je fais de nombreuses requêtes de tous types.
    Mais c'est pour 99% du temps :

    table1.id1=table2.id1 and table1.id2=table2.id2
    table1.id1=table2.id1
    table1.id2=table2.id2

    C'est surtout pour lier 2 tables entre elles avec des JOIN
    pas de group by ou order by sur ces colonnes

    Ces deux colonnes sont des entiers.

    Merci

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 423
    Points : 40 078
    Points
    40 078
    Billets dans le blog
    9
    Par défaut
    En ce cas, je rejoins la réponse n°2 de tbc92.
    Si les colonnes sont bien de même type de part et d'autre (integer), alors les prédicats seront indexables.

    Pouvez-vous communiquer le DDL de création des deux tables, en particulier les contraintes foreign key.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 933
    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 933
    Points : 51 748
    Points
    51 748
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par olysmar2 Voir le message
    Bonjour,

    Merci pour vos retours.
    Je fais de nombreuses requêtes de tous types.
    Mais c'est pour 99% du temps :

    table1.id1=table2.id1 and table1.id2=table2.id2
    table1.id1=table2.id1
    table1.id2=table2.id2...

    Un index qui ne porterait juste que sur les colonnes d'un prédicat n'est pas toujours utilisé. C'est pourquoi il nous faut l'intégralité de vos requêtes car les clauses SELECT, FROM, HAVING, GROUP BY, ORDER BY et toutes les sous requêtes sont prise en compte dans le choix de l'index....

    Donc, encore une fois postez vos requêtes et le DDL des tables et index.

    A +

  7. #7
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 874
    Points : 1 677
    Points
    1 677
    Par défaut
    Citation Envoyé par olysmar2 Voir le message
    Pour rendre les requetes plus efficace, je voudrais créer des index sur ces deux champs.
    En quoi, actuellement, les requêtes sont non efficaces ?

    J'imagine que pour chercher dans la direction de la création d'index vous avez des arguments ; pouvez vous les exposer ?

    Nb : ne pas hésiter à poster les plans d'exécution

Discussions similaires

  1. Jointure sur un index à deux colonnes
    Par hbellahc dans le forum Adaptive Server Enterprise
    Réponses: 5
    Dernier message: 10/03/2011, 20h15
  2. Afficher des enregistrements sur deux colonnes
    Par Dauphind dans le forum Access
    Réponses: 1
    Dernier message: 22/06/2006, 15h16
  3. [Tableaux] Array sur deux colonnes et foreach..
    Par shadeoner dans le forum Langage
    Réponses: 4
    Dernier message: 16/03/2006, 09h46
  4. Index sur une colonne Date
    Par sjaeger dans le forum Oracle
    Réponses: 11
    Dernier message: 10/11/2005, 15h55
  5. [CR] Faire un groupe sur deux colonnes, voir mon exemple
    Par Etienne51 dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 08/10/2004, 15h02

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