powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разделение результата выборки на группы с заданным числом строк
26 сообщений из 26, показаны все 2 страниц
Разделение результата выборки на группы с заданным числом строк
    #39555936
Начинучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

Требуется разбить результат запроса на группы с одинаковым количеством строк и перенумеровать получившиеся группы. Количество строк в группе будет передаваться из вне, в виде параметра. Количество строк, возвращаемое запросом, заранее неизвестно.
Логика разбиения простая - сортируем результат, с первой строки начинаем формировать первую группу, как насобирали N-строк - начинаем формировать следующую группу. Последняя группа может иметь строк меньше, чем переданное N, если результат запрос не делится на целое кол-во групп.

Решил так:
Код: plsql
1.
2.
3.
4.
5.
select owner
     , object_name
     , ceil(row_number() over(order by created)/ 6 /*будет передаваться в виде параметра*/) goup_num
from   all_objects
where  rownum <= 20


Но подумал - может просмотрел какую-то аналитическую функцию, которая делает тоже самое?
Что-то навроде NTILE, но которая на вход получает не количество групп, а количество строк в группе?
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39555944
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинучка
Код: plsql
1.
where  rownum <= 20

Наивный юноша.
Начинучкаможет просмотрел какую-то аналитическую функцию, которая делает тоже самое?Куда уж проще?
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39555949
Начинучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Elic]Начинучка
Код: plsql
1.
where  rownum <= 20

Данное условие, как и обращение к all_objects - это исключительно для демонстрационных целей требуемого.... Думаю - на 20-ти строках вполне себе показана суть желаемого? Понятное дело, что в реальности запрос будет не из all_tables и условия по ROWNUM в нем не будет. А если бы и было - запрос не ставит цель выбрать N-первых(последних) записей (если вы про то, что сортировка сработает только после отработки этого условия). Всё что требуется - разбить результат запроса на "пакеты" одинаковой ширины в пределах заданного количества.... Сортировка строк в группе, ровно и как групп между собой - в принципе, не важна.
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39555951
Anatoly B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Начинучка,

Речь о другом.
Чем row_number() over(order by created) отличается от rownum в запросе?
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39555953
Начинучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly BНачинучка,

Речь о другом.
Чем row_number() over(order by created) отличается от rownum в запросе?тем, что запрос будет работать в СУБД, отличной от Oracle. И если поддержка оконно-аналитических функций в ней есть, то вот ROWNUM - отсутствует как класс. Спросил же в оракловой ветке потому, что считаю, что тут наиболее компетентные и авторитетные специалисты в области оконных функций. И мнение это основывается на том, что в оракле эти функции есть с незапамятных времен (с версии 8i). И только ленивый их не использует. В то время как в других СУБД - это сравнительно "недавно" появившееся новшество и многие ещё не совсем в курсе дел.....
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556105
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинучка,

Если укажите СУБД, можно ответить точнее

В некоторых например поддерживается: SELECT TOP n
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556119
Начинучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

СУБД MS SQL 2012 и выше. TOP n не подходит. Решаемая задача - удаление большого числа записей небольшими порциями. TOP n плохо вписывается, так как удалять нужно по определенному условию, которое непокрыто индексами, что приводит к многократным неоптимальным выборкам со сканами этой большой таблицы.
Было решено один раз выбирать список удаляемых ID (первичный ключ с кластерным индексом) во временную таблицу, бить полученную выборку на "пакеты" и удалять данные попакетно. При этом в целевой таблице данные выбираются по ID, что допускает использование кластерного индекса (seek) и увеличивает скорость обработки данных.
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556133
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинучка,

Не очень понял почему TOP не вписывается


Код: plsql
1.
2.
3.
4.
5.
6.
DELETE FROM S.T
WHERE ID IN  
   (SELECT TOP 10 ID   
    FROM S.TEMP_T
    ORDER BY ID ASC);  
GO  
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556139
Начинучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Потому что условия выборки не ложатся на существующую схему индексирования.
Соответственно, если делать select top(n) from t where <тут условия вне индексов таблицы>, то возникает fullscan таблицы в которой порядка 500 млн. записей. А так как это все делается в цикле, то получается печалька. И самое грустное - это блокировочный характер скульсервера. Который решает не утруждать себя строчными блокировками и эскалирует блокировку до уровня таблицы, что ставит на колени всё остальное, работающее с этой же таблицей....
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556141
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинучка,
если у тебя есть задача (в СУБД MS SQL 2012 и выше) удаление большого числа записей небольшими порциями, то иди в тему MS SQL и спрашивай как там люди это делают.
тупее чем задавать в теме оракла вопрос о конкретной реализации одного из выбранных решений для другой субд придумать сложно.
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556149
Начинучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vint,

вопрос был не о том, как это реализовать в другое СУБД. вопрос был о том - нет ли аналитической функции, которая бы заменила собой конструкцию - ceil(row_number() over(order by created)/ 6 )
почему вопрос был задан именно тут - я уже ответил Анатолию Б. Все остальные ответы были исключительно для удовлетворения любопытства MaximaXXL и к первоначальному вопросу отношения не имеют.

По сути вопроса ответ получен - готовой функции нет, используемое решение для деления множества на пакеты - вполне себе оптимальное.
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556151
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556153
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинучка,

ну ок, не нравиться TOP возьмите связку
Код: plsql
1.
2.
Offset n Row
Fetch First k Rows Only



тоже может мило побить на пакеты ... и должно работать на MS SQL
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556158
Начинучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vint,

голову включи и почитай чего делает предложенный тобой и упомянутый мною выше NTILE - он делит выборку на заданное число групп. А мне не нужно заданное число групп, мне нужно - заданное количество строк в группе. Чтобы прикрутить NTILE именно для своей задачи, мне нужно будет знать количество строк, возвращаемых выборкой, поделить его на число строк в группе, чтобы вычислить кол-во групп, формируемое NTILE. Точно думаешь, что это будет проще того, что есть сейчас?
Уж если пытаешься отвечать, то хотя бы вникай в суть дискуссии. Иначе получается как в рекламе про жвачку - что иногда лучше жевать, чем говорить.....
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556163
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинучка,
я думаю что твоя задача решается по другому и абсолютно не надо делить на равное количество строк. это уже лично твоя идеотичность решения.
вместо распаралеливания удаления ты пытаешься удалить какое то конкретное количество строк.
так что это ты тут "олень", который вместо поиска решения - бьется головой в стенку и кричит что ее надо пробить.
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556220
Начинучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vint,

Что ещё раз выдаёт в тебе нечитателя....
Задача была озвучена - с минимальными затратами по ресурсам сервера и с минимальными помехами другим сессиям, удалить некоторое количество данных с большой высоконагруженной таблицы. По сути, выполнять удаление в фоне.
А теперь расскажи мне, как параллельные вычисления позволяют снизить потребляемые ресурсы и ожидания доступа к таблице и журнальному логу в среде блокировочника. При условии, что удаляемые данные равномерно размазаны по страницам и сервер отказывается вешать блокировки уровня строк-страниц, а сразу эскалируется до уровня блокировки таблицы. Буду рад услышать варианты решений от неоленя.
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556289
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинучка,

20969049 Это тоже не подходит?
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556521
Vint.. идео тичность решения...
Какое из этих слов является основой?
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556615
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинучка,

Тоже нечитатель, но чем не подошло банальное
Код: sql
1.
2.
3.
declare @n int = 10;
select row_number() over (order by t.table_name ) % @n s 
from INFORMATION_SCHEMA.TABLES t
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556672
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

авторНо подумал - может просмотрел какую-то аналитическую функцию, которая делает тоже самое ?


.....
stax
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556690
Начинучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
env,

Разбиение на "пакеты" идет по значению ID. ID - первичный ключ с кластерным индексом (для ораклистов - очень приближенный аналог IOT).
Тут суть в том, что остаток от деления будет раскидывать близкие по значению записи в совершенно разные группы. В результате чего, при удалении записей одного "пакета" будет затронуто бОльшее число страниц. При первоначально выбранном алгоритме разбиения вероятность попадания близких по значению ID в один пакет - сильно выше.

Тут только из этих соображений делался выбор. Возможно, то экономия на спичках.
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556748
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НачинучкаПри первоначально выбранном алгоритме разбиения вероятность попадания близких по значению ID в один пакет - сильно выше.

Всё равно не понял в чём сложность. Если надо последовательно разбить на группы в рамках сортировки, то можно воспользоваться прямолинейностью скуль сервера.
Код: sql
1.
2.
3.
declare @n int = 10;
select cast(row_number() over (order by t.table_name ) / @n as int) s 
from INFORMATION_SCHEMA.TABLES t
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556757
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

Даже cast не нужен, с точки зрения скуль сервера здесь деление int на int, а значит результат тоже int.
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556760
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НачинучкаСпросил же в оракловой ветке потому, что считаю, что тут наиболее компетентные и авторитетные специалисты в области оконных функций
Дык, наиболее компетентные и авторитетные специалисты первыми и ответили.
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556766
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Стас, когда решал подобную задачу - точно также удалял пачками по row_number() / int. Там структура хранения отличается от оракловой, поэтому желательно попадать в страницы и задействовать кластерный индекс при массовом удалении.
...
Рейтинг: 0 / 0
Разделение результата выборки на группы с заданным числом строк
    #39556783
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

да я не против,
показалось что Начинучка сразу предложил етот алгоритм

ps
я так понимаю ораклячий аналог разбивать по блокам, хотя ...

.....
stax
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разделение результата выборки на группы с заданным числом строк
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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