Det viktigaste att förstå om Oracle-parallellism är att det är komplicerat. Att optimera parallellitet kräver mycket Oracle-kunskap, att läsa manualerna, kontrollera många parametrar, testa långvariga frågor och mycket skepsis.
Ställ rätt frågor
Parallella problem involverar egentligen tre olika frågor:
- Hur många parallella servrar efterfrågades?
- Hur många parallella servrar tilldelades?
- Hur många parallella servrar användes på ett meningsfullt sätt?
Använd de bästa verktygen
Gå direkt till det bästa verktyget - SQL Monitoring med aktiva rapporter. Hitta ditt SQL_ID och generera HTML-rapporten:select dbms_sqltune.report_sql_monitor(sql_id => 'your_sql_id', type => 'active') from dual;
. Detta är det enda sättet att veta hur mycket tid som spenderades på varje steg i genomförandeplanen. Och det kommer att berätta hur mycket parallellitet som användes effektivt och var. Till exempel:
Ett annat bra alternativ är type => 'text'
. Den har inte lika mycket information men den är snabbare att titta på och lättare att dela.
SQL-övervakning inkluderar även den begärda DOP och den tilldelade DOP:
En 100-rads parallell select
kan springa vackert, men sedan stannar allt i ett enda steg på grund av en uncachad sekvens. Du kan stirra på en förklarande plan, ett spår eller en AWR-rapport i timmar och inte se problemet. Den aktiva rapporten gör de långsamma stegen nästan triviala att hitta. Slösa inte tid på att gissa var problemet ligger.
Men det krävs fortfarande andra verktyg. En förklaringsplan genererad med explain plan for ...
och select * from table(dbms_xplan.display)
; kommer att ge några viktiga delar av information. Närmare bestämt Notes
avsnittet kan innehålla många anledningar till varför frågan inte begärde parallellitet.
Men VARFÖR fick jag så många parallella servrar?
Den relevanta informationen är spridd över flera olika manualer, som är mycket användbara men ibland felaktiga eller vilseledande. Det finns många myter och många dåliga råd om parallellism. Och tekniken förändras avsevärt med varje release.
När du sätter ihop alla välrenommerade källor är listan över faktorer som påverkar antalet parallella servrar häpnadsväckande stor. Listan nedan är ordnad ungefär efter vad jag tycker är de viktigaste faktorerna:
- Interoperation parallellism Varje fråga som använder sortering eller gruppering kommer att allokera dubbelt så många parallella servrar som DOP. Detta är förmodligen ansvarigt för myten "Oracle allocerar så många parallella servrar som möjligt!".
- Frågetips Helst en ledtråd på satsnivå som
/*+ parallel */
, eller möjligen en ledtråd på objektnivå som/*+ noparallel(table1) */
. Om ett specifikt steg i en plan körs i serie är det vanligtvis på grund av tips på objektnivå på endast en del av frågan. - Rekursiv SQL Vissa operationer kan köras parallellt men kan effektivt serialiseras med rekursiv SQL. Till exempel en uncachad sekvens på en stor infogning. Rekursiv SQL som genereras för att analysera satsen kommer också att vara seriell; till exempel dynamiska samplingsfrågor.
- Ändra session
alter session [force|enable] parallel [query|dml|ddl];
Observera att parallell DML är inaktiverat som standard. - Tabellgrad
- Indexgrad
- Indexet var billigare Parallella tips talar bara om för optimeraren att överväga en genomsökning av en hel tabell med en viss DOP. De framtvingar faktiskt inte parallellism. Optimeraren är fortfarande gratis att använda en seriell index-åtkomst om den tror att det är billigare. (Den
FULL
tips kan hjälpa till att lösa det här problemet.) - Planhantering SQL Plan Baselines, konturer, profiler, avancerad omskrivning och SQL Translators kan alla ändra graden av parallellitet bakom din rygg. Kontrollera avsnittet Notera i planen.
- Utgåva Endast Enterprise och Personal Edition tillåter parallella operationer. Förutom paketet DBMS_PARALLEL_EXECUTE.
- PARALLEL_ADAPTIVE_MULTI_USER
- PARALLEL_AUTOMATIC_TUNING
- PARALLEL_DEGREE_LIMIT
- PARALLEL_DEGREE_POLICY
- PARALLEL_FORCE_LOCAL
- PARALLEL_INSTANCE_GROUP
- PARALLEL_IO_CAP_ENABLED
- PARALLEL_MAX_SERVERS Detta är den övre gränsen för hela systemet. Det finns en avvägning här. Att köra för många parallella servrar samtidigt är dåligt för systemet. Men att nedgradera en fråga till seriell kan vara katastrofalt för vissa frågor.
- PARALLEL_MIN_PERCENT
- PARALLEL_MIN_SERVERS
- PARALLEL_MIN_TIME_THRESHOLD
- PARALLEL_SERVERS_TARGET
- PARALLEL_THREADS_PER_CPU
- Antal RAC-noder Ytterligare en multiplikator för standard DOP.
- CPU_COUNT Om standard DOP används.
- RECOVERY_PARALLELISM
- FAST_START_PARALLEL_ROLLBACK
- Profil
SESSIONS_PER_USER
begränsar också parallella servrar. - Resurshanterare
- Systembelastning Om parallell_adaptive_multi_user är sant. Förmodligen omöjligt att gissa när Oracle kommer att börja strypa.
- PROCESSER
- Parallella DML-begränsningar Parallell DML fungerar inte om något av dessa fall:
- KOMPATIBEL <9.2 för intra-partition
- INFOGA VÄRDEN, tabeller med utlösare
- replikering
- självrefererande integritet eller ta bort kaskad eller uppskjutna integritetsbegränsningar
- åtkomst till en objektkolumn
- icke-partitionerad tabell med LOB
- intra-partition parallellism med en LOB
- distribuerad transaktion
- klustrade tabeller
- tillfälliga tabeller
- Skalära underfrågor körs inte parallellt? Det här finns i manualen och jag önskar att det var sant, men mina tester visar att parallellism fungerar här i 11g.
- ENQUEUE_RESOURCES Dold parameter i 10g, är detta relevant längre?
- Indexorganiserade tabeller Kan inte direkt-path infoga till IOTs parallellt? (Är detta fortfarande sant?)
- Parallell pipelined funktionskrav Måste använda en
CURSOR
(?). ATT GÖRA. - Funktioner måste vara PARALLEL_ENABLE
- Typ av uttalande Äldre versioner begränsade parallellism på DML beroende på partitionering. Vissa av de nuvarande manualerna innehåller fortfarande detta men det är verkligen inte sant längre.
- Antal partitioner Endast för partitionsmässiga kopplingar på äldre versioner.(?)
- Buggar Specifikt har jag sett många buggar med analys. Oracle kommer att allokera rätt antal parallella servrar men ingenting kommer att hända eftersom de alla väntar på händelser som
cursor: pin s wait on x
.
Den här listan är verkligen inte komplett och inkluderar inte 12c-funktioner. Och det tar inte upp operativsystem- och maskinvaruproblem. Och det svarar inte på den fruktansvärt svåra frågan, "vilken är den bästa graden av parallellism?" (Kort svar:mer är vanligtvis bättre, men på bekostnad av andra processer.) Förhoppningsvis ger det dig åtminstone en känsla av hur svåra dessa problem kan vara, och ett bra ställe att börja leta.