Как построить индекс

Moderator: Little Muk

Ораклист

Как построить индекс

Post by Ораклист »

Есть ORACLE таблица которая выглядит примерно так:

Code: Select all

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 не шли подряд.

Т.е. примерно так:

Code: Select all

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: Как построить индекс

Post by все тот же »

давай сначала про запрос. если у тебя там 20 записей и 2 поля, индекс вообще не нужен

вот например делать выборку тупо случайно - select * from .... order by dbms_random.value
Guest

Re: Как построить индекс

Post by Guest »

order by dbms_random.value - свежая идея. Сам бы не дошел.
Записей там миллиарды.

Индекс нужен для того, чтобы перестроился экзекьюшн план с помощью аутлайнеров. Сам запрос я не могу менять, софт задевелоплен, изменению не подлежит.
Guest

Re: Как построить индекс

Post by Guest »

order by dbms_random.value - свежая идея. Сам бы не дошел.
Записей там миллиарды.

Индекс нужен для того, чтобы перестроился экзекьюшн план с помощью аутлайнеров. Сам запрос я не могу менять, софт задевелоплен, изменению не подлежит.
все тот же

Re: Как построить индекс

Post by все тот же »

вот альтератива через аналитическую функцию, выберает четко по порядку абсдабсдабсд

select row_number() over(partition by worker order by worker ) as worker_num, t.* from table t order by worker_num

но использовать order by на милиардах в принципе херня
Аффтор топика

Re: Как построить индекс

Post by Аффтор топика »

Мать..Гениально... Напрочь забыл про аналитические функции...
А индекс по ним можно построить или нет.. Но это я сам проверю. Спасибо.
Guest

Re: Как построить индекс

Post by Guest »

Оракл показал залупу...
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: Как построить индекс

Post by все тот же »

Индекс нельзя, ну ты уже сам знаешь ...
Тебе нужно сортировать все миллиарды записей за раз? Если тебе реально нужно в среднем например 10000 штук, то имеет смысл с помощью тех же аналитических функций сделать случайную выборку нужного размера, а потом уже из нее брать данные предыдущем селектом. Но это уже продвинутая оптимизация, не факт что стоит заморачиваться, зависит от задачи ...
MaxU
Posts: 556
Joined: 02 Oct 2011, 11:51
Location: munich

Re: Как построить индекс

Post by MaxU »

Гость wrote: ...
Т.е. WORKER одно из 10 возможных.
...
Записей там миллиарды.
...
что-то мне подсказывает, что обычный B-Tree индекс, не сильно вам поможет, а строить bitmap индекс, не зная как часто обновляется данная таблица, я бы советовать не осмелился...

и таки да, как планируете обрабытывать "миллиарды" записей - порциями/окнами или сразу?
MaxU
Posts: 556
Joined: 02 Oct 2011, 11:51
Location: munich

Re: Как построить индекс

Post by MaxU »

Ораклист wrote: Пока на ум приходит только закодировать рабочего числом, поделить на ID и сортировать по остатку от деления. Как-то так.
по-моему идея правильная
я бы, пожалуй, просто выбирал записи отсортированные по ID и получал бы остаток от деления ID на число обработчиков. Только надо еще обратить внимание на "нормальность" распределения дырок в последовательности ID...

PS трудно что-то советовать не понимая, чего вы хотите достичь...
Post Reply