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 :

[SQL2008] Besoin de conseil pour l'indexation d'une table


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut [SQL2008] Besoin de conseil pour l'indexation d'une table
    Bonjour à tous

    Alors voilà, j'ai une table de 56M de lignes.
    Comme il est coutume dans ma boite, cette table n'as pas d'identifiant unique, ni de colonne auto-incrémentée et n'as pas de clé primaire clustérisé.

    L'unicité se fait sur 6 colonnes, 2 Int, 2 Char(2) et un Char(4)

    Le gros de l'utilisation de cette table est un Select * avec les 6 clé dans la clause Where.

    SQL recommande de créer un index comprenant ces 6 clés et d'inclure toutes les colonnes de la table, ce qui me semble un peu idiot(D'avoir les données a double).

    Du coup j'ai plusieurs solutions

    Créer une clé primaire clustérisé avec les 6 colonnes ce qui serait efficace à la recherche mais lent à la l'écriture (j'imagine)

    Ajouté une clé auto-incrémentée, de la définir comme clé primaire et de créer une clé séparée qui contienne mes 6 colonnes. Mais je vais perdre la puissance des Include...

    Que choisir ? Est-ce que j'ai une 3 solution ?
    Est que ça ne serait pas un cas pour un index de type ColumnsStore ?

  2. #2
    Rédacteur

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

    Alors voilà, j'ai une table de 56M de lignes.
    Comme il est coutume dans ma boite, cette table n'as pas d'identifiant unique, ni de colonne auto-incrémentée et n'as pas de clé primaire clustérisé.
    Donc, c'est pas une table... Juste l'équivalent d'un "fichier" du genre Cobol.... Inutuile donc d'utiliser un SGBDR ! Il aurait mieux vallu économiser vos sous !!!

    L'unicité se fait sur 6 colonnes, 2 Int, 2 Char(2) et un Char(4)
    Soit 16 octets, soit 128 bits...
    S'il n'y a pas de clef, il n'y a pas d'unicité ! Une clef étant primaire ou subrogées (contrainte UNIQUE)

    Le gros de l'utilisation de cette table est un Select * avec les 6 clé dans la clause Where.

    SQL recommande de créer un index comprenant ces 6 clés et d'inclure toutes les colonnes de la table, ce qui me semble un peu idiot(D'avoir les données a double).

    Du coup j'ai plusieurs solutions

    Créer une clé primaire clustérisé avec les 6 colonnes ce qui serait efficace à la recherche mais lent à la l'écriture (j'imagine)
    Oui et non, 128 bits sur du 64 bits (OS) c'est pas démentiel... A condition que la valeur des 6 composantes de votre clef soit définitive (à l'insertion) et immuable (aucun UPDATE sur les 6 colonnes formant la clef) Mais il faudrait composer votre clef astucieusement en mettant en premier les colonnes les plus grosses et les plus dispersées... Pour cela lancez la requête suivante :
    SELECT COUNT(DISTINCT Colonne1), COUNT(DISTINCT Colonne1), COUNT(DISTINCT Colonne3)...

    Ajouté une clé auto-incrémentée, de la définir comme clé primaire et de créer une clé séparée qui contienne mes 6 colonnes. Mais je vais perdre la puissance des Include...
    possible aussi

    Que choisir ? Est-ce que j'ai une 3 solution ?
    Créer une clef auto incrémentée et une contrainte d'unicité sur les 6 colonnes

    Est que ça ne serait pas un cas pour un index de type ColumnsStore ?
    Certainement pas, a moins que vous ne fassiez un décisionnel !

    Il faut tester chacune des solutions avec des INSERT, des UPDATE, des DELETE et des SELECT !!!!

    A +

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut
    je vais essayer la grosse clé clusterée

Discussions similaires

  1. [MySQL-5.6] Demande de conseil pour la création d'une table
    Par steel-finger dans le forum MySQL
    Réponses: 1
    Dernier message: 04/08/2014, 11h04
  2. Réponses: 16
    Dernier message: 27/10/2011, 10h18
  3. Réponses: 1
    Dernier message: 11/04/2011, 00h16
  4. Réponses: 4
    Dernier message: 20/05/2005, 13h30
  5. Réponses: 3
    Dernier message: 24/12/2004, 12h21

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