2011-02-23 3 views
1
update tableA 
set tableA.column1 = 'someValue' 
where tableA.column2 in 
(select column3 from tableB where tableB.column4 in 
(
'valueA', 
'valueB', 
-- about 50 more records go here 
) 
) 

Lorsque je l'exécute, la base de données semble se bloquer. Je suis assez nouveau à sql, donc je veux exclure (... ou plus probablement diriger dans) la possibilité que le problème est avec ma déclaration. Je cours ceci sur une base de données d'oracle en utilisant sqlDeveloper.Une raison pour laquelle ce sql pourrait causer des problèmes?

+0

Cela me semble bien, vérifiez s'il y a des déclencheurs sur les tables ou il y a beaucoup de données à analyser. – Arun

+0

Vous pouvez également vérifier si tableA.column2 et tableB.column4 sont indexés. –

Répondre

1

Si le DB semble «se bloquer», il se peut qu'il y ait des modifications dans les données d'une autre session non dédiée.

Essayez ...

SELECT * 
FROM tableA 
WHERE tableA.column2 IN (select ....) 
FOR UPDATE NOWAIT; 

et voir si vous obtenez un:

ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired 

Assurez-vous que vous émettez un ROLLBACK après ce test.

Si vous obtenez l'erreur, cela indique qu'une autre session a un verrou sur les données.

+0

Merci, cela semble être le problème. – CBA

0

Attend OK pour moi, pour voir combien de mises à jour que vous êtes sur le point d'effectuer faire:

SELECT COUNT(1) FROM tableA WHERE tableA.column2 IN (select ....) 

(où ... est de vous extrait de code ci-dessus). Si vous obtenez beaucoup de hits, alors cela pourrait être le problème.

+0

la requête met à jour 18 enregistrements – CBA

2

Bien que cette mise à jour est en cours d'exécution (ou « suspendu »), ouvrir une autre session et numéro:

select event 
    from v$session 
where sid = [sid_from_session_running_update] 

pour voir ce qu'il fait. Vous pouvez trouver le sid en émettant cette requête (avant la mise à jour « gèlera », bien sûr):

select distinct sid from v$mystat 

Seulement si vous voyez quelque chose comme ceci:

SQL> select event 
    2 from v$session 
    3 where sid = 148 
    4/

EVENT 
---------------------------------------------------------------- 
enq: TX - row lock contention 

1 row selected. 

, est un cas de un verrou de ligne. Vous pouvez également utiliser d'autres vues v $ pour déterminer ce qui se passe. Par exemple, vous pouvez vérifier v $ sess_io à plusieurs reprises pour voir si des progrès ont été réalisés. Ou v $ session_longops ou v $ sql_plan_statistics peuvent vous donner des indices sur ce qui se passe. Regardez et vous trouverez :-)

Espérons que cela aide.

Cordialement,
Rob.

Questions connexes