Как использовать hint parallel для ускорения запросов в Oracle
Что проверяют
Знаете ли вы, как Oracle выполняет запрос параллельно и когда это вредно, а не только синтаксис хинта. У Go-разработчика следом спрашивают, что будет, если такой запрос одновременно запустят двадцать горутин из пула соединений.
Как отвечать
Хинт это комментарий сразу после SELECT: SELECT /*+ PARALLEL(o 8) */ ... FROM orders o. Формы две:
- на уровне объекта:
PARALLEL(alias degree), указывать нужно алиас таблицы, если он задан, иначе хинт молча игнорируется; - на уровне запроса:
/*+ PARALLEL(8) */или просто/*+ PARALLEL */, тогда степень параллелизма (DOP) выбирает сам Oracle.
Механика: сессия становится координатором (query coordinator), а работу делят процессы PX servers, каждый читает свой диапазон блоков. Для запросов с сортировкой или GROUP BY серверов бывает вдвое больше DOP: один набор читает, другой агрегирует. Если свободных PX-процессов не хватает (лимит PARALLEL_MAX_SERVERS), запрос получает меньше серверов, а при автоматическом DOP может встать в очередь.
Выигрыш даёт полный скан большой таблицы: отчёты, выгрузки, аналитика. Вред будет в OLTP-запросе по индексу на пару строк, где запуск PX-процессов дороже самой выборки. Для INSERT и UPDATE параллельный DML включают отдельно: ALTER SESSION ENABLE PARALLEL DML или хинт ENABLE_PARALLEL_DML. Учтите, что параллельное выполнение доступно в Enterprise Edition.
Проверка: DBMS_XPLAN.DISPLAY_CURSOR должен показать PX COORDINATOR и PX BLOCK ITERATOR, а фактическую степень покажет V$PQ_SESSTAT.
Со стороны Go хинт это часть текста запроса, драйвер (godror или go-ora) его не трогает. Важнее ограничить конкурентность: запускайте такие запросы через отдельный пул или семафор и с context.WithTimeout.
Где спотыкаются
Пишут в хинте имя таблицы при заданном алиасе или ошибаются в синтаксисе. Oracle не выдаёт ошибку, а просто выполняет запрос последовательно.
Путают DOP с числом потоков. Это процессы на сервере, и 20 горутин с PARALLEL(8) легко требуют сотни PX-процессов, забирая ресурсы у всей базы.
Ставят хинт на всё подряд, не посмотрев план. На коротких запросах по индексу параллельность только замедляет ответ.