Oracle: почему не используется параллельное выполнение? - PullRequest
2 голосов
/ 15 марта 2012

Посмотрите на следующий запрос: Если я прокомментирую подзапрос, он использует параллельное выполнение, иначе это не так.

После того, как запрос был

SELECT  /*+ parallel(c, 20) */
      1, (SELECT 2 FROM DUAL)
  FROM DUAL c;

Ответы [ 2 ]

6 голосов
/ 15 марта 2012

Вы могли бы найти ответ в документации :

Оператор SELECT можно распараллелить, только если выполнены следующие условия:

  • Запрос включает в себя параллельную спецификацию подсказки (PARALLEL или PARALLEL_INDEX) или объекты схемы, на которые есть ссылка в запросе, имеют объявление PARALLEL, связанное с ними.

  • Как минимум одинДля таблиц, указанных в запросе, требуется одно из следующих действий:

    • Полное сканирование таблицы

    • Сканирование диапазона индекса, охватывающее несколько разделов

  • В списке SELECT нет скалярных подзапросов.

Ваш запрос находится на последнем препятствии: у него есть скалярПодзапрос в своей проекции.Если вы хотите распараллелить запрос, вам нужно найти другой способ его написания.

1 голос
/ 15 марта 2012

Одной из идей может быть не использовать подзапрос, но вы можете попробовать использовать объединение?Ваш подзапрос выглядит довольно просто, без группировки и т. Д., Поэтому не должно быть проблемой перевести его в объединение.

Возможно, оптимизатор не способен к параллельному выполнению при наличии подзапросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...