Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 02/07/2007, 09h50   #1
Membre habitué
 
Inscription : septembre 2002
Messages : 253
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 253
Points : 127
Points : 127
Par défaut [Oracle 10 g] Colonne auto-incrémentée

Bonjour,

Il se passe un truc que je ne m'explique pas.

Quand je fais:
Code :
1
2
 
INSERT INTO MaTable (NOM) VALUES ('Pierre')
la colonne ID présente dans cette table s'incrémente bien, dans le dernier insert l'ID=246.

Par contre quand je fais:
Code :
1
2
 
SELECT LAST_NUMBER FROM all_sequences WHERE sequence_name='SQ_TEST';
il me retourne:361

Bizarre , non ?

Merci d'avance pour votre aide.

A+
Thomad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 13h28   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
Quel est le cache size ?

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
25
26
27
28
29
CREATE SEQUENCE WMC_SEQ
  START WITH 0
  MAXVALUE 9999
  MINVALUE 0
  NOCYCLE
  CACHE 3;
 
DECLARE
	v_num NUMBER;
BEGIN
	SELECT last_number INTO v_num FROM all_sequences WHERE sequence_name = 'WMC_SEQ';
	DBMS_OUTPUT.PUT_LINE('last:'|| v_num);
	SELECT wmc_seq.NEXTVAL INTO v_num FROM DUAL;
	DBMS_OUTPUT.PUT_LINE('next:'|| v_num);
	SELECT last_number INTO v_num FROM all_sequences WHERE sequence_name = 'WMC_SEQ';
	DBMS_OUTPUT.PUT_LINE('last:'|| v_num);
	SELECT wmc_seq.NEXTVAL INTO v_num FROM DUAL;
	DBMS_OUTPUT.PUT_LINE('next:'|| v_num);
	SELECT last_number INTO v_num FROM all_sequences WHERE sequence_name = 'WMC_SEQ';
	DBMS_OUTPUT.PUT_LINE('last:'|| v_num);
	SELECT wmc_seq.NEXTVAL INTO v_num FROM DUAL;
	DBMS_OUTPUT.PUT_LINE('next:'|| v_num);
	SELECT last_number INTO v_num FROM all_sequences WHERE sequence_name = 'WMC_SEQ';
	DBMS_OUTPUT.PUT_LINE('last:'|| v_num);
	SELECT wmc_seq.NEXTVAL INTO v_num FROM DUAL;
	DBMS_OUTPUT.PUT_LINE('next:'|| v_num);
	SELECT last_number INTO v_num FROM all_sequences WHERE sequence_name = 'WMC_SEQ';
	DBMS_OUTPUT.PUT_LINE('last:'|| v_num);
END;
Code :
1
2
3
4
5
6
7
8
9
last:0
next:0
last:3
next:1
last:3
next:2
last:3
next:3
last:6
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 13h34   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
En fait ta demande est trop incomplète pour qu'on sache si ça vient de là.

Quel est le trigger qui met à jour le champ ID.
Qui d'autre utilise la séquence 'SQ_TEST' ?
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 14h09   #4
Membre habitué
 
Inscription : septembre 2002
Messages : 253
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 253
Points : 127
Points : 127
Citation:
Quel est le cache size ?
Il était à 20. Je n'avais pas interprété comme çà ce paramètre.

Encore merci.

A+
Thomad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 14h32   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
Ben oui, mais 246 + 20 c'est toujours inférieur à 361
Ou alors c'est pas 361 mais 261
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 16h31   #6
Membre habitué
 
Inscription : septembre 2002
Messages : 253
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 253
Points : 127
Points : 127
Citation:
la colonne ID présente dans cette table s'incrémente bien, dans le dernier insert l'ID=246.
Il fallait lire 346.
Thomad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 10h37   #7
Membre régulier
 
Inscription : juin 2005
Messages : 260
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 260
Points : 92
Points : 92
Bonjour,

Je me permets de remonter le sujet car je pense avoir un problème assez similaire à celui ci.

En fait, j'ai aussi une séquence ou le cachesize est à 20 (j'ai récupérer des scripts de création que j'ai modifié et j'ai laissé cette valeur en faite...)

Seulement, quand j'utilise une application qui se connecte à cette base, si j'utilise plusieurs fois la séquence, elle s'incrémente d'1 à chaque fois, mais parfois (je ne sais pas quand) il semblerait que la valeur "saute" et que la valeur selectionnée est la valeur + le cachesize (donc x1 ou x est un nombre quelconque).

Je voudrais savoir pourquoi j'obtiens cela ? Et est-ce que ca peut poser des soucis ?

Merci pour vos éclaircissements.
RR instinct est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 11h16   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
Les séquences sous Oracle certifient l'unicité et non la suite logique sans trou.

Le cache : La suite des chiffres de la séquence est montée dans la mémoire, la séquence basée est modifiée avec valeur + cache_size

Un flush du cache (volontaire ou pas) effacera les valeurs de la mémoire, Au prochain appel, Oracle refais une demande de cache_size chiffres (La valeur basée réaugmente de cache_size).


Donc si tu fais appel à la séquence 1 fois, puis que la base travaille jusqu'à ce que l'espace dédié à la séquence soit requis, tu "sautes" des chiffres.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 11h19   #9
Membre régulier
 
Inscription : juin 2005
Messages : 260
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 260
Points : 92
Points : 92
Voilà qui est plus clair, merci.

Donc plus on met un cache_size faible, moins on saute de valeur mais je suppose que lorsqu'Oracle refait une demande de mise en cache, l'opération est plus longue c'est ca ?

C'est pas dramatique si on a des valeurs qui sautent de toute façon ? Tant qu'elles sont bien uniques c'est l'essentiel ?
RR instinct est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 11h23   #10
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 213
Points : 4 213
C'est exactement ça : Le "plus" couteux c'est de monter dans le cache les requetes.
Ensuite ça dépend combien de fois la séquence est utilisée.. c'est pas la mort non plus si tu as un cache_size de faible.

PS : par flush du cache volontaire j'entendais :
Code :
ALTER SYSTEM FLUSH SHARED_POOLED
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 11h43   #11
Membre régulier
 
Inscription : juin 2005
Messages : 260
Détails du profil
Informations forums :
Inscription : juin 2005
Messages : 260
Points : 92
Points : 92
OK, j'ai saisi

Merci beaucoup.
RR instinct est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 13h11   #12
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
C'est un simple problème de logique, oracle ne peut pas garantir une suite logique, car il fourni un numéro différent à chaque transactions, avant que celles ci soient commitées. Personne ne force apres l'utilisateur à valider la transaction, et en cas de rollback, tant pis ce numéro est "perdu". Il fourni aussi un numéro unique à chacun meme en cas d'accès multiple de plusieurs transactions à une même séquence.
En imaginant qu'on exige d'oracle qu'il fournisse une suite propre, alors en retour il ne pourrait donner accès à la séquence qu'a une seule transaction à la fois. Une transaction longue lockerait alors la séquence pour tous les autres utilisateurs...
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web