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 :

Tuning de clé primaire


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Avatar de SQL_EVAN
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2011
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Juillet 2011
    Messages : 161
    Points : 245
    Points
    245
    Par défaut Tuning de clé primaire
    Bonjour tous,

    Je travaille actuellement avec une table principale de 46000000 de lignes.

    La table est constituée à partir de plusieurs tables filles donc la colonne qui était la clé primaire dans la table fille peut devenir un doublon dans la table principale.

    Les personnes qui la mis en place ont rajouté une colonne d'origine qui signifie la table fille.

    Exemple :

    ID_Primaire, ID_TableFille
    0000124568, 1G
    0000124568, 2G
    0003652148, 2F
    etc. etc.

    Donc, la clé primaire a été constuite en cluster sur ID_Primaire et ID_TableFille.

    Maintenant "the interesting part" :

    Je suis persuadé qui l'indexe PK est mal optimisé à cause des zéros qui précedent l'ID_Primaire. J'aimerais savoir si ce sera possible d'améliorer céla.

    Peut-être une vue indexée avec un REVERSE(ID_Primaire) à la place(ou bien une reconstruction de table avec un rajout de REVERSE(ID_Primaire) et une reconstruction de clé primaire sur le reverse et l'ID_TableFille.

    Qu'en pensez-vous?

  2. #2
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    une solution simple serait de passer la première colonne de la clef en int plutot qu'en char(10). Ca diviserait les IO par 2.5. Mais ca implique de toucher au modèle de données pour les autres tables aussi.

  3. #3
    Expert éminent sénior
    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 : 45
    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
    Points : 12 891
    Points
    12 891
    Par défaut
    Tout dépend de ce que tu peux faire et modifier dans ton modèle de données mais comme cela j'aurais eu plutôt tendance à mettre une colonne identity la clé primaire cluster + 1 contrainte unique pour les colonnes ID_Primaire, ID_TableFille.

    ++

  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 : 43
    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,

    Même s'il est vrai qu'un index cluster sur une chaîne est loin d'être optimal, il faut déjà savoir si la chaîne est de longueur constante, c'est à dire si elle est de type char(n).

    Ensuite il faut également savoir si le "nombre" représenté croit de façon constante à la manière d'une colonne de type identity ou timestamp, c'est à dire : comment ce "nombre" est-il calculé ?

    Enfin effectivement, si tu es autorisé à toucher le modèle, il te faudra :

    1. Ajouter une colonne de compteur auto-incrémenté (IDENTITY) à la table principale, ce qui la verrouillera pour la durée de la transaction
    2. Ajouter une colonne du même type entier dans les tables filles
    3. Réaliser l'UPDATE sur les tables filles, par lots de lignes dans chacune des tables à l'aide d'une table de staging, de façon à ne pas exploser le fichier du journal des transactions
    4. Supprimer les anciennes clés étrangères sur les tables filles
    5. Supprimer l'ancienne clé primaire de la table principale
    6. Ajouter la contrainte de clé primaire sur la colonne IDENTITY sur la table principale (attention à mettre WITH ONLINE = ON si tu es en édition Enterprise)
    7. Ajouter les contraintes de clé étrangère sur les tables filles

    C'est un peu de boulot, mais si c'est bien préparé, ça se fait

    @++

  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 896
    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 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    Surtout ne pas oublier que des jointures sur des types différents ne sont, par nature, pas" sargable"...

    A +

Discussions similaires

  1. Import data d'Excel ds 2 table lié par clé primaire
    Par lord_paco dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 10/05/2005, 09h31
  2. clé primaire composée de 2 clés étrangères
    Par Tigresse dans le forum Installation
    Réponses: 5
    Dernier message: 28/07/2003, 14h38
  3. clé primaire aléatoire
    Par peuh dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 23/06/2003, 20h51
  4. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  5. Problème pour récupérer la clé primaire
    Par caramel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2003, 13h57

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