Я думаю, вы правы, что затраты на выполнение NTILE перевешивают экономию параллелизма.
Вам нужно использовать что-то, что разделит наборы запросов на четко разделенные наборы.
Если ваши запросы возвращают менее 15% от общего количества данных (приблизительно), то разбейте таблицы наИндекс (или индексированное поле, или функциональный индекс), вероятно, является вашей лучшей отправной точкой.
Пример: Предполагая, что ваши данные имеют числовой псевдоключ в каждой строке, создайте функциональный индекс для MOD (Id, 4) - это даст вам основанную на индексе версию вашего подхода NTILE.(Я не думаю, что у вас может быть функциональный индекс для NTILE).
Этот специфический подход, вероятно, контрпродуктивен - вы будете получать данные из одних и тех же блоков в разных потоках, что потенциально увеличивает I /O (зависит от памяти).
Способ, которым параллельный запрос Oracle стремится это сделать - при условии, что вы хотите обработать более 15% данных в таблице - это просто разбить таблицу на N физических кусков (используя rowid) и затем запуститьN 'полное сканирование' на этих кусках.
Я не уверен, что вы сможете повторить этот подход с внешнего интерфейса.Разделение по идентификатору ключа увеличивает стоимость прохождения индекса для каждой строки.
Что вам, вероятно, нужно, это то, что разделяет таблицу чем-то другим, а не ключом, или, если вы разделяете по ключу, разделяйте егопо диапазонам, а не NTILE подход.