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 :

Choix du type de la clef primaire


Sujet :

Administration SQL Server

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut Choix du type de la clef primaire
    Bonjour,

    Jusqu'ici, en tant que neuneu qui ne comprenais qu'une partie de ce qu'il faisait, je mettais consciencieusement une colonne de type int autoincrémentée comme clef primaire de mes tables histoire d'éviter tous problèmes futurs.

    Aujourd'hui, maintenant que j'en sais un peu plus (grâce à la communauté de ce forum), je me pose la question pour les tables dont je sais que le nombre de ligne sera réduit.

    Un int étant stocké sur 4 octets, pour des tables dont on est CERTAIN que le nombre de ligne ne dépassera JAMAIS 26, ne peut-on pas utiliser un type char(1) ?

    Par exemple, je suis actuellement en train de modéliser une nouvelle DB où il y aura notamment une table transaction donc chaque ligne sera préciser par un type de transaction où le type de transaction fait l'objet d'une table à part entière.

    Les types de transactions sont connus et aux nombres de 3. Dans ce cas, n'est-il pas dommage d'utiliser un type int qui sera "sous-utilisé". Vu que les transactions vont être très nombreuses (la table la plus volumineuse de la DB), ne serait-il pas mieux de mettre un Char(1) ?

    Qu'en est-il de l'avis des experts que vous êtes ?

    Merci d'avance.
    Kropernic

  2. #2
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Bonjour,

    On est en OLTP ou OLAP ?

    En OLAP la volume est significative et on est en mode consultation uniquement. La bonne pratique est d'utiliser le type de la taille plus petit possible : tinyint (< 256 lignes), smallint (< 32K lignes ou 64K y compris les valeurs négatives), int, puis bigint et guid.

    En OLTP les volumes sont relativement petites par contre les couches applicatives sont nombreuses au-dessus, les ORM peuvent mettre certaines contraintes sur la structure, la BDD peut être distribuée (i.e. réplication p2p) etc. Dans ce cas le type des IDs doit être homogène/uniforme pour tous les entités afin de faciliter le développement.

    Concernant ton exemple, le type "tinyint" est plus pertinent puisque les types "chaine de caractères" sont impactés par les collations en plus de comparaisons binaires. Mais en Oracle ce n'est pas ça, i.e. la bonne pratique pour les types "bool" est d'utiliser varchar(1) et check ('T', 'F')

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    OLTP... OLAP...

    Aucune idée de ce que cela veut dire .

    Cependant, tu parles des collations et c'est une chose à laquelle je n'avais pas songé et qui penche en faveur du type numérique...

    Je vais encore attendre une ou deux opinions avant d'arrêter mon choix.
    Kropernic

  4. #4
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    OLTP - -transactionnel, OLAP - décisionnel.
    Voici une exemple des pb avec les collation

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    J'imagine alors que je suis en OLTP
    Kropernic

  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 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Un type de connées littéral gère en sus une collation, à moins de le prévoir en binaire. Il y a donc plus d'effort à, faire lors des compaaisons.
    Même le SMALLINT ou TINYINT coute plus cher en traitement que le INT sur OS 32 bits ou le BIGINT sur sytème 64 bits du fait des conversions.
    Brf, ne vous emmerdez pas les poils du cul, car même un BIGINT sur 26 lignes, cela ne représentera que 7 octets de moins par ligne, soit 182 octets, à l'heure ou la moindre base fait quelques Go, soit une économie réelle de 0,0000084750354290008544921875 %

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

  7. #7
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Ok donc je laisse mes types numériques où ils sont ^^.

    INT pour 32 bits et BIGINT pour 64 bits.

    C'est noté !!
    Kropernic

  8. #8
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Même le SMALLINT ou TINYINT coute plus cher en traitement que le INT sur OS 32 bits ou le BIGINT sur sytème 64 bits du fait des conversions.
    Existent-ils les tests au ce sujet ?
    A ma connaissance, les types tinyint/smallint/int/bigint sont les types logiques et ne concerne que le stockage mais en interne (cache des données et traitement) ce sont les types optimisés pour l'architecture de plateforme cible. Mais je ne peux pas en confirmer en 100%.

    Citation Envoyé par Kropernic Voir le message
    INT pour 32 bits et BIGINT pour 64 bits.
    Ce n'est pas la règle de choix tout à fait.

  9. #9
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Un type de connées littéral gère en sus une collation, à moins de le prévoir en binaire. Il y a donc plus d'effort à, faire lors des compaaisons.
    Même le SMALLINT ou TINYINT coute plus cher en traitement que le INT sur OS 32 bits ou le BIGINT sur sytème 64 bits du fait des conversions.
    Brf, ne vous emmerdez pas les poils du cul, car même un BIGINT sur 26 lignes, cela ne représentera que 7 octets de moins par ligne, soit 182 octets, à l'heure ou la moindre base fait quelques Go, soit une économie réelle de 0,0000084750354290008544921875 %
    Vous partez du principe que cette colonne ne sera pas référencée dans des tables filles!

    S'il y a des millions de transactions alors on perd 7* des millions d'octets...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Pour chaque ligne de chaque table fille cela ne fera que 7 octet au plus par ligne... De plus, si le quidam ne ramène pas cette colonne, quelque soit le nombre de ligne, cela ne changera rien !

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

  11. #11
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Vous partez du principe que cette colonne ne sera pas référencée dans des tables filles!

    S'il y a des millions de transactions alors on perd 7* des millions d'octets...
    *ne sait plus à quel saint se vouer*

    D'un côté, les collations qui demandent du boulot en plus (lors de la comparaison et leur de l'écriture de la requête si celles des deux colonnes à comparer ne correspondent pas).
    D'un autre côté, les types numériques prenant plus de place que le char(1), on perd 7*n octets (ce sera sur un OS 64 bits) où n est le nombre de ligne référençant une ligne de la table mère.

    Rapidité de traitement ou espace de stockage... Le choix se pose là en fait non ?
    Kropernic

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Si votre table n'évoluera pas en cardinalité OK. par exemple table des jours de semaines ou des noms de mois...

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

  13. #13
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    A ce niveau là, pas de souci. Pour l'exemple que j'ai donné, c'est une table de type de transaction caisse. Or y a pas des tonnes de transaction caisse surtout que la DB ne concernera que les "gifts" (les trucs genres bons d'achat qu'on offre pour un annif ou autre...).

    Bref, il devrait y avoir en tout et pour tout 3 lignes dans cette table.
    Une pour la vente d'un gift, une pour l'utilisation d'un gift et une pour la recharge.

    Quand bien même d'autres viendrait se rajouter, cela ne dépassera jamais les 26 possibilités offertes par l'alphabet latin.

    De plus, la table des transactions caisses contiendra des millions de lignes. Chaque ligne référençant la table des types de transaction caisse.

    Cette histoire de collation est-elle vraiment pénalisante d'un point de vue performance ? Je ne me rends pas encore bien compte de comment fonctionne sql server lors de la comparaison d'une condition ...
    Kropernic

  14. #14
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Cette histoire de collation est-elle vraiment pénalisante d'un point de vue performance ?
    Pas si la collation est BINAIRE (EX: FRENCH_BIN)
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  15. #15
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Pas si la collation est BINAIRE (EX: FRENCH_BIN)

    Donc si j'ai bien tout compris, un type char(1) est ok si on est certain à 100% que le nombre de ligne restera restreint, que les lignes de la table seront référencées des millions de fois et que la collation pour cette colonne est binaire.

    N.B. : Ne pas oublier de paramétrer la même collation sur les clefs étrangères des tables filles.


    J'ai oublié quelque chose ?
    Kropernic

  16. #16
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Je ne vois pas toujours la raison d'utiliser char(1) et ne pas utiliser tinyint

  17. #17
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Bin même tinyint, c'est sur 2 octets non ?

    Char(1), c'est sur 1 octet il me semble.

    Me serais-je fourvoyé ?
    Kropernic

  18. #18
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Me serais-je fourvoyé ?
    Oui

    Int64 (BIGINT)=8 octets
    Int32 (INT)=4 octets
    Int16 (SMALLINT)=2 octets
    TINYINT=1 octets
    BIT =1 BIT
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  19. #19
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Aaaaaaaaaaaaah, bin dans ce cas, tinyint ce sera !!!
    Kropernic

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/06/2011, 16h51
  2. Choix du type de clé primaire
    Par jmerigea dans le forum SQL
    Réponses: 5
    Dernier message: 30/07/2008, 19h36
  3. [Modèle Relationnel] Design de table, choix de clef primaire
    Par Monkeyget dans le forum Schéma
    Réponses: 14
    Dernier message: 17/11/2006, 11h26
  4. choix des types
    Par cali dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/08/2004, 13h16
  5. récupérer la clef primaire d'une table
    Par orionis69 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/02/2004, 13h00

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