Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2008, 21h33   #1
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Par défaut Clé primaire de type GUID et type date

Bonjour,

Avant j'utilisais le type GUID comme clé primaire d'une table avec MS SQL où un type spécial "uniqueidentifier" existait. Mais je me creuse de la tête pour faire la même chose sous Oracle, donc j'utiliserais le type VARCHAR2(36) ou VARCHAR2(38) (avec les accolades du GUID) comme équivalence.
Comment faire alors pour faire ce champ qui se donne une valeur toute seule sans qu'on l'ajoute toujours dans la liste des VALUES lors des insertions, je me propose
Code :
ID char (36) DEFAULT  SYS_GUID() PRIMARY KEY
mais que contiendra la fonction SYS_GUID()

Et pour un champ de type date + heure, quel est le mieux: DATE ou TIMESTAMP ??
  Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2008, 22h46   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Citation:
Envoyé par Lucas Panny Voir le message
Et pour un champ de type date + heure, quel est le mieux: DATE ou TIMESTAMP ??
Les types DATE et TIMESTAMP gèrent tous les deux date+heure.
La différence est que TIMESTAMP permet de gérer la partie fractionnaire des secondes et peut prendre en charge le timezone. De plus, il est aussi fortement couplé au type INTERVAL qui permet de gérer des intervalles entre TIMESTAMPs

Pour gérer date+heure seulement, DATE est le plus simple
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2008, 15h02   #3
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Et pour le GUID en clé primaire ?
  Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2008, 15h09   #4
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Pourquoi passer par un guid varchar2(38) ???

Pourquoi pas passer par un simple ID numérique couplé à une séquence ?

Entre un ID de type NUMBER et un ID de type VARCHAR2(38), y a pas photo !

C'est vraiment un pré-requis qui t'es imposé d'avoir un GUID ?
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 09h09   #5
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Une clé primaire en UUID est très familier surtout pour les utilisateurs de BD Sql Server (qui bénéficient du type natif UNIQUEIDENTIFIER) et Access 2003. Et je voudrais tout simplement faire la même chose avec Oracle.
J'ai même trouvé sur le net une fonction pour créer un GUID (http://www.oracle-base.com/articles/9i/UUID9i.php):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CREATE OR REPLACE FUNCTION new_uuid RETURN VARCHAR2 AS
  l_seed        BINARY_INTEGER;
  l_random_num  NUMBER(5);
 
  l_date        VARCHAR2(25);
  l_random      VARCHAR2(4);
  l_ip_address  VARCHAR2(12);
BEGIN
  l_seed := TO_NUMBER(TO_CHAR(SYSDATE,'YYYYDDMMSS'));
  DBMS_RANDOM.initialize (val => l_seed);
  l_random_num := TRUNC(DBMS_RANDOM.value(low => 1, high => 65535));
  DBMS_RANDOM.terminate;
 
  l_date       := conversion_api.to_hex(TO_NUMBER(TO_CHAR(SYSTIMESTAMP,'FFSSMIHH24DDMMYYYY')));
  l_random     := RPAD(conversion_api.to_hex(l_random_num), 4, '0');
  l_ip_address := conversion_api.to_hex(TO_NUMBER(REPLACE(NVL(SYS_CONTEXT('USERENV','IP_ADDRESS'), '123.123.123.123'), '.', '')));
 
  RETURN SUBSTR(l_date, 1, 8)                     || '-' ||
         SUBSTR(l_date, 9, 4)                     || '-' ||
         SUBSTR(l_date, 13, 4)                    || '-' ||
         RPAD(SUBSTR(l_date, 17), 4, '0')         || '-' ||
         RPAD(l_random || l_ip_address, 12, '0');
END;
/
Mais comment faire pour que ce champ s'auto-crée !!! Je veux faire:
Code :
ID varchar2(38) DEFAULT  new_uuid PRIMARY KEY
mais ça ne passe pas donc faut toujours insérer cette fonction à chaque insertion
Sous MSSQL, on peut faire [ID] [uniqueidentifier] PRIMARY KEY DEFAULT NEWID()
  Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 09h19   #6
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Citation:
Envoyé par Lucas Panny Voir le message
Une clé primaire en UUID est très familier surtout pour les utilisateurs de BD Sql Server (qui bénéficient du type natif UNIQUEIDENTIFIER) et Access 2003. Et je voudrais tout simplement faire la même chose avec Oracle.
Ok, mais ma question (et remarque) ne portait sur le fait que MS Server le permet mais sur l'utilité même de gérer un Guid lourd à générer et à stocker et qui lent à indexer... Alors q'un simple NUMBER fait la même chose avec des perfs nettement meilleures !

Sinon, si tu tiens vraiment à utiliser ta fonction, tu peux l'appeler :
  • dans le insert
  • ou dans un trigger sur on insert
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 10h25   #7
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
Envoyé par vicenzo Voir le message
  • ou dans un trigger sur on insert
Comment ?

Il faudrait donc un trigger pour chaque table, quelle poisse !!!
Citation:
ID varchar2(38) DEFAULT new_uuid PRIMARY KEY
Même Oracle 11g ne peut-il pas faire ça ?

En effet, un GUID est difficile à indexer mais je dois l'utiliser !!!
  Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 10h36   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par vicenzo Voir le message
sur l'utilité même de gérer un Guid lourd à générer et à stocker et qui lent à indexer...
Si ni plus lourd ni plus lent qu'un NUMBER... en revanche ça évite les contentions sur les séquences et plus important, ça évite les trous
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 10h57   #9
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par orafrance Voir le message
Si ni plus lourd ni plus lent qu'un NUMBER... en revanche ça évite les contentions sur les séquences et plus important, ça évite les trous
Ca mérite une explication parce que je ne le vois pas (mais pas du tout). C'est quoi un trous dans un GUID ? Et c'est quoi "les contentions" sur les séquences ? Bon sur les tables ça va, mais sur les séquences ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 11h01   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
une séquence ne garantie pas la perte de valeur, notamment à cause du cache et souffre d'une grosse concurrence d'accès. Les contentions sont du même type que les library cache pin pour les procédures et packages.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 11h04   #11
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Citation:
Envoyé par orafrance Voir le message
Si ni plus lourd ni plus lent qu'un NUMBER... en revanche ça évite les contentions sur les séquences et plus important, ça évite les trous

Tu es en train de me dire que gérer une clé primaire via un varchar2(40) n'est pas plus pénalisant en terme de stockage, indexation et recherche qu'un Number ??

Alors la, je fais mon Saint Thomas et je demande à voir !!
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 11h48   #12
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par orafrance Voir le message
une séquence ne garantie pas la perte de valeur ...
vrai

Citation:
Envoyé par orafrance Voir le message
... notamment à cause du cache et souffre d'une grosse concurrence d'accès.
faux :ce n'est pas seulement le cache. Ni une séquence avec le caché à zéro ne peut garantir la non perte des valeurs.
Citation:

--------------------------------------------------------------------------------
Caution:
If accountability for all sequence numbers is required, that is, if your application can never lose sequence numbers, then you cannot use Oracle sequences and you may choose to store sequence numbers in database tables

faux: une séquence ne souffre pas du tout d'une grosse concurrence d'accès. Elles permet aux applications d'être évolutive du ce point de vue.
Citation:
Sequences eliminate serialization and improve the concurrency of your application
Citation:
Envoyé par orafrance Voir le message
...Les contentions sont du même type que les library cache pin pour les procédures et packages.
J'ai de doute
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 12h19   #13
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Quel débat !!!

Pour nous les novices, on s'y perd un peu mais je me demande: les séquences sont-elles des trucs d'Oracle seulement ou SQL Server l'utilise aussi ?

TIMESTAMP ou DATE ? Que choisir à la fin ?
La fonction CURRENT_DATE peut-elle retourner un timestamp ? par ex un champ
Citation:
"DATEVALID" TIMESTAMP DEFAULT CURRENT_DATE,
Est-ce que le type timestamp peut être une valeur de retour d'une fonction ou d'une procédure stockées ?
  Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 12h43   #14
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Si tu n'a pas besoin la partie fractionnaire des secondes, utilise DATE.

PS : Pour retourner le timestamp courant, c'est CURRENT_TIMESTAMP()
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 12h46   #15
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par mnitu Voir le message
faux :ce n'est pas seulement le cache. Ni une séquence avec le caché à zéro ne peut garantir la non perte des valeurs.
notamment = c'est d'autant plus flagrant quand il y a un cache

Citation:
Envoyé par mnitu Voir le message
faux: une séquence ne souffre pas du tout d'une grosse concurrence d'accès. Elles permet aux applications d'être évolutive du ce point de vue.

J'ai de doute
Pourtant, je peux t'assurer que la contention sur les séquences existent bel et bien.

Code :
Sequences eliminate serialization AND improve the concurrency of your application
cela signifie que c'est moins sujet à blocage qu'une séquence géré dans une table... ça ne garantie pas la suppression totale des séquences. En tout cas, je l'ai déjà observer et tu sais comme moi que les docs Oracle parlent rarement des défauts du SGBD
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 13h33   #16
Lucas Panny
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Hey o ! CURRENT_DATE ne retourne que la date mais pas l'heure !
Juste par curiosité, quelle est l'équivalence de TIMESTAMP sous Sql Server puisque DATETIME n'est que date+heure, pas de fraction de secondes.
  Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 13h35   #17
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
CURRENT_DATE() renvoi date+heure...

Par contre le format dans lequel c'est affiché dépend de l'outil, des options par défaut, ...
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 14h16   #18
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par orafrance Voir le message
...
Pourtant, je peux t'assurer que la contention sur les séquences existent bel et bien.

Code :
Sequences eliminate serialization AND improve the concurrency of your application
cela signifie que c'est moins sujet à blocage qu'une séquence géré dans une table... ça ne garantie pas la suppression totale des séquences. En tout cas, je l'ai déjà observer et tu sais comme moi que les docs Oracle parlent rarement des défauts du SGBD
Bref, il y a une partie de vérité dans tes affirmations. La contention n’est pas à l’utilisation directe de la séquence (SELECT … SEQUENCE.NEXTVAL …FROM DUAL) mais dans la suite donnée : la valeur ainsi obtenu est inséré comme un identifient unique dans une clé primaire non- fonctionnelle et donc indexée. Et comme les valeurs de la séquence sont ordonnées ça se traduit par le fait que tout le monde est en train d’écrire dans le même block de données de l’index en question. Une des solutions à ce problème sont les indexes inversés mais cette solution pose parfois un autre problème que j’ai l’impression qu’il reste entièrement valable pour les GUID.
Et le pire c’est que le plus souvent les gens ne retient que le fait qu’une séquence pose des problèmes et donc il s’en sorte avec leur propre gestion des séquences stockées dans les tables ce qui pose encore bien plus des problèmes.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 14h50   #19
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par mnitu Voir le message
Et le pire c’est que le plus souvent les gens ne retient que le fait qu’une séquence pose des problèmes et donc il s’en sorte avec leur propre gestion des séquences stockées dans les tables ce qui pose encore bien plus des problèmes.
c'est clair que la séquence reste le meilleur moyen d'éviter les contentions. Pour la petite histoire j'ai également eu des contentions sur DUAL... et c'est pas évident de s'en passer
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 15h07   #20
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par orafrance Voir le message
...Pour la petite histoire j'ai également eu des contentions sur DUAL... et c'est pas évident de s'en passer
C'est déjà réglé en 10g il me semble
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h19.


 
 
 
 
Partenaires

Hébergement Web