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

Administration SQL Server Discussion :

Effet de diminuer la taille de la colonne clé primaire sur la performance


Sujet :

Administration SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    test
    Inscrit en
    Octobre 2016
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : test
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2016
    Messages : 134
    Points : 49
    Points
    49
    Par défaut Effet de diminuer la taille de la colonne clé primaire sur la performance
    bonjour a tous

    Question sur la Performance

    j'ai un index cluster sur un colonne de Type varchar(500)

    si je procède a le faire diminuer vers varchar(5) peut on avoir un effet positif sur la Performance ou c'est pareil

    merci pour vos conseils

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

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonjour,

    Les échanges entre le disque et la mémoire (dans les 2 sens) se fait par page de 8Ko.
    Plus une ligne est petite, plus il en rentre dans une page, moins on brasse des pages, plus c'est rapide.
    Ça ne vaut pas que pour la clé mais pour toute la ligne !

    Ce qui est étonnant votre proposition de passer de varchar(500) à varchar(5) n'est pas tant l'écart de l'indice (quoique !) mais le non choix de char(5)
    Lire : https://blog.developpez.com/sqlpro/p...uel_difference

    Le fait que ce soit un index cluster a aussi son importance.
    Les index non cluster "pointent" la ligne par une @physique si la table est un "heap" ou par une valeur logique si la table est cluster.
    Et la valeur logique c'est l'ensemble des colonnes de l'index cluster.
    Donc l'économie va se répercuter sur les autres index de la table.
    Note : le jour du changement faudra prévoir des délais car cela signifie aussi un bouleversement au niveau feuille de tous les index non cluster...

    Pour finir, on opte en général pour une clé non signifiante (donc pas un char non plus).
    L'avantage est :
    -la pérennité du modèle : si la clé ne porte pas de signification alors on n'a pas de raison de faire un update de la PK et ça passera les différentes organisations métier (ex : le code barre). Le prix à payer est l'ajout d'une colonne clé candidate. C'est relativement couteux pour les tables avec très peu de colonnes.
    -un gain de performance du au type numérique (int = 4 octets), et ce d'autant plus lors des jointures : évaluer un tableau de correspondance entre 2 colonnes est d'autant plus rapide que les colonnes sont "étroites". Imaginez la taille nécessaire pour évaluer la jointure entre la table FACTURE et FACTURE_DETAIL pour une enseigne de grande surface...
    Le savoir est une nourriture qui exige des efforts.

  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 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    De manière interne un VARCHAR est stocké avec la longueur réelle de l'information + 2 octets. Ainsi dans une VARCHAR(500) si vous stockez 'toto' cela occupera 6 octets.
    CEPENDANT… dans certaines opérations (DISTINC, GROUP BY, ORDER BY…) les algorithmes utilisés nécessitent un alignement des valeurs. Le moteur SQL prend par défaut 50% de la longueur maximale… Dans votre cas 250 octets !
    Si toutes vos lignes comportent par exemple un code postal de 5 caractères au maximum dans un VARCHAR(500) et que vous avez 1 million d'adresses, certaines opérations consommeront 400 Mo inutilement…. Cela impliquera que d'autres données en mémoire devront être éjectées du cache pour satisfaire l'opération…

    Peu d'impact sur le stockage, mais impact non négligeable sur les performances !

    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 expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonsoir,

    @SQLpro Merci de ces précisions sur le moteur.

    Peut-on avoir quelques précision sur :
    Citation Envoyé par SQLpro Voir le message
    dans certaines opérations (DISTINC, GROUP BY, ORDER BY…) les algorithmes utilisés nécessitent un alignement des valeurs. Le moteur SQL prend par défaut 50% de la longueur maximale…
    J'imagine que l'algo est un poil plus complexe que ça car prendre la moitié d'un NVARCHAR(1) (ne pas rire, je croise cette ignominie trop fréquemment, pourquoi n'est-ce pas interdit par le moteur ???) ça devient complexe.
    De même que ce passe t'il si on a un varchar(500) et que 1 ligne dépasse les 250 caractères ? Réallocation mémoire ? pour chaque exception ?
    Si c'est le cas alors le "par défaut" devient "à minima".

    Comment peut-on faire la "démo" de ce comportement ?
    Le savoir est une nourriture qui exige des efforts.

  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 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    J'avais trouvé le moyen de voir cette emprunte mémoire pour un de mes clients lors d'un audit…. Mais je ne me souviens plus ce que j'ai utilisé comme outil…. Je pense qu'il y a une DMV qui peut montrer cela….

    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. elargir/diminuer la taille d'une colonne
    Par mouss4rs dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 12/03/2009, 11h58
  2. Réponses: 3
    Dernier message: 30/07/2008, 17h32
  3. [Oracle9i] Modification taille d'une colonne
    Par Jibees dans le forum Oracle
    Réponses: 14
    Dernier message: 05/08/2005, 11h25
  4. Réponses: 12
    Dernier message: 11/04/2005, 18h31
  5. [JTable] ajuster la taille d'une colonne à la taille du texte
    Par GETah dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 24/02/2005, 11h53

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