Степен на разпаралеляване (DOP) в Oracle Database 11g

Степен на разпаралеляване (DOP) в Oracle Database 11g

Мнениеот tonibony » Нед Юни 01, 2014 3:42 am

Миналата есен (2013-10-11) присъствах на презентация на Николай Ковачев за паралелното изпълнение (Parallel eXecution, съкратено PX) на SQL и PL/SQL в Oracle Database. Ники обърна внимание колко е важно при PX правилното определяне на степента на разпаралеляване (Degree Of Paralelism, съкратено DOP). Няма как да не се съглася. Нямам голям опит в областта, но много от проблемите с PX, които съм срещал са били причинени от неподходяща DOP. Въобще, правилното определяне на DOP е една от добре известните слабости на PX в Oracle Database. Това ме предизвика да си припомня и систематизирам начините за определяне на DOP в Oracle Database 11g.

Какво е DOP

DOP е цяло число, >= 2, което се определя от Oracle DB Server всеки път когато изпълнява паралелно SQL команда. DOP определя колко PX процеса ще изпълняват всяка разпаралелена обработка. При паралелно изпълнение на даден SQL оператор, в зависимост от плана за изпълнение, може да се наемат един или два "набора" PX процеси. T.е. броя на използваните PX процеси е DOP или 2 x DOP. Координиращ е основния процес изпълняващ работата по сесията и той никога не се включва в тази бройка.

Разлики в определянето на DOP между Oracle DB 10g и 11g

В Oracle DB 11g има съществени промени в начина за определяне на DOP спрямо 10g. Интересното е, че тези промени по премълчаване са изключени! По-точно се управляват с instance параметъра PARALLEL_DEGREE_POLICY. Възможните му стойности са MANUAL, LIMITED и AUTO. Стойността по премълчаване MANUAL изключва всички нововъведения за определяне на DOP в 11g.

Затова в описанието на начините за определяне на DOP по-долу описвам както новия начин по който работи Oracle DB 11g, така и поведението му по премълчаване в стил "ала 10g".

Забележка: Стойността на параметъра PARALLEL_DEGREE_POLICY може да се променя и само за текущата сесия (с ALTER SESSION), т.е. можете да включвате новите екстри само за сесията или даже временно, за конкретен скрипт или операция.

Освен чрез параметъра PARALLEL_DEGREE_POLICY, новите възможности в Oracle 11g могат избирателно да се включват или изключват на ниво SQL оператор, като се използват hint-ове.

Методи за определяне на DOP

Следва описание на основните методи за определяне на DOP:

  • Задаване на DOP с hint
  • Задаване на DOP за сесията
  • Аutomatic DOP
  • Manual DOP
  • Default DOP

Задаване на DOP с hint

Това е най-простия и дуракоустойчив начин за избор на DOP. За целта използвате hint-а PARALLEL(число), като числото е желаната DOP.

Този метод за определяне на DOP е с най-висок приоритет и анулира всички други методи (описани по-долу).

Внимание! В Oracle DB 10g синтаксиса на hint-а PARALLEL e различен: PARALLEL(таблица,число) или PARALLEL(таблица). И смисълът му е различен - override-ва зададената в дефиницията на таблицата DOP (виж по-долу секцията "Manual DOP"). В 11g този синтаксис се поддържа за съвместимост, но в зависимост от другите настройки може да няма ефект. Накратко: Не ползвайте стария синтаксис на hint-а в 11g!

Задаване на DOP за сесията

ALTER SESSION FORCE PARALLEL [QUERY|DML|DDL] PARALLEL число;

Важи за всички следващи SQL команди в сесията. Има по-висок приоритет от всички други методи за определяне на DOP (описани по-долу), освен hint-овете.

Аutomatic DOP

Oracle автоматично изчислява подходяща DOP за оператора.

Този метод е нов в Oracle DB 11g и се използва когато

  • PARALLEL_DEGREE_POLICY=AUTO или
  • PARALLEL_DEGREE_POLICY=LIMITED и поне една от ползваните таблици и индекси при изпълнението има зададена настройка за Default DOP (виж по-долу)

Може да принудите Oracle да използва този метод с hint PARALLEL(AUTO).

Manual DOP

[CREATE|ALTER] [TABLE|INDEX] ... PARALLEL число;

Зададената по този начин DOP остава постоянно записана в речника на базата, като характеристика на съответната таблица или индекс. Може да се види в колонката DEGREE на view-тата [USER|ALL|DBA]_TABLES и [USER|ALL|DBA]_INDEXES.

При изпълнение на SELECT оператор се проверява зададената DOP на всички таблици и индекси, които се ползват при изпълнението и се взема най-голямата DOP.

При изпълнение на DML или DDL оператор се използва зададената DOP на основната target таблица (или индекс), където се записват данните. Ако записването на данните не се разпаралелява поради някаква причина, но в DML/DDL оператора има подзаявка която се разпаралелява — DOP за нея се определя според горното правило за SELECT оператор.

Този метод е от старите "ала 10g" и се използва когато не е активен метода Аutomatic DOP.

Може да принудите Oracle да използва този метод с hint PARALLEL(MANUAL).

Default DOP

Методът "по премълчаване" също е от старите "изпитани" методи и е доказал своята непригодност в мнооого-много случаи.

Формулата е проста:

  • за single instance: DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT
  • за RAC: DOP = PARALLEL_THREADS_PER_CPU x CPU_COUNT x INSTANCE_COUNT

PARALLEL_THREADS_PER_CPU и CPU_COUNT са instance параметри, които може да се променят само за целия instance (не и за сесия).

Методът се използва, когато не е активен метода Аutomatic DOP и е поискано разпаралеляване, но без да се посочва конкретна стойност за DOP. Последното може да стане по два начина:

  • за таблица или индекс може да се зададе настройка за разпаралеляване без конкретна DOP: [CREATE|ALTER] [TABLE|INDEX] ... PARALLEL; (в колонката DEGREE във view-тата от речника се появява стойност 'DEFAULT');
  • за сесията може да се зададе насилствено разпаралеляване без конкретна DOP: ALTER SESSION FORCE PARALLEL [QUERY|DML|DDL].

Може да принудите Oracle да използва този метод с hint PARALLEL(DEFAULT).

Автоматично намаляване на DOP

По премълчаване в Oracle DB е включен алгоритъм наречен Adaptive Parallelism. Той автоматично намалява изчисления DOP (независимо по кой метод), когато в базата е натоварена. Целта е да се предотврати претоварване на системата.

Какво значи натоварена база не е много ясно дефинирано, но явно е свързано с броя активни сесии и PX процеси. Цитирам: "The algorithm assumes that the system has been tuned for optimal performance in a single-user environment."

Това нещо може да се изключи само на ниво instance, с параметъра PARALLEL_ADAPTIVE_MULTI_USER.

Автоматично ограничаване на DOP

След като DOP е изчислена се сравнява с няколко ограничения и ако ги надхвърля, се намалява до тях:

  • Брой свободни PX процеси. Максималния брой PX процеси в instance-а е ограничен с параметъра PARALLEL_MAX_SERVERS. Част от тези процеси в момента може да са заети с разпаралеляване на други операции. Ползва се каквото е останало.
  • Брой обработвани дялове/поддялове в таблиците/индексите. Ако плана за изпълнение използва partitioning-а на таблиците/индексите, една гранула е един дял или поддял. Не може DOP да е по-голяма от наличния брой гранули.
  • PARALLEL_DEGREE_LIMIT_P1 атрибут на директива в DB Resource Manager. Важи само за сесиите в указаните групи консуматори на ресурси.
  • PARALLEL_DEGREE_LIMIT instance параметър. Важи само за метода Аutomatic DOP. По премълчаване има стойност "CPU", което ограничава DOP до стойност изчислена по формула, същата като за Default DOP. Можете да смените стойността на този параметър на ниво сесия (с ALTER SESSION).

Свободни размисли и повече информация

Разликите между Oracle DB 10g и 11g в паралелното изпълнение не са само в определянето на DOP. Например, когато в 11g използвате "Automatic DOP" задължително се прави преценка дали разпаралеляването изобщо си заслужава. И се избира последователния план, стига е достатъчно добър (ако според оценката ще се изпълни до 10 секунди). При 10g няма такова нещо. Други нови екстри са statement queuing и in-memory parallel execution, за които Ники също разказа в презентацията си.

Не засягам темата за това кога Oracle DB ще разпаралели даден SQL оператор и кога не. Има десетки условия и ограничения заради различни причини - липса на подходящи паралелни алгоритми, нереализирани в Oracle възможности, предпазни "бушони" и др. Просто смятам, че определянето на DOP е по-важно.

Още нещо. Ако сте прочели всичко дотук може да останете с впечатлението че нововъведенията при определяне на DOP в Oracle DB 11g категорично са по-добри от стария начин и без съмнение трябва да ги използвате. Ако мислите така, помислете пак: Като са толкоз хубави защо по премълчаване са изключени? И след като по премълчаване са изключени колко от потребителите по света реално ги ползват? Например, за да работи "Automatic DOP" администратора трябва да калиброва I/O параметрите на storage подсистемата, а наскоро разбрах че дадения от Oracle инструмент за целта (DBMS_RESOURCE_MANAGER.CALIBRATE_IO) всъщност не е достатъчно пригоден (видях статия на Gwen Shapira по темата http://www.pythian.com/blog/secrets-of- ... rallelism/). Oracle и преди са правили неуспешни опити да подобрят настройката на разпаралеляването в базата - виж параметъра PARALLEL_AUTOMATIC_TUNING. Но специално в 11g нововъведенията изглеждат успешни и сe развиват в последващите издания и версии (до 12.1.0.1 включително). Т.е. има хляб в тях, но с едно наум ...

За повече информация препоръчвам следните материали:

tonibony
 
Мнения: 1
Регистриран на: Съб Мар 01, 2014 8:15 am

Назад към Database Administration and Tuning