Collected posts: Oracle, SQL, PL/SQL, Performance, Security...(More than 300 blogs)

samedi 24 décembre 2011

ORA-30926: unable to get a stable set of rows in the source tables

J'ai eu ce message suite à une requête de merge:


 MERGE INTO events_last a
  USING   events  b
    ON (a.event =b.event)
  WHEN MATCHED THEN
    UPDATE SET a.date_event = b.date_event
  WHEN NOT MATCHED THEN
    INSERT (event, date_event)
    VALUES (b.event, b.date_event);

le contenu de table  events et events_last est le suivant:
select date_event, event from events order by  event;
 select date_event, event from events_last order by  event desc ;

Le problème provient de la jointure entre les deux tables events_last et events qui retourne plus qu'une ligne pour le même event , donc pour résoudre le problème, je propose la solution suivante :

MERGE INTO events_last a  USING ( select max(date_event) date_event,event from  events group by event ) b    ON (a.event =b.event)  WHEN MATCHED THEN    UPDATE SET a.date_event = b.date_event  WHEN NOT MATCHED THEN    INSERT (event, date_event)    VALUES (b.event, b.date_event);



Juste une remarque la solution dépend de votre besoin, pour ne pas avoir cet erreur, il suffit de s'assurer que la jointure entre les deux tables ne retourne pas plus qu'une ligne en appliquant les clauses dans le bloc ON comme dans notre cas (a.event =b.event).






lundi 7 novembre 2011

Oracle 11G: Les indexes invisibles


Vous pouvez créer un index comme invisible ; ce que veut dire le CBO ne voit pas cet index lors de création de plan d’exécution.

Le but de l’utilisation des indexes invisibles résident en deux :
  •        Test l’utilisation de cet index, Si la performance s’est amélioré alors on le rend visible sinon on le supprime
  •        On veut l’utiliser dans un cas particulier sans toucher les autres plans et la performance des autres processus dans notre application utilisant cette table.

Tous les index sont par défaut visibles pour le CBO sauf si on les crée invisible.

On crée une table events:
SQL> create table events as select sysdate-rownum date_event ,  'Event '||rownum  Event, rownum event_id from dual connect by level < 10  ;



On crée un index invisible sur cette table: create index events_idx1 on events (event_id) invisible;

L'utilisation des indexes invisbles est contrôlé par le paramètre systeme optimizer_use_invisible_indexes. Ce paramètre est par défaut à false. 

On essaye avec le Hint index pour obliger le CBO d'utliser cet index mais ça marche pas.


     Si vous voulez que le CBO prend en compte tous les index invisibles, il suffit de mettre le paramètre optimizer_use_invisible_indexes à True. La valeur par défaut est False
     Vous pouvez le mettre à true au niveau session ou bien niveau système.
  •      alter session set optimizer_use_invisible_indexes=true;
  •         alter system set optimizer_use_invisible_indexes=true;






Maintenant notre index invisible est utilisé.






jeudi 22 septembre 2011

Division par zéro fonctionne ??!!!!!

Deviner le résulat de la requête suivante    :

SELECT 1 FROM DUAL WHERE EXISTS ( SELECT 1/0 FROM DUAL ) ;


On s'attend à :

 
ORA-01476:
divisor is equal to zero
Cause:
An expression attempted to divide by zero.
Action:
Correct the expression, then retry the operation

Mais ça donne bien 1.














         

dimanche 18 septembre 2011

Architecture d'une base des données Oracle

Ces deux tutoriels s’avèrent intéressants pour comprendre l'architecture d'une bases des données oracle.





samedi 17 septembre 2011

Grant sur les vues V$



J'ai essayé de donner le droit select à l'utilisateur oracle HR sur la vue v$session , 
grant select on v$session  to hr;
j'ai reçu ce message ,