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

Développement SQL Server Discussion :

Optimisation colonne GUID


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 208
    Par défaut Optimisation colonne GUID
    Bonjour,

    dans le cadre d'un de nos projets sous SQL Server 2014 nous disposons de deux tables qui sont synchronisées entre une application web et des smartphones sous Android (elles sont donc présentes sur tous les mobiles). Dans notre base ces deux tables possèdent des identifiants uniques de type "entier" en tant que clé primaire, mais nous disposons également d'une colonne GUID unique qui permet d'avoir un identifiant unique qui va "suivre" la donnée dès sa création sur les portables.

    Ainsi notre table A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A_ID int
    A_guid nvarchar(50)
    Et notre deuxième table DetailA :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    detailA_ID int
    detailA_guid nvarchar(50)
    A_guid nvarchar(50) (sur mobile exclusivement)
    Les colonnes GUID sont utilisées dans les applications mobiles et au moment de la synchronisation sur le serveur SQL, les données de "detailA" vont aller chercher l'ID de SQL Server correspondant à son "A_guid" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select A_ID from A where A_guid = detailA.A_guid
    Grâce à ce système toutes nos données sont correctement liées les unes aux autres via les identifiants SQL Server. Bien sûr tout fonctionne tant que les données sont peu nombreuses. Mais maintenant nous avons plusieurs millions d'informations dans nos tables et les recherches sur les colonnes "GUID" commencent à prendre du temps (quelques secondes mais nous savons que cela va augmenter), je cherche donc un moyen d'accélérer le processus. Toutes nos colonnes GUID sont au format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ID_DU_SMARTPHONE-YYYMMDD-[Fonction NEWID() de SQL]
    Je pensais que grâce à ce format nous pourrions éventuellement appliquer un index mais ce n'est pas très efficace. J'ai pensé à changer le format pour qu'ils correspondent à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ID_DU_SMARTPHONE-YYYMMDD_HIS
    Mais je ne sais pas si nous gagnerons en rapidité.

    Je suis preneur de toute idée.

    Merci.

  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 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Il suffit d'indexer correctement et notamment avec un index UNIQUE !

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

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

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

    Informations forums :
    Inscription : Septembre 2016
    Messages : 959
    Par défaut
    C'est pour répondre aux cahier des charges comme le votre que le type uniqueidentifier a été implémenté.
    Ce type est dédié au stockage des GUID.

    Si vous pouvez gagner en stockage sans compromettre l'objectif d'unicité global c'est une piste à suivre.
    Rappels :
    uniqueidentifier occupe 16 octets (taille fixe)
    les types "fixes" sont plus performants que les types "variables"


    La fonction newid() présente l'inconvénient d'être purement aléatoire.
    La fonction newsequentialid() a l'avantage de rester aléatoire tout en ajoutant la contrainte de "valeur supérieure à la précédente". Ceci a le bon ton d'éviter une fragmentation délirante des index.
    https://docs.microsoft.com/fr-fr/sql...ql-server-2017

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    208
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 208
    Par défaut
    Je vous remercie de vos retours.

    Je vais changer tout ça.

  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 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    ...
    La fonction newid() présente l'inconvénient d'être purement aléatoire.
    La fonction newsequentialid() a l'avantage de rester aléatoire tout en ajoutant la contrainte de "valeur supérieure à la précédente". Ceci a le bon ton d'éviter une fragmentation délirante des index.
    https://docs.microsoft.com/fr-fr/sql...ql-server-2017
    Ce n'est pas non plus la panacée car le tri des GUID n'est pas linéaire comme l'est le NESEQUENTIALID()….

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

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

Discussions similaires

  1. Optimisation stockage de colonnes
    Par vinzzzz dans le forum Décisions SGBD
    Réponses: 13
    Dernier message: 03/12/2009, 10h53
  2. Affichage & Optimisation d'une colonne
    Par Sethenssen dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/11/2009, 10h04
  3. Réponses: 2
    Dernier message: 11/04/2009, 12h57
  4. Réponses: 2
    Dernier message: 16/03/2009, 17h23
  5. Optimisation de l'algoritme de positionnement de colonnes
    Par Bruno13 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 08/11/2007, 15h22

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