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 :

NEWSEQUENTIALID() vs NEWID()?


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 : 41
    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 NEWSEQUENTIALID() vs NEWID()?
    Hello ,

    besoin d'avis et de vos retour d'expérience

    Pensez-vous que l'utilisation de Type NEWSEQUENTIALID() soit plus efficace que NEWID()?

    Étant donné que l'insertion avec la première cas sera séquentielle, tandis que celle avec la deuxième sera aléatoire, du coup l'index sera moins fragmenté.

    merci pour vos retour

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 306
    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 306
    Points : 39 666
    Points
    39 666
    Billets dans le blog
    9
    Par défaut
    Je pense que ça dépend surtout du nombre de thread générant des insertions

    S'il y en a beaucoup, avec un identifiant séquentiel, le risque d'accès concurrents sur les mêmes pages d'index est élevé, on a alors intérêt à générer des valeurs aléatoires pour que les insert concernent des pages différentes.
    Si au contraire il y en a peu, ou alors que les insertions sont faites dans un seul thread (par un traitement batch par exemple) on peut privilégier des valeurs contiguës pour limiter la fragmentation des index

  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 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    L'utilisation d'un GUID ou UUID comme clé primaire d'une table est une absurdité...

    Outre le fait de fragmenter si c'est un NEWID(), l'UNIQUEIDENTIFIER utilise 16 octets et donc nécessite 2 mots d'un processeur 64 bits pour être lu... C'est le double d'un BIGINT qui se lit directement dans le processeur en une seule passe.

    Le générateur de GUID utilise un processus système qui lit la MACADDRESSE et l'heure système et combine ces informations. Hors ces routines ne peuvent être exécutées en parallèle. C'est donc un point de contention...

    Comme la valeur de la PK de l'index cluster est utilisé par tous les index non clustered pour servir de repère de ligne, vous doublez le stockage dans tous les index secondaires...

    Enfin, les tri et groupages sont effectué en binaire du poids faible au poids fort, et non comme on le croit trop souvent à la manière d'une chaine de caractères...

    Demo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    WITH T AS (
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    UNION ALL
    SELECT NEWID() AS NI
    ) SELECT * FROM T ORDER BY 1
    Résultat du tri :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    13DD8947-D31B-4B7B-9BCE-006F5B8A5A0F
    C36DA5C6-5A42-47A7-BD07-03E9BD734020
    92CE3765-D6C2-4726-BA42-13C56239335A
    E7389B88-819A-44A1-A104-2B73340D0A7F
    884954ED-AA0F-4800-A190-478EA5C23DCE
    9A8EF249-E5A5-4797-85E0-590DDEFA0668
    9F5D1673-9A41-47B9-A9FD-5C10B71C1F70
    423FFFC5-6FB3-4900-A1D5-72C914EAA1DE
    2F24ECE1-B106-4333-812F-ACAD5757B149
    90384408-FBE6-4866-A028-C6028B8E8DE0
    6B98803D-8F30-42BF-B595-D5BEC6A7B9F8
    BF882C52-76A3-40B9-914D-D7E70FC58D28
    E9C6D73F-A045-4F0D-9663-E55964761FA5
    3CD21C4B-1AFF-4219-B29B-EFD39431CD57
    Bref l'usage du GUID en PK est un poison qui a des conséquence néfaste à toutes les échelles et processus (opérationnel, maintenance...)

    Bon courage si vous persistez dans cette horreur... ça donnera du travail aux expert que nous somme en matière d'audit pour tout rectifier quand il sera trop tard !

    A +

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Enfin, les tri et groupages sont effectué en binaire du poids faible au poids fort, et non comme on le croit trop souvent à la manière d'une chaine de caractères...
    Il suffit de convertir le GUID en char(36)

  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 849
    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 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Il suffit de convertir le GUID en char(36)
    Oui pour passer de 8 octets à 36 afin d'en pourrir encore plus les perfs.... !!!!!

Discussions similaires

  1. SQL SERV 2005 - NEWID() et DISTINCT
    Par apnw7931 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/03/2011, 17h41
  2. [AC-2003] Equivalent de NewID()
    Par apnw7931 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 07/03/2011, 12h01
  3. NEWID() Un de ces bugs que Microsoft ne compte pas corriger
    Par Sergejack dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 29/03/2010, 14h21
  4. [Access] Equivalents Procedures Stockées et NewId
    Par Fredo02 dans le forum Access
    Réponses: 18
    Dernier message: 12/01/2009, 12h25
  5. NEWSEQUENTIALID() et guids légataires
    Par Babyneedle dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 07/12/2007, 23h25

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