Страница 1 из 2
Как построить индекс
Добавлено: 04.02.2014 11:32
Ораклист
Есть ORACLE таблица которая выглядит примерно так:
Код: Выделить всё
ID WORKER
1 a
2 a
3 a
4 a
5 a
6 b
7 b
8 b
9 c
10 c
11 c
12 c
13 c
14 c
15 c
16 c
17 d
18 d
19 d
20 d
Т.е. WORKER одно из 10 возможных.
Нужно так построить индекс/ЗАПРОС, чтобы одинаковые VALUE не шли подряд.
Т.е. примерно так:
Код: Выделить всё
ID VALUE
1 a
6 b
9 c
17 d
2 a
7 b
10 c
18 d
3 a
8 b
11 c
19 d
4 a
12 c
5 a
13 c
20 d
14 c
15 c
16 c
Зачем? Для того, чтобы распараллелить нагрузку. Когда результаты запроса фетчатся в том порядке как в исходной таблице, сначала будет загружен WORKER "a", а все остальные будут простаивать. Потом Worker "b" итд. А нужно распараллелить нагрузку.
Пока на ум приходит только закодировать рабочего числом, поделить на ID и сортировать по остатку от деления. Как-то так.
Re: Как построить индекс
Добавлено: 04.02.2014 12:25
все тот же
давай сначала про запрос. если у тебя там 20 записей и 2 поля, индекс вообще не нужен
вот например делать выборку тупо случайно - select * from .... order by dbms_random.value
Re: Как построить индекс
Добавлено: 04.02.2014 12:30
Гость
order by dbms_random.value - свежая идея. Сам бы не дошел.
Записей там миллиарды.
Индекс нужен для того, чтобы перестроился экзекьюшн план с помощью аутлайнеров. Сам запрос я не могу менять, софт задевелоплен, изменению не подлежит.
Re: Как построить индекс
Добавлено: 04.02.2014 12:31
Гость
order by dbms_random.value - свежая идея. Сам бы не дошел.
Записей там миллиарды.
Индекс нужен для того, чтобы перестроился экзекьюшн план с помощью аутлайнеров. Сам запрос я не могу менять, софт задевелоплен, изменению не подлежит.
Re: Как построить индекс
Добавлено: 04.02.2014 12:38
все тот же
вот альтератива через аналитическую функцию, выберает четко по порядку абсдабсдабсд
select row_number() over(partition by worker order by worker ) as worker_num, t.* from table t order by worker_num
но использовать order by на милиардах в принципе херня
Re: Как построить индекс
Добавлено: 04.02.2014 15:32
Аффтор топика
Мать..Гениально... Напрочь забыл про аналитические функции...
А индекс по ним можно построить или нет.. Но это я сам проверю. Спасибо.
Re: Как построить индекс
Добавлено: 04.02.2014 15:48
Гость
Оракл показал залупу...
CREATE INDEX SYSADM.I_GRH ON SYSADM.GMD_REQUEST_HISTORY
( ROW_NUMBER() over(partition by SWITCH_ID ORDER BY SWITCH_ID))
LOGGING
NOPARALLEL
Error at line 2
ORA-30483: window functions are not allowed here
Re: Как построить индекс
Добавлено: 05.02.2014 10:42
все тот же
Индекс нельзя, ну ты уже сам знаешь ...
Тебе нужно сортировать все миллиарды записей за раз? Если тебе реально нужно в среднем например 10000 штук, то имеет смысл с помощью тех же аналитических функций сделать случайную выборку нужного размера, а потом уже из нее брать данные предыдущем селектом. Но это уже продвинутая оптимизация, не факт что стоит заморачиваться, зависит от задачи ...
Re: Как построить индекс
Добавлено: 05.02.2014 12:55
MaxU
Гость писал(а):
...
Т.е. WORKER одно из 10 возможных.
...
Записей там миллиарды.
...
что-то мне подсказывает, что обычный B-Tree индекс, не сильно вам поможет, а строить bitmap индекс, не зная как часто обновляется данная таблица, я бы советовать не осмелился...
и таки да, как планируете обрабытывать "миллиарды" записей - порциями/окнами или сразу?
Re: Как построить индекс
Добавлено: 05.02.2014 13:09
MaxU
Ораклист писал(а):
Пока на ум приходит только закодировать рабочего числом, поделить на ID и сортировать по остатку от деления. Как-то так.
по-моему идея правильная
я бы, пожалуй, просто выбирал записи отсортированные по ID и получал бы остаток от деления ID на число обработчиков. Только надо еще обратить внимание на "нормальность" распределения дырок в последовательности ID...
PS трудно что-то советовать не понимая, чего вы хотите достичь...