2014-11-13 13 views
6

Ho un suggerimento PARALLEL (a, 8) in una query di unione. Il mio assistente ha 4 CPU con Oracle 11.2.0.3.0 - 64bitPerché le sessioni parallele vengono create anche quando disattivo DML parallelo e DDL parallelo

Durante l'esecuzione di unire domanda che disabile le parallele DDL e DML -in v $ session 8 sessioni sono state creare.

Durante l'esecuzione della query di fusione I abilitata sono state create le sessioni parallele DDL e DML -in v $ sessione 16.

Perché sta succedendo? C'è qualche spiegazione su questo?

Inoltre, ho notato che se il DDL parallelo e DML sono abilitati

  • per PARALLEL (a, 2): totale 4 sessioni stati realizzati
  • per PARALLEL (A, 4): in totale 8 sessioni sono stati creati
  • per PARALLEL (a, 8): totale 16 sessioni stati realizzati

    ALTER sESSIONE DISABLE query parallela;
    ALTER SESSION DISABLE DML PARALLEL;
    SESSIONE ALTER DISATTIVA DDL PARALLELO;

    MERGE/* + parallela (a, 8) */BIGTABLE_1 un UTILIZZO BIGTABLE_2 b ON (a.KEY = b.KEY) QUANDO MATCHED quindi aggiornare SET a.Value1 = b.value1;

Inoltre, sulla documentazione 10g ho letto questo

La modalità predefinita di una sessione è DISABLE PARALLEL DML. Quando il DML parallelo è disabilitato, nessun DML verrà eseguito in parallelo anche se viene utilizzato il suggerimento PARALLEL .

https://docs.oracle.com/cd/B19306_01/server.102/b14223/usingpe.htm#CACCBEJC

Grazie in anticipo

risposta

3

READ e WRITE il parallelismo non sono sempre legati insieme.

alter session disable parallel dml; disattiva solo il parallelismo per la parte WRITE dell'istruzione. La parte READ può ancora funzionare in parallelo. Trattandosi di un'operazione MERGE, l'hint parallelo richiede sia il parallelismo in lettura che in scrittura. Inoltre, un suggerimento parallelo ha la precedenza su alter session disable parallel query;, anche se non sovrascrive lo alter session disable parallel dml;.

Il numero di server paralleli sarà il doppio del Grado di parallelismo richiesto per supportare producer and consumer operations, al fine di utilizzare pienamente il parallelismo tra le operazioni. Le query che raggruppano o ordinano i risultati utilizzeranno il doppio di thread. In alcuni casi ciò può accadere anche se non esiste un esplicito GROUP BY o ORDER BY perché alcune operazioni potrebbero richiedere implicitamente un ordinamento.

tabelle di esempio

create table bigtable_1(key number, value1 number); 
create table bigtable_2(key number, value1 number); 

lettura parallela e scrittura

Annotare il PX COORDINATOR per il funzionamento # 1. Quando quel passo è sopra il MERGE significa che la scrittura è fatta in parallelo.

rollback; 
alter session enable parallel dml; 
alter session enable parallel query; 
explain plan for merge /*+ parallel(a,8) */ into bigtable_1 a using bigtable_2 b 
    on (a.key = b.key) when matched then update set a.value1 = b.value1; 
select * from table(dbms_xplan.display(format => 'basic')); 

Plan hash value: 827272579 

------------------------------------------------------ 
| Id | Operation      | Name  | 
------------------------------------------------------ 
| 0 | MERGE STATEMENT     |   | 
| 1 | PX COORDINATOR     |   | <-- PARALLEL WRITE 
| 2 | PX SEND QC (RANDOM)   | :TQ10003 | 
| 3 | MERGE      | BIGTABLE_1 | 
| 4 |  PX RECEIVE     |   | <-- PARALLEL READ 
| 5 |  PX SEND HYBRID (ROWID PKEY)| :TQ10002 | 
| 6 |  VIEW      |   | 
| 7 |  HASH JOIN BUFFERED  |   | 
| 8 |   BUFFER SORT    |   | 
| 9 |   PX RECEIVE    |   | 
| 10 |   PX SEND HASH   | :TQ10000 | 
| 11 |   TABLE ACCESS FULL | BIGTABLE_2 | 
| 12 |   PX RECEIVE    |   | 
| 13 |   PX SEND HASH   | :TQ10001 | 
| 14 |   PX BLOCK ITERATOR  |   | 
| 15 |   TABLE ACCESS FULL | BIGTABLE_1 | 
------------------------------------------------------ 

scrittura seriale, parallela leggere

Ora l'operazione MERGE è soprattutto PX ... operazioni. La scrittura viene eseguita in serie, ma la lettura viene ancora eseguita in parallelo.

rollback; 
alter session disable parallel dml; 
alter session disable parallel query; 
explain plan for merge /*+ parallel(a,8) */ into bigtable_1 a using bigtable_2 b 
    on (a.key = b.key) when matched then update set a.value1 = b.value1; 
select * from table(dbms_xplan.display(format => 'basic')); 

Plan hash value: 1648019208 

------------------------------------------------ 
| Id | Operation     | Name  | 
------------------------------------------------ 
| 0 | MERGE STATEMENT   |   | 
| 1 | MERGE     | BIGTABLE_1 | <-- SERIAL WRITE 
| 2 | PX COORDINATOR   |   | <-- PARALLEL READ 
| 3 | PX SEND QC (RANDOM) | :TQ10002 | 
| 4 |  VIEW     |   | 
| 5 |  HASH JOIN BUFFERED |   | 
| 6 |  BUFFER SORT   |   | 
| 7 |  PX RECEIVE   |   | 
| 8 |   PX SEND HASH  | :TQ10000 | 
| 9 |   TABLE ACCESS FULL| BIGTABLE_2 | 
| 10 |  PX RECEIVE   |   | 
| 11 |  PX SEND HASH  | :TQ10001 | 
| 12 |   PX BLOCK ITERATOR |   | 
| 13 |   TABLE ACCESS FULL| BIGTABLE_1 | 
------------------------------------------------ 
+0

Grazie per l'ottima risposta @jon Heller. – touchchandra

+0

Inoltre, voglio solo essere chiaro in un'altra cosa. Quale configurazione suggerisci, case-1) disabilita DML e usa Parallel (a, 8) o case-2) abilita DML e usa Parallel (a, 4). Solo per garantire che la sessione totale rimanga 8. – touchchandra

+1

Io raccomando di usare '/ * + parallel (8) * /'. Questo utilizza il parallelismo a livello di istruzione invece di livello oggetto. In questo modo non devi preoccuparti di specificare singoli alias. E vorrei puntare a un DOP di 8, non a un numero di server paralleli di 8. Il numero finale potrebbe finire con 16, ma metà di quei thread saranno solo lì per ricevere dati e non tutti veramente "attivi" sul contemporaneamente. –

Problemi correlati