Su Oracle Exadata (11gR2), abbiamo un database relativamente robusto.
- cpu_count è 24
- parallel_server_instances è 2
- parallel_threads_per_cpu è 2
Abbiamo osservato, attraverso l'osservazione in Oracle Enterprise Manager (OEM), che le prestazioni sono state terribili a causa delle query eseguite in serie. Per risolvere questo problema, tutte le tabelle, le viste materializzate e gli indici sono stati modificati per sfruttare il parallelismo. per esempio:
ALTER TABLE SOME_TABLE PARALLEL (DEGREE DEFAULT INSTANCES DEFAULT);
Il sistema è stato modificato per attivare la parallelizzazione:
ALTER SYSTEM SET PARALLEL_DEGREE_POLICY = 'AUTO';
Ciò ha portato a prestazioni migliori, ma occasionalmente abbiamo osservato in OEM che una singola query avrebbe legato un DOP di 96 (tutte le risorse disponibili). Ciò ha comportato il downgrade delle query successive a un DOP di 1 (nessuna parallelizzazione). Il risultato è una prestazione scadente fino al completamento della query di hogging.
Per risolvere questo problema, abbiamo cercato di limitare il DOP disponibile a qualsiasi query con:
ALTER SYSTEM SET PARALLEL_DEGREE_LIMIT = 24;
Questo non ha avuto effetto. Osserviamo frequentemente query che useranno più del limite (generalmente 48 o 96, ma nessun modello reale).
Come possiamo impedire a una singola query di registrare tutte le risorse disponibili?