
Envoyé par
SQLpro
... ???? d'ou vous sortez tout d'un coup cette notion d'épuisement des valeurs ???
Des calculs exprimés dans le point n°2 que vous avez repris en commentaire.

Envoyé par
SQLpro
... évidemment qu'entre de 4 octets et du 16 octets l'épuisement sera plus rapide; Mais pourquoi vous cantonner au 4 octets (INT) alors qu'il y a le BIGINT (8 octets) ?
Déjà avec le BIGINT, à raison de 1 000 000 de lignes insérées par seconde, il vous faudra 584 554 années, 17 jours, 8 heures, 1 minute et 49 secondes pour épuiser le stocke des valeurs potentielles.
On est d'accord, avec un bigint on est large.
C'était dis dans le fameux point 2.
Merci pour les calculs

Envoyé par
SQLpro
Alors même avec 1000 instances en parallèle, cela vous laisse : 5 845 années soit un peu plus de 58 siècles.
De plus l'identity étant propre à chaque table (contrairement au GUID qui est global), si vous avez 100 tables, vous aurez donc, épuisez toutes les valeurs de toutes les tables dans environ 58 millions d'années.
Là, par contre le calcul me semble foireux : le remplissage des tables n'est pas homogène, ni même le remplissage des bases.
Le point bloquant sera atteint à la 1ere table arrivant à court de n° (et non pas de lignes, déjà expliqué la différence)

Envoyé par
SQLpro
Quatre inconvénients supplémentaires du fait du GUID par rapport à l'IDENTITY :
1) deux fois plus d'octets => moins de performances car la lecture d'un GUID nécessite 2 passes dans le processeurs alors qu'un INT n'en fait qu'une seule.
Plusieurs choses :
Occupation de l'espace par rapport au type : UNIQUEIDENTIFIER = 2 BIGINT = 4 INT
Choix d'avoir une colonne UNIQUEIDENTIFIER : rappelons que dans le cas d'une réplication de fusion cette colonne est imposée, donc présente.
C'est la colonne UNIQUEIDENTIFIER qui va être utilisé par le mécanisme de réplication.
On réécrit tout en open source et on en informe bilou ? 

Envoyé par
SQLpro
Et si c'est l'index cluster ce sont tous les index secondaires qui sont impactés....
Vrai.
Mais on avait déjà parlé de bien gérer ça, non ?

Envoyé par
SQLpro
Ce sont aussi des tables notablement plus grosses, car il faut aussi compter les clefs étrangères qui seront aussi deux fois plus grosses...
Re vrai.

Envoyé par
SQLpro
tout ceci n'est pas négligeable en terme de maintenance (sauvegarde - et la compression n'est pas efficace sur un GUID - maintenance des index et statistiques...).
2) le hot spot créé par le calcul du GUID. En effet les performances sont nettement ralenties lorsqu'il y a une concurrence des INSERT dans différentes tables du fait de différents utilisateurs, car c'est le même bout de code (une API Windows) qui calcule les GUID. Les performances deviennent d'ailleurs erratique en cas de très forte concurrence...
Ben si la présence de la colonne est imposée, ce sera idem, kifkif bourricot.

Envoyé par
SQLpro
3) la lecture du GUID... Essayez donc au téléphone (dans la cadre d'un SAV applicatif par exemple) de demandez à un utilisateur de vous communiquer la valeur d'un GUID... neuf fois sur 10 il se trompera, alors qu'avec un simple chiffre il y a moins de risque d'erreur !
Vaste débat de savoir quand et comment afficher les identifiants techniques aux utilisateurs.
Je préfère avoir à déterminer par moi même l'identifiant de Mme Duchemu, même s'il y en existe plusieurs, que de parler du client 120356.
Et si on doit passer par une liste d'identifiants alors là le bon vieux copier-coller fait l'affaire.
L'avantage est que si on se trompe de table (si, si je l'ai vu
) les valeurs étant globalement unique, la requête ne renvoie rien, plutôt que des lignes erronées.

Envoyé par
SQLpro
4) pas de possibilité de récupérer facilement la valeur d'un GUID après insertion, alors que c'est si simple avec un IDENTITY (fonction SCOPE_IDENTITY()...)
Changement de pratique.
On fait comment avec une séquence ?
Au passage faudra le dire à Larry (Oracle) que c'est pas pratique son idée de séquence 

Envoyé par
SQLpro
Autre inconvénient, mais je ne sais pas s'il est toujours de mise, pour des raisons de dispersion universelle des valeurs, le GUID est calculé par rapport à une lecture de la MAC adresse du PC. En multipliant le nombre de GUID généré par une même machine on peut reconstituer la MAC adresse de la machine. Ceci était très vrai au tout début des algorithmes de génération des GUID....
Pour attaquer un serveur grâce à sa MAC address il faut être dans le même sous réseau dans le cadre de l'unicast.
Il existe des doublons de MAC address : 6 octets c'est plus qu'en IPv4 mais moins qu'en IPV6...
Les machines virtuelles sont aussi des grandes pourvoyeuses de mac en double.

Envoyé par
SQLpro
Pour info, il y a 10 ans, nous avons eut à auditer une base de données gouvernementale, liée à la santé (je ne peut en dire plus, mais plusieurs millions de bénéficiaires...); Toutes les clefs était en GUID et malgré le NEWSEQUENTIALID() c'était une catastrophe.... Il a fallut changer en INT/BIGINT/SMALLINT avec IDENTITY selon le cas pour chaque table.
Ben ça je veux bien le croire.
Surtout passer au SMALLINT ça du faire du bien.
Il me manque de savoir si vous avez conservé les colonnes uniqueidentifier dans chaque table.
Si c'est le cas, au moins pour la partie hors réplication, l'écart de performance pour les tables en BIGINT est valable.
Je m'emballe peut être. Est-ce que l'écart de performance a été mesuré globalement ou possède t'on des métriques spécifiques sur les tables dont l'ID est passé en BIGINT ?
Si ce n'est le cas, le travail nécessaire a été fait, et, je pense même, bien fait. Mais l'exemple n'est pas valide dans le sens où ce travail n'est pas transposable à une réplication de fusion.
NOTE : j'espère que notre petit débat intéresse les autres internautes car sinon on pourrait débattre de ça autours d'une bière, non ?
Partager