Вопрос. Я хотел бы распределить диапазон значений по сбалансированным наборам. Я исходил из того, что для этого может быть полезной одна из аналитических функций, и решил изучить их более подробно. Я ставил перед собой вопрос: "Как "разбить" упорядоченный список значений на диапазоны, а затем перечислить первое и последнее значение каждого диапазона"? Например:
Range Start End ------ ------ ----- 0 1 1000 1 1001 2000 2 2001 3000
Ответ. Это нечто подобное тому, что я часто реализовываю, называя это "самодельным параллелизмом" (do-it-yourself parallelism). Идея заключается в том, чтобы разбить большую таблицу на некоторое число неперекрывающихся диапазонов, запустив несколько параллельных процессов.
Это просто сделать, используя встроенную функцию NTILE(). Если нужно разбить представление словаря данных ALL_OBJECTS на восемь неперекрывающихся диапазонов с приблизительно одинаковым числом строк в каждом, можно использовать следующий код: SQL> select min(object_id) min, 2 max(object_id) max, 3 count(*) cnt, 4 nt 5 from 6 ( 7 select object_id, 8 ntile(8) over 9 (order by object_id) nt 10 from all_objects 11 ) 12 group by nt;
MIN MAX CNT NT ----- ----- ----- ---- 2 6811 6005 1 6812 13117 6005 2 13118 19122 6005 3 19123 25127 6005 4 25128 31132 6005 5 31133 37142 6004 6 37143 44620 6004 7 44621 98225 6004 8
8 rows selected.
Много раз я повторял на сайте asktom.oracle.com: аналитика – это круто. Аналитика – лучшая вещь, появившаяся в языке SQL после введения ключевого слова SELECT.