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 :

Valeur derniere insertion ROWGUID


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut Valeur derniere insertion ROWGUID
    Bonjour,

    Avec SQL Serveur lorsque nous avons un champs autoincremente nous pouvons recuperer sa valeur lors de l'insertion via @@identity.
    Existe t il l'equivalent pour recuperer la valeur d'un rowguid suite a insert?

    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 761
    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 761
    Points : 52 548
    Points
    52 548
    Billets dans le blog
    5
    Par défaut
    Absolument pas et il est TRÈS FORTEMENT déconseillé d'utiliser un UNIQUEIDENTIFIER (GUID ou UUID) comme clef primaire des tables !

    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 actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 148
    Points : 291
    Points
    291
    Par défaut
    Je suis très curieux de savoir pourquoi SQLPRO ! Merci d'avance pour l'explication

  4. #4
    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
    Parce qu'une colonne de type uniqueidentifier est stockée sur un paquet d'octet, je n'ai plus en tête combien mais c'est plus que 4 (espace utilisé pour stocker un int).

    Ce qui fait que, pour chaque table référençant cette clef primaire, ça va faire encore autant d'octets "perdus".

    En plus, vu que les clefs sont souvent la cible d'opérateur de comparaison, il est beaucoup plus rapide de comparer des données de type int que des données de type uniqueidentifier.

    Si mes souvenirs sont bons, à part si vous travaillez sur plusieurs serveurs en "load balancing" et qu'il faut tout centraliser après, pas la peine d'utiliser uniqueidentifier.
    Kropernic

  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'ai finalement retrouvé la place prise pour stockée un uniqueidentifier et c'est 16 octets. Soit 4 fois plus qu'un int et 2 fois qu'un big int.

    De plus, voici ce qu'on peut lire sur la page de la MSDN :
    The uniqueidentifier data type has the following disadvantages:

    • The values are long and obscure. This makes them difficult for users to type correctly, and more difficult for users to remember.
    • The values are random and cannot accept any patterns that may make them more meaningful to users.
    • There is no way to determine the sequence in which uniqueidentifier values were generated. They are not suited for existing applications that depend on incrementing key values serially.
    • At 16 bytes, the uniqueidentifier data type is relatively larger than other data types, such as 4-byte integers. This means indexes that are built using uniqueidentifier keys might be relatively slower than indexes using an int key.

    Le 4e point explicite plus en détail ce que je tentais de soulever.
    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 761
    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 761
    Points : 52 548
    Points
    52 548
    Billets dans le blog
    5
    Par défaut
    Par exemple ans une jointure vous allez devoir faire 16 fois plus de tour dans le processeur en 32 bits qu'avec un simple INT pour calculer une jointure !

    En sus la fragmentation des tables est immédiate et très lourde avec un GUID du fait de son "aléatoirité" alors qu'avedc un incrément il n'y a pas de fragmentation vu que c'est en croissance monotone....

    A me lire : http://blog.developpez.com/sqlpro/p7...ent_le_verdict

    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
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 148
    Points : 291
    Points
    291
    Par défaut
    Merci pour vos réponses rapides et claires

    Je demande surtout ça car je travail sous Dynamics CRM, qui est entièrement basé sur des PK de type UNIQUEIDENTIFIER ! Étonnant donc...

  8. #8
    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
    L'enfer est pavé de bonnes intentions
    Kropernic

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par playfone Voir le message
    Je demande surtout ça car je travail sous Dynamics CRM, qui est entièrement basé sur des PK de type UNIQUEIDENTIFIER ! Étonnant donc...
    SAP avait des clefs primaires stockées dans des NVARCHAR(max) (je ne suis plus totalement sûr du max) mais avec juste des entiers dedans...

  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 761
    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 761
    Points : 52 548
    Points
    52 548
    Billets dans le blog
    5
    Par défaut
    Il y a quelques années nous avons audité une application de gestion de la sécurité sociale pour les handicapés. la base avait été entièrement réalisée avec des PK sur des GUID...
    Le serveur a rapidement atteint ses limites et l'hébergeur avait été attaqué par le client final parce que les temps de réponse étaient catastrophique... Jusqu'à ce qu'il fasse appel à nous et que nous remontions la bêtise à la SSII qui avait développée la chose...
    Le plus marrant est que cette SSII avaient viré de la boîte la seule personne compétence sur SQL Server (notre ancien président du GUSS - Groupe de Utilisateurs de SQL Server) !

    bref, ils ont dû revoir leur copie.... ce qui leu a coûté cher !

    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
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Merci, pour vos reponses.

    Juste pour informations le rowguid je l'ai deja en base puisque je bosse sur des serveurs avec replication.
    Les developpeurs bossent sur une table ou il n'y a pas d'auto increment et du coup ils font un max(id) pour recuperer la valeur de l'id qu'ils veulent creer.
    Donc je cherchais une solution simple sans avoir a toucher la structure de la table ni faire de lock pour leur assurer que leur id est unique.
    D'ou mon idee de m'appuyer sur le rowguid.

    A priori, c'est d'ailleurs possible via un output de le recuperer juste apres l'insert.

  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 761
    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 761
    Points : 52 548
    Points
    52 548
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par xian21 Voir le message
    Les developpeurs bossent sur une table ou il n'y a pas d'auto increment et du coup ils font un max(id) pour recuperer la valeur de l'id qu'ils veulent creer.
    C'est effectivement une solution imbécile car non seulement elle peut provoquer des télescopages (deux fois la même valeur) mais elle est par nature totalement contre performante car il faut verrouiller l'intégralité de la table pour calculer un MAX !
    A partir de là, vous avez même de grande chances d'obtenir des verrous mortels.

    Pourquoi ne pas rajouter la propriété IDENTITY aux colonnes déjà clef ? Ce serait le plus efficace et le plus simple !

    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
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2010
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2010
    Messages : 148
    Points : 291
    Points
    291
    Par défaut
    Mais comment Microsoft justifie-t-il une gestion totale de Dynamics CRM via Guid alors ? C'est quand même fou par rapport à ce que vous en dites !

    EDIT : En faite, Dynamics CRM utilise NEWSEQUENTIALID() pour générer ses PK, une utilisation similaire à l'auto-incrément mais pour les Guid si j'ai bien compris.

  14. #14
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Pourquoi ne pas rajouter la propriété IDENTITY aux colonnes déjà clef ? Ce serait le plus efficace et le plus simple !
    Pour l'instant c'est refuse par la direction a cause de l'impact sur la replication. (modification de la structure)...

  15. #15
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 761
    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 761
    Points : 52 548
    Points
    52 548
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par playfone Voir le message
    Mais comment Microsoft justifie-t-il une gestion totale de Dynamics CRM via Guid alors ? C'est quand même fou par rapport à ce que vous en dites !

    EDIT : En faite, Dynamics CRM utilise NEWSEQUENTIALID() pour générer ses PK, une utilisation similaire à l'auto-incrément mais pour les Guid si j'ai bien compris.
    C'est légèrement mieux, mais pas plus.... Ceci permet d'éviter un peu la fragmentation...

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

  16. #16
    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 : 42
    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,

    Pour récupérer la valeur du GUID, je ne vois pas d'autre moyen que d'utiliser la clause OUTPUT :

    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
    CREATE TABLE test_GUID
    (
    	pk uniqueidentifier
    		CONSTRAINT PK_test_GUID PRIMARY KEY
    		CONSTRAINT DF_test_GUID__pk DEFAULT (NEWSEQUENTIALID())
    	, i tinyint
    )
    GO
     
    DECLARE @t TABLE
    (
    	pk uniqueidentifier
    )
     
    INSERT INTO dbo.test_GUID (i)
    OUTPUT INSERTED.pk INTO @t
    VALUES (1), (2), (3)
     
    SELECT	pk
    FROM	@t
    @++

  17. #17
    Membre averti
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2007
    Messages
    497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 497
    Points : 330
    Points
    330
    Par défaut
    Oui, merci

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

Discussions similaires

  1. select d'une soustraction entre 2 valeurs puis insert
    Par vinch999 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/04/2011, 16h23
  2. [AC-97] last insert into - dernier insert into
    Par coyote90 dans le forum VBA Access
    Réponses: 7
    Dernier message: 04/02/2011, 19h59
  3. Calcul d'une valeur pour insertion dans la table des faits
    Par moheissenger dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 24/02/2010, 01h02
  4. Debutant copier/coller valeur dernier ligne colonne 13
    Par floflo83 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/11/2009, 15h31
  5. [MySQL] afficher le dernier insert dans une table
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 20/02/2007, 11h58

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