|
|
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
Привет гуру(ам) оракла! Есть потребность все записи в таблице Table1, среди прочего содержащую поле SomeDateTime, разбить на блоки по 100 записей в порядке сортировки по дате, и для каждого блока вычислить некоторые средние показатели + Min/Max по дате и т.п.: пока сделал такую конструкцию: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. работает, но немного выбешивает в большей части из эстетических соображений. Есть предположение, что ОРАКЛ умеет как-то делать подобное, без "ручных" группировок, подзапросов и т.п... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:16 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
Опять коммит улетел вперед :) Собственно вопрос-то: умеет, нет? Есть ли варианты иначе решить поставленную задачу? В какие конструкции стоит посмотреть внимательнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:19 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
Mikle83разбить на блоки по 100 записей в порядке сортировки по датеИзмышлизмЪ. Из которого следует "выбешивание". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:26 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
Elic, отнюдь. Есть определенный процесс для которого надо сделать такое. Крайне "верхнеуровнево": сравнивать два источника данных и достаточно быстро позиционировать "блок некоторого минимального объема" внутри которого есть расхождение. Собственно формируется дерево Меркла, опирающееся на блок в Х (где Х сейчас 100) записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:36 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
Mikle83сравнивать два источника данныхdbms_comparison ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:41 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
фых. Вы действительно думаете, мне интересно изобретать велосипед? Будь у меня возможность хоть где-то два датасорса "подружить" между собой - проблема бы не встала от слова совсем. Базы изолированы друг от друга. Сверка будет обеспечиваться на третьей стороне, куда данные будут передаваться в некотором доп. формате. Задача с минимальными затратами на объемы пересылок и вообще обменов - сделать сверку. Давайте абстрагируемся от бэкграунда и вернемся к задаче в первом посте. Есть возможности это сделать как-то еще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:46 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
Mikle83сделать как-то еще?С row_number, если в одном из наборов отсутствует "первая запись", вся последующая сверка даст различие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 16:51 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
-2-, Да, есть такое. Так и задумано, параллельной синхронизации, к сожалению, здесь нельзя добиться (т.к. могут пересчитываться более поздние записи на основании корректировки / добавления более ранних). Сверка по дереву вниз - быстро выйдем (движение вниз-влево) на нужный "багнутый" узел с самого верхнего узла. Пофиксили. Сделали требуемые прерасчеты. Проверка заново всего скоупа = этот узел будет "зеленым". На старте сверки, пока деревья полностью синхронизируются - да, потребуется определенное количество иттераций. Но потом фиксы будут точечными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 17:01 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
Для минимизации обменов имеет смысл привязаться к SomeDateTime, к примеру group by trunc(SomeDateTime, 'HH24') или trunc(SomeDateTime, 'MI') или даже trunc(SomeDateTime, 'SS') - в зависимости от объема данных. Иначе разница в единственную запись (наличие/отсутствие) забаранит всю сверку целиком. Даже если очень хочется именно "по 100 записей" - то все одно надо вводить точки синхронизации по SomeDateTime. Рассмотрите https://docs.oracle.com/database/121/DWHSG/pattern.htm#DWHSG8956 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 17:05 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, тут проблема в неравномерности распределения записей по времени. Т.е. условно у вас в один блок "день" может попасть 100 записей, а в другой = 10 000. То же самое с любым промежутком: за минуту либо ноль записей, либо 10 000. Детализация по количеству позволяет "сбалансировать" дерево в весовом соотношении каждой ветви, что в свою очередь позволяет примерно предположить длительность одной иттерации сверки "побитого" блока, т.к. там будет определенное количество записей. А это, в свою очередь, позволит сбалансировать нагрузку в рамках всего процесса синхронизации. (условно имеем окно для синхронизации ХХ минут, зная за сколько отрабатывает один блок, можем понять сколько блоков можно сейчас отправить на синхронизацию). Опять же все верхнеуровнево и без детализации до конкретных проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 17:43 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
Mikle83andrey_anonymous, тут проблема в неравномерности распределения записей по времени. Т.е. условно у вас в один блок "день" может попасть 100 записей, а в другой = 10 000. Это понятно. Проблема в том, что исходный алгоритм неустойчив к проблеме наличия "лишней" записи на одной из баз - это снесет ВСЕ хеши по цепочке, и задача эффективной сверки решена не будет ("красным" покрасятся все блоки от лишней записи до конца выборки). Потому - изначально надо выделять точки синхронизации, от которых отсчитывать интервалы по 100 записей. Один из механизмов, позволяющих решить задачу в такой постановке "естественным" путем, по ссылке. Другой механизм, позволяющий решить задачу без монструозного SQL - pipelined функция. Третий способ (при наличии смекалки) - доменный индекс (возможно, окажется удобно дописать к нему оператор). Четвертый... Впрочем, и указанных инструментов достаточно, КМК. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 18:33 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, спасибо за советы. покручу еще немного задачу. Может, действительно, стоит на нее с другого ракурса взглянуть. Что-то в этом есть - делать не равномерные периоды по оси, а к примеру по датам с инкрементом в Х минут подбирать период, пока объем записей в нем меньше условно 100. Осталось понять можно ли эту логику переложить на SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2018, 22:50 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
Mikle83можно ли эту логику переложить на SQL. http://www.sql.ru/forum/1157770/sum-over-stop-and-continue ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2018, 08:02 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
Хотя не выйдет, источники независимы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2018, 08:03 |
|
||
|
Разбить таблицу на диапазоны.
|
|||
|---|---|---|---|
|
#18+
-2-, таки с утра посмотрел еще раз на задачу. Все ок, никаких "покраснений" всех батчей из-за одного. Формирую так же - на источнике блоки по 100 штук. Код: plsql 1. 2. 3. а на "сверяемом", делать сверку не по блокам в 100 штук, а по периодам MinDate - MaxDate, принимаемым с источника. Все: * никаких расхождений, если в периоде по времени данные совпадают. * можно еще раз подумать над распараллеливанием * "краснеть" будет только "битый" блок ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2018, 10:29 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39584655&tid=1884588]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
66ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 219ms |
| total: | 394ms |

| 0 / 0 |
