Oracle
 sql >> база данни >  >> RDS >> Oracle

Защо не мога да принудя Oracle 11g да консумира повече процесори за една SQL заявка

Най-важното нещо, което трябва да разберете за паралелизма на Oracle, е, че той е сложен. Оптимизирането на паралелизъм изисква много познания на Oracle, четене на ръководствата, проверка на много параметри, тестване на продължителни заявки и много скептицизъм.

Задайте правилните въпроси

Паралелните проблеми наистина включват три различни въпроса:

  1. Колко паралелни сървъра бяха заявени?
  2. Колко паралелни сървъра бяха разпределени?
  3. Колко паралелни сървъра са били смислено използвани?

Използвайте най-добрите инструменти

Отидете направо до най-добрия инструмент - SQL мониторинг с активни отчети. Намерете своя SQL_ID и генерирайте HTML отчета:select dbms_sqltune.report_sql_monitor(sql_id => 'your_sql_id', type => 'active') from dual; . Това е единственият начин да разберете колко време е изразходвано за всяка стъпка от плана за изпълнение. И ще ви каже колко паралелизъм е бил ефективно използван и къде. Например:

Друга добра опция е type => 'text' . Не съдържа толкова много информация, но е по-бърза за разглеждане и по-лесна за споделяне.

Мониторингът на SQL също включва исканата DOP и разпределената DOP:

100-редов паралел select може да работи прекрасно, но тогава всичко спира на една стъпка поради некеширана последователност. Можете да гледате план за обяснение, следа или отчет за AWR с часове и да не видите проблема. Активният отчет прави бавните стъпки почти тривиални за намиране. Не губете време да гадаете къде е проблемът.

Въпреки това, все още са необходими други инструменти. План за обяснение, генериран с explain plan for ... и select * from table(dbms_xplan.display); ще предостави няколко ключова информация. По-конкретно Notes раздел може да включва много причини, поради които заявката не е поискала паралелизъм.

Но ЗАЩО получих този брой паралелни сървъри?

Съответната информация е разпределена в няколко различни ръководства, които са много полезни, но понякога са неточни или подвеждащи. Има много митове и много лоши съвети относно паралелизма. И технологията се променя значително с всяка версия.

Когато съберете всички реномирани източници, списъкът с фактори, влияещи върху броя на паралелните сървъри, е удивително голям. Списъкът по-долу е подреден приблизително според това, което според мен са най-важните фактори:

  1. Паралелизъм на операциите Всяка заявка, използваща сортиране или групиране, ще разпредели два пъти повече паралелни сървъри от DOP. Това вероятно е отговорно за мита „Oracle разпределя възможно най-много паралелни сървъри!
  2. Подсказка за заявка За предпочитане е намек на ниво израз като /*+ parallel */ , или евентуално намек на ниво обект като /*+ noparallel(table1) */ . Ако конкретна стъпка от план се изпълнява последователно, това обикновено се дължи на подсказки на ниво обект само върху част от заявката.
  3. Рекурсивен SQL Някои операции могат да се изпълняват паралелно, но могат да бъдат ефективно сериализирани чрез рекурсивен SQL. Например, некеширана последователност върху голяма вложка. Рекурсивният SQL, генериран за анализиране на израза, също ще бъде сериен; например заявки за динамични извадки.
  4. Промяна на сесията alter session [force|enable] parallel [query|dml|ddl]; Имайте предвид, че паралелният DML е деактивиран по подразбиране.
  5. Таблица степен
  6. Индекс на степен
  7. Индексът беше по-евтин Паралелните намеци само казват на оптимизатора да обмисли пълно сканиране на таблица с определен DOP. Те всъщност не налагат паралелизъм. Оптимизаторът все още е свободен да използва сериен индексен достъп, ако смята, че е по-евтин. (FULL намек може да помогне за решаването на този проблем.)
  8. Управление на планове Базови линии на SQL план, очертания, профили, разширено пренаписване и SQL преводачи могат да променят степента на паралелизъм зад гърба ви. Проверете секцията Забележка на плана.
  9. Издание Само Enterprise и Personal Edition позволяват паралелни операции. С изключение на пакета DBMS_PARALLEL_EXECUTE.
  10. PARALLEL_ADAPTIVE_MULTI_USER
  11. PARALLEL_AUTOMATIC_TUNING
  12. PARALLEL_DEGREE_LIMIT
  13. PARALLEL_DEGREE_POLICY
  14. PARALLEL_FORCE_LOCAL
  15. PARALLEL_INSTANCE_GROUP
  16. PARALLEL_IO_CAP_ENABLED
  17. PARALLEL_MAX_SERVERS Това е горната граница за цялата система. Тук има компромис. Пускането на твърде много паралелни сървъри наведнъж е лошо за системата. Но понижаването на заявка до серийно може да бъде катастрофално за някои заявки.
  18. PARALLEL_MIN_PERCENT
  19. PARALLEL_MIN_SERVERS
  20. PARALLEL_MIN_TIME_THRESHOLD
  21. PARALLEL_SERVERS_TARGET
  22. PARALLEL_THREADS_PER_CPU
  23. Брой RAC възли Друг множител за DOP по подразбиране.
  24. CPU_COUNT Ако се използва DOP по подразбиране.
  25. RECOVERY_PARALLELISM
  26. FAST_START_PARALLEL_ROLLBACK
  27. Профил SESSIONS_PER_USER също така ограничава паралелните сървъри.
  28. Мениджър на ресурси
  29. Зареждане на системата Ако parallel_adaptive_multi_user е true. Вероятно е невъзможно да се отгатне кога Oracle ще започне да дроселира.
  30. ПРОЦЕСИ
  31. Ограничения за паралелни DML Паралелният DML няма да работи, ако някой от тези случаи:
    1. СЪВМЕСТИМ <9.2 за вътрешноразделен дял
    2. INSERT VALUES, таблици със задействания
    3. репликация
    4. целост на самореференция или изтриване на каскадни или отложени ограничения за целостта
    5. достъп до колона с обект
    6. неразделена таблица с LOB
    7. паралелизъм в рамките на дяла с LOB
    8. разпределена транзакция
    9. клъстерирани таблици
    10. временни таблици
  32. Скаларните подзаявки не се изпълняват паралелно? Това е в ръководството и ми се иска да беше вярно, но моите тестове показват, че паралелизмът работи тук в 11g.
  33. ENQUEUE_RESOURCES Скрит параметър в 10g, това актуално ли е вече?
  34. Индексно организирани таблици Не можете да вмъкнете паралелно директен път към IOT? (Вярно ли е това?)
  35. Изисквания за паралелни конвейерни функции Трябва да използвате CURSOR (?). ЗАДАЧИ.
  36. Функциите трябва да са PARALLEL_ENABLE
  37. Тип изявление По-старите версии ограничаваха паралелизма на DML в зависимост от разделянето. Някои от текущите ръководства все още включват това, но със сигурност вече не е вярно.
  38. Брой дялове Само за присъединяване на дялове в по-стари версии.(?)
  39. Бъгове По-конкретно, видях много грешки при анализа. Oracle ще разпредели точния брой паралелни сървъри, но нищо няма да се случи, тъй като всички те чакат събития като cursor: pin s wait on x .

Този списък със сигурност не е пълен и не включва функции 12c. И не разглежда проблеми с операционната система и хардуера. И не отговаря на ужасно трудния въпрос "коя е най-добрата степен на паралелизъм?" (Кратък отговор:повече обикновено е по-добре, но за сметка на други процеси.) Надяваме се, че поне ви дава представа колко трудни могат да бъдат тези проблеми и е добро място да започнете да търсите.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да деинсталирате / напълно да премахнете Oracle 11g (клиент)?

  2. Oracle PL/SQL:Създайте DML пакет онлайн

  3. Нови дати за безплатни изпити за сертифициране в Oracle Cloud и Autonomous Database

  4. Предимства от изучаването на нови DB системи

  5. Клиентски и мрежови компоненти на Oracle не бяха открити