56 votes

Comment dois-je stocker un GUID dans Oracle ?

Je viens du monde de SQL Server où nous avions un identifiant unique. Existe-t-il un équivalent dans oracle ? Cette colonne sera fréquemment interrogée, la performance est donc la clé.

Je génère le GUID en .Net et je le transmets à Oracle. Pour plusieurs raisons, il ne peut pas être généré par Oracle et je ne peux donc pas utiliser la séquence.

62voto

Turnkey Points 5817
CREATE table test (testguid RAW(16) default SYS_GUID() ) 

Ce blog a étudié la performance relative.

0 votes

Le blog ne compare que le travail avec un guide généré à partir de la base de données par rapport au travail avec une séquence.nextval, mais je me demande quelles sont les performances lorsque l'on travaille avec des guides générés à partir du code .net ?

0 votes

Il a ajouté cette précision dans le deuxième paragraphe après que j'ai répondu. Il y aurait probablement un impact sur les performances lors de l'insertion en raison de la taille des index et du fait que l'index serait divisé en raison de l'aspect aléatoire du guid .Net. Si la fonction native d'Oracle est utilisée, les index sont disposés de manière séquentielle pour éviter cela, comme dans la fonction de SQL Server.

0 votes

+1 pour la réponse concise avec la source, mais quel est le but de default SYS_GUID() ? J'ai survolé l'article, et on ne voit pas à quoi sert cette partie.

8voto

Erik Anderson Points 119

Comme d'autres l'ont dit, l'utilisation de GUIDs a un impact sur les performances par rapport aux séquences numériques. Cela dit, il existe une fonction appelée " SYS_GUID() " disponible depuis Oracle 8i qui fournit l'équivalent brut :

SQL> SELECT SYS_GUID() FROM DUAL;

SYS_GUID()
--------------------------------
248AACE7F7DE424E8B9E1F31A9F101D5

Une fonction pourrait être créée pour renvoyer un GUID formaté :

CREATE OR REPLACE FUNCTION GET_FORMATTED_GUID RETURN VARCHAR2 IS guid VARCHAR2(38) ;
BEGIN
    SELECT SYS_GUID() INTO guid FROM DUAL ;

    guid :=
        '{' || SUBSTR(guid,  1, 8) ||
        '-' || SUBSTR(guid,  9, 4) ||
        '-' || SUBSTR(guid, 13, 4) ||
        '-' || SUBSTR(guid, 17, 4) ||
        '-' || SUBSTR(guid, 21) || '}' ;

    RETURN guid ;
END GET_FORMATTED_GUID ;
/

On obtient ainsi une chaîne de caractères interchangeable :

SQL> SELECT GET_FORMATTED_GUID() FROM DUAL ;

GET_FORMATTED_GUID()
--------------------------------------
{15417950-9197-4ADD-BD49-BA043F262180}

Il convient de noter que certaines plates-formes Oracle renvoient des valeurs de GUID similaires mais toujours uniques. comme indiqué par Steven Feuerstein.

Mise à jour 11/3/2020 : Avec 10g, Oracle a ajouté la prise en charge des fonctions d'expressions régulières, ce qui signifie que la concaténation peut être simplifiée à l'aide de l'option REGEXP_REPLACE() fonction.

REGEXP_REPLACE(
    SYS_GUID(),
    '([0-9A-F]{8})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{4})([0-9A-F]{12})',
    '{\1-\2-\3-\4-\5}'
)

L'expression décompose la valeur de la chaîne retournée par SYS_GUID() en 5 groupes de valeurs hexadécimales et le reconstruit en insérant un "-" entre chaque groupe.

4voto

hamishmcn Points 3486

Si je comprends bien la question, vous voulez générer un identifiant unique lorsque vous insérez une ligne dans la base de données.
Vous pourriez utiliser un séquence pour le faire. lien ici
Une fois que vous avez créé votre séquence, vous pouvez l'utiliser comme suit :

INSERT INTO mytable (col1, col2) VALUES (myseq.NEXTVAL, 'some other data');

3voto

stolsvik Points 2049

RAW(16) est apparemment l'équivalent préféré pour le type MS SQL uniqueidentifier.

2voto

Osama ALASSIRY Points 3606

Les GUIDs ne sont pas aussi utilisés dans Oracle que dans MSSQL, nous avons tendance à avoir un champ NUMBER (non nul et clé primaire), une séquence, et un déclencheur sur insertion pour le remplir (pour chaque table).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X