Nejdůležitější věcí k pochopení paralelismu Oracle je, že je komplikovaný. Optimalizace paralelismu vyžaduje hodně znalostí Oracle, čtení manuálů, kontrolu mnoha parametrů, testování dlouhotrvajících dotazů a hodně skepticismu.
Klaďte správné otázky
Paralelní problémy ve skutečnosti zahrnují tři různé otázky:
- Kolik paralelních serverů bylo požadováno?
- Kolik paralelních serverů bylo přiděleno?
- Kolik paralelních serverů bylo smysluplně použito?
Používejte nejlepší nástroje
Přejděte přímo na nejlepší nástroj - SQL Monitoring s aktivními sestavami. Najděte své SQL_ID a vygenerujte zprávu HTML:select dbms_sqltune.report_sql_monitor(sql_id => 'your_sql_id', type => 'active') from dual;
. Toto je jediný způsob, jak zjistit, kolik času bylo vynaloženo na každý krok v prováděcím plánu. A řekne vám, kolik paralelismu bylo efektivně použito a kde. Například:
Další dobrou možností je type => 'text'
. Neobsahuje tolik informací, ale je rychlejší na prohlížení a snazší sdílení.
SQL Monitoring také zahrnuje požadované DOP a přidělené DOP:
100řádkový paralelní select
může běžet krásně, ale pak se vše zastaví v jediném kroku kvůli neuložené sekvenci. Můžete se hodiny dívat na plán vysvětlení, trasování nebo zprávu AWR a nevidíte problém. Díky aktivní zprávě je hledání pomalých kroků téměř triviální. Neztrácejte čas hádáním, kde je problém.
Stále jsou však zapotřebí další nástroje. Plán vysvětlení vygenerovaný pomocí explain plan for ...
a select * from table(dbms_xplan.display)
; poskytne několik klíčových informací. Konkrétně Notes
sekce může obsahovat mnoho důvodů, proč dotaz nevyžadoval paralelismus.
Ale PROČ jsem získal takový počet paralelních serverů?
Relevantní informace jsou rozmístěny v několika různých příručkách, které jsou velmi užitečné, ale občas nepřesné nebo zavádějící. Existuje mnoho mýtů a mnoho špatných rad o paralelismu. A technologie se výrazně mění s každým vydáním.
Když dáte dohromady všechny renomované zdroje, seznam faktorů ovlivňujících počet paralelních serverů je překvapivě velký. Níže uvedený seznam je seřazen zhruba podle toho, co považuji za nejdůležitější:
- Paralelismus mezi operacemi Jakýkoli dotaz využívající řazení nebo seskupování přidělí dvakrát více paralelních serverů než DOP. To je pravděpodobně zodpovědné za mýtus „Oracle přiděluje co nejvíce paralelních serverů!“.
- Nápověda k dotazu Nejlépe nápověda na úrovni příkazu jako
/*+ parallel */
, nebo možná nápověda na úrovni objektu jako/*+ noparallel(table1) */
. Pokud konkrétní krok plánu běží sériově, je to obvykle kvůli nápovědám na úrovni objektu pouze v části dotazu. - Rekurzivní SQL Některé operace mohou běžet paralelně, ale lze je efektivně serializovat pomocí rekurzivního SQL. Například neuložená sekvence na velkém insertu. Rekurzivní SQL generovaný k analýze příkazu bude také sériový; například dynamické vzorkovací dotazy.
- Změnit relaci
alter session [force|enable] parallel [query|dml|ddl];
Všimněte si, že paralelní DML je ve výchozím nastavení zakázáno. - Stupeň tabulky
- Stupeň indexu
- Index byl levnější Paralelní rady pouze sdělují optimalizátoru, aby zvážil úplné prohledání tabulky s určitým DOP. Ve skutečnosti nevynucují paralelismus. Optimalizátor může stále volně používat sériový přístup k indexu, pokud si myslí, že je to levnější. (
FULL
nápověda může pomoci vyřešit tento problém.) - Správa plánu Základní linie plánu SQL, obrysy, profily, pokročilé přepisování a překladače SQL – to vše může změnit stupeň paralelismu za vašimi zády. Podívejte se do části Poznámka v plánu.
- Vydání Pouze verze Enterprise a Personal Edition umožňují paralelní operace. Kromě balíčku 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 To je horní hranice pro celý systém. Je tu kompromis. Provozování příliš mnoha paralelních serverů najednou je pro systém špatné. Ale downgrade dotazu na sériový může být pro některé dotazy katastrofální.
- PARALLEL_MIN_PERCENT
- PARALLEL_MIN_SERVERS
- PARALLEL_MIN_TIME_THRESHOLD
- PARALLEL_SERVERS_TARGET
- PARALLEL_THREADS_PER_CPU
- Počet uzlů RAC Další multiplikátor pro výchozí DOP.
- CPU_COUNT Pokud je použit výchozí DOP.
- RECOVERY_PARALLELISMUS
- FAST_START_PARALLEL_ROLLBACK
- Profil
SESSIONS_PER_USER
také omezuje paralelní servery. - Správce zdrojů
- Zatížení systému Pokud má parallel_adaptive_multi_user hodnotu true. Pravděpodobně je nemožné odhadnout, kdy Oracle začne utlumovat.
- PROCESY
- Paralelní omezení DML Paralelní DML nebude fungovat, pokud některý z těchto případů:
- KOMPATIBILNÍ <9.2 pro vnitřní oddíl
- VLOŽTE HODNOTY, tabulky se spouštěči
- replikace
- samostatná referenční integrita nebo odstranění kaskádových nebo odložených omezení integrity
- Přístup ke sloupci objektu
- nerozdělená tabulka s LOB
- paralelismus uvnitř oddílu s LOB
- distribuovaná transakce
- seskupené tabulky
- dočasné tabulky
- Skalární dílčí dotazy neběží paralelně? Toto je v příručce a přál bych si, aby to bylo pravda, ale moje testy naznačují, že paralelismus zde funguje v 11g.
- ENQUEUE_RESOURCES Skrytý parametr v 10g, je to ještě relevantní?
- Tabulky uspořádané podle indexů Nelze paralelně vkládat přímou cestu k IOT? (Je to stále pravda?)
- Požadavky na paralelní zřetězené funkce Je nutné použít
CURSOR
(?). TODO. - Funkce musí být PARALLEL_ENABLE
- Typ výpisu Starší verze omezovaly paralelismus na DML v závislosti na rozdělení. Některé ze současných příruček to stále obsahují, ale už to rozhodně není pravda.
- Počet oddílů Pouze pro připojení po oddílech na starších verzích.(?)
- Chyby Konkrétně jsem viděl spoustu chyb při analýze. Oracle přidělí správný počet paralelních serverů, ale nic se nestane, protože všechny čekají na události jako
cursor: pin s wait on x
.
Tento seznam rozhodně není úplný a neobsahuje funkce 12c. A neřeší problémy s operačním systémem a hardwarem. A neodpovídá na strašně obtížnou otázku, "jaký je nejlepší stupeň paralelismu?" (Krátká odpověď:více je obvykle lepší, ale na úkor jiných procesů.) Doufejme, že vám to alespoň poskytne představu o tom, jak obtížné tyto problémy mohou být, a dobré místo, kde začít hledat.