2015-07-13 11 views
5

Sto usando Oracle Database 11g Enterprise Edition versione 11.2.0.4.0 - Produzione a 64 bit e ho un problema con la seguente query che sono esecuzione in ROSPO 12.6.0.53 (non una tipica domanda, ma è solo per la dimostrazione):Oracle 11g - I segmenti dello spazio tabelle temporaneo non vengono rilasciati (bug Oracle?)

with rownums 
as (select distinct 
    rownum rn 
     from dual 
    connect by level <=1000000 
) 
select rn from rownums 
union all 
select rn from rownums; 

--Edit: this Statement ist NOT showing the behaviour: 
begin 
    for cRow in (with rownums 
       as (select distinct 
        rownum rn 
         from dual 
        connect by level <=1000000 
       ) 
       select rn from rownums 
       union all 
       select rn from rownums) 
    loop 
     return; 
    end loop; 
end; 

Dopo l'esecuzione di questa ricerca, posso controllare l'utilizzo dello spazio tabella temporanea con questa domanda:

SELECT S.sid, S.serial#, SUM (T.blocks) * TBS.block_size/1024/1024 used_mb, T.tablespace 
    FROM v$sort_usage T, v$session S, dba_tablespaces TBS 
WHERE T.session_addr = S.saddr 
    AND T.tablespace = TBS.tablespace_name 
    and s.sid = sys_context('userenv','sid') 
GROUP BY S.sid, S.serial#, TBS.block_size, T.tablespace; 

Il risultato è che ogni esecuzione del testquery di cui sopra necessita di circa 12 MB di Tablespace che non viene rilasciato finché non disconnetto la sessione. Se faccio questo spesso, porta anche un ORA-1652: impossibile estendere il segmento temporaneo.

Cosa sto sbagliando? O potrebbe essere un bug di oracolo?

+2

io non sto vedendo che in 11.2.0.3 con il blocco PL/SQL, e un effetto più piccolo con SQL pianura. Il tuo tablespace temporaneo è temporaneo o utilizza segmenti permanenti? Cosa mostra dba_tablespaces.contents? (La nota MOS 1039341.6 potrebbe essere rilevante se si ha accesso, dal momento che posso vedere v $ sortsegments.user_blocks in crescita, sempre con SQL semplice). –

+2

In realtà non lo vedo nemmeno con la semplice versione SQL, in SQL \ * Plus; ma lo sto vedendo in SQL Developer - solo se ci sono delle righe dal set di risultati che non sono state recuperate e visualizzate - quindi la query è ancora attiva. Immagino che Toad stia facendo qualcosa di simile? –

+0

Grazie per il tuo feedback, è stato il mio errore per quanto riguarda il blocco PL/SQL, NON sta mostrando il comportamento. Ho controllato dba_tablespaces.contents - ed è "TEMPORARY" e non "PERMANENTE" –

risposta

0

TEMP Tablespace presenta uno spazio su disco limitato. Quando si esegue interrogare ha cominciato a utilizzare lo spazio TEMP sempre di più e fino a che non raggiunge il suo limite e dà un errore non può estendersi TEMP, quindi possibili sono due soluzioni

  • aumentare lo spazio TEMP meglio Utilizzando EM

  • Ottimizzare query che utilizza meno TEMP

Problemi correlati