> Как использовать hint parallel для ускорения запросов в Oracle (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Хинт PARALLEL в Oracle позволяет выполнять операции (сканирование таблиц, соединения, сортировки, DML) в несколько параллельных серверных процессов, что значительно ускоряет обработку больших объёмов данных. В контексте Go-приложения, работающего с Oracle, это особенно полезно для тяжёлых аналитических запросов или массовых обновлений.

Синтаксис:

SQL
SELECT /*+ PARALLEL(t, 4) */ * FROM big_table t WHERE status = 'ACTIVE';

Здесь t - алиас таблицы, 4 - степень параллелизма (число потоков). Можно опустить степень: /*+ PARALLEL(t) */ - Oracle выберет значение по умолчанию (обычно 2 * CPU_COUNT).

Пример в Go с database/sql:

GO
rows, err := db.QueryContext(ctx, `
SELECT /*+ PARALLEL(o, 8) */ order_id, total
FROM orders o
WHERE order_date >= SYSDATE - 30
`)

Для DML (например, массовое обновление) используйте APPEND и PARALLEL:

GO
tx, _ := db.Begin()
tx.Exec(`ALTER SESSION ENABLE PARALLEL DML`)
tx.Exec(`UPDATE /*+ PARALLEL(t, 4) */ target_table t SET t.value = ...`)
tx.Commit()

Важные нюансы:

  • Параллелизм эффективен только при большом объёме данных (обычно > 100K строк) и на серверах с несколькими CPU.
  • В Go не забывайте закрывать rows и использовать context с таймаутом, чтобы избежать зависаний при параллельном выполнении.
  • Для OLTP-запросов (быстрых, с индексами) параллелизм может ухудшить производительность из-за накладных расходов на координацию.

Проверка плана выполнения:

SQL
EXPLAIN PLAN FOR SELECT /*+ PARALLEL(t, 4) */ * FROM big_table t;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

Убедитесь, что в плане есть PX COORDINATOR и PX SEND/RECEIVE.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью