powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разбить таблицу на диапазоны.
15 сообщений из 15, страница 1 из 1
Разбить таблицу на диапазоны.
    #39584557
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет гуру(ам) оракла!

Есть потребность все записи в таблице Table1, среди прочего содержащую поле SomeDateTime,
разбить на блоки по 100 записей в порядке сортировки по дате, и для каждого блока вычислить некоторые средние показатели + Min/Max по дате и т.п.:

пока сделал такую конструкцию:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
Select 
  Round(RN_Id/100), Min(Rn_Id), Max(Rn_Id), Min(SomeDateTime), Max(SomeDateTime), count(*)
from 
(
  select
    row_number() over (order by SomeDateTime) as RN_Id, t.*
  from Table 1 t
) SRC
group by Round(RN_id / 100)



работает, но немного выбешивает в большей части из эстетических соображений.
Есть предположение, что ОРАКЛ умеет как-то делать подобное, без "ручных" группировок, подзапросов и т.п...
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584564
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять коммит улетел вперед :)
Собственно вопрос-то: умеет, нет? Есть ли варианты иначе решить поставленную задачу?
В какие конструкции стоит посмотреть внимательнее?
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584571
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83разбить на блоки по 100 записей в порядке сортировки по датеИзмышлизмЪ. Из которого следует "выбешивание".
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584581
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic, отнюдь. Есть определенный процесс для которого надо сделать такое.
Крайне "верхнеуровнево": сравнивать два источника данных и достаточно быстро позиционировать "блок некоторого минимального объема" внутри которого есть расхождение.

Собственно формируется дерево Меркла, опирающееся на блок в Х (где Х сейчас 100) записей.
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584588
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83сравнивать два источника данныхdbms_comparison
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584589
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фых. Вы действительно думаете, мне интересно изобретать велосипед?
Будь у меня возможность хоть где-то два датасорса "подружить" между собой - проблема бы не встала от слова совсем.


Базы изолированы друг от друга. Сверка будет обеспечиваться на третьей стороне, куда данные будут передаваться в некотором доп. формате. Задача с минимальными затратами на объемы пересылок и вообще обменов - сделать сверку.

Давайте абстрагируемся от бэкграунда и вернемся к задаче в первом посте.
Есть возможности это сделать как-то еще?
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584592
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83сделать как-то еще?С row_number, если в одном из наборов отсутствует "первая запись", вся последующая сверка даст различие.
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584601
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

Да, есть такое. Так и задумано, параллельной синхронизации, к сожалению, здесь нельзя добиться (т.к. могут пересчитываться более поздние записи на основании корректировки / добавления более ранних).

Сверка по дереву вниз - быстро выйдем (движение вниз-влево)
на нужный "багнутый" узел с самого верхнего узла.

Пофиксили. Сделали требуемые прерасчеты.
Проверка заново всего скоупа = этот узел будет "зеленым".

На старте сверки, пока деревья полностью синхронизируются - да, потребуется определенное количество иттераций. Но потом фиксы будут точечными.
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584606
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для минимизации обменов имеет смысл привязаться к SomeDateTime, к примеру
group by trunc(SomeDateTime, 'HH24') или trunc(SomeDateTime, 'MI') или даже trunc(SomeDateTime, 'SS') - в зависимости от объема данных.
Иначе разница в единственную запись (наличие/отсутствие) забаранит всю сверку целиком.
Даже если очень хочется именно "по 100 записей" - то все одно надо вводить точки синхронизации по SomeDateTime.
Рассмотрите https://docs.oracle.com/database/121/DWHSG/pattern.htm#DWHSG8956
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584630
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

тут проблема в неравномерности распределения записей по времени.
Т.е. условно у вас в один блок "день" может попасть 100 записей, а в другой = 10 000.
То же самое с любым промежутком: за минуту либо ноль записей, либо 10 000.


Детализация по количеству позволяет "сбалансировать" дерево в весовом соотношении каждой ветви, что в свою очередь позволяет примерно предположить длительность одной иттерации сверки "побитого" блока, т.к. там будет определенное количество записей.

А это, в свою очередь, позволит сбалансировать нагрузку в рамках всего процесса синхронизации.
(условно имеем окно для синхронизации ХХ минут, зная за сколько отрабатывает один блок, можем понять сколько блоков можно сейчас отправить на синхронизацию). Опять же все верхнеуровнево и без детализации до конкретных проблем.
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584655
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83andrey_anonymous,

тут проблема в неравномерности распределения записей по времени.
Т.е. условно у вас в один блок "день" может попасть 100 записей, а в другой = 10 000.
Это понятно.
Проблема в том, что исходный алгоритм неустойчив к проблеме наличия "лишней" записи на одной из баз - это снесет ВСЕ хеши по цепочке, и задача эффективной сверки решена не будет ("красным" покрасятся все блоки от лишней записи до конца выборки).
Потому - изначально надо выделять точки синхронизации, от которых отсчитывать интервалы по 100 записей.
Один из механизмов, позволяющих решить задачу в такой постановке "естественным" путем, по ссылке.
Другой механизм, позволяющий решить задачу без монструозного SQL - pipelined функция.
Третий способ (при наличии смекалки) - доменный индекс (возможно, окажется удобно дописать к нему оператор).
Четвертый... Впрочем, и указанных инструментов достаточно, КМК.
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584728
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,
спасибо за советы. покручу еще немного задачу. Может, действительно, стоит на нее с другого ракурса взглянуть.

Что-то в этом есть - делать не равномерные периоды по оси,
а к примеру по датам с инкрементом в Х минут подбирать период, пока объем записей в нем меньше условно 100.

Осталось понять можно ли эту логику переложить на SQL.
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584781
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mikle83можно ли эту логику переложить на SQL. http://www.sql.ru/forum/1157770/sum-over-stop-and-continue
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584782
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя не выйдет, источники независимы.
...
Рейтинг: 0 / 0
Разбить таблицу на диапазоны.
    #39584879
Mikle83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

таки с утра посмотрел еще раз на задачу. Все ок, никаких "покраснений" всех батчей из-за одного.
Формирую так же - на источнике блоки по 100 штук.

Код: plsql
1.
2.
3.
Select 
  Round(RN_Id/100), Min(Rn_Id), Max(Rn_Id), Min(SomeDateTime), Max(SomeDateTime), count(*)
from 




а на "сверяемом", делать сверку не по блокам в 100 штук, а по периодам MinDate - MaxDate, принимаемым с источника.
Все:
* никаких расхождений, если в периоде по времени данные совпадают.
* можно еще раз подумать над распараллеливанием
* "краснеть" будет только "битый" блок
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разбить таблицу на диапазоны.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]