|
|
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Всем привет! Требуется разбить результат запроса на группы с одинаковым количеством строк и перенумеровать получившиеся группы. Количество строк в группе будет передаваться из вне, в виде параметра. Количество строк, возвращаемое запросом, заранее неизвестно. Логика разбиения простая - сортируем результат, с первой строки начинаем формировать первую группу, как насобирали N-строк - начинаем формировать следующую группу. Последняя группа может иметь строк меньше, чем переданное N, если результат запрос не делится на целое кол-во групп. Решил так: Код: plsql 1. 2. 3. 4. 5. Но подумал - может просмотрел какую-то аналитическую функцию, которая делает тоже самое? Что-то навроде NTILE, но которая на вход получает не количество групп, а количество строк в группе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 08:50 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Начинучка Код: plsql 1. Наивный юноша. Начинучкаможет просмотрел какую-то аналитическую функцию, которая делает тоже самое?Куда уж проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 09:06 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
[quot Elic]Начинучка Код: plsql 1. Данное условие, как и обращение к all_objects - это исключительно для демонстрационных целей требуемого.... Думаю - на 20-ти строках вполне себе показана суть желаемого? Понятное дело, что в реальности запрос будет не из all_tables и условия по ROWNUM в нем не будет. А если бы и было - запрос не ставит цель выбрать N-первых(последних) записей (если вы про то, что сортировка сработает только после отработки этого условия). Всё что требуется - разбить результат запроса на "пакеты" одинаковой ширины в пределах заданного количества.... Сортировка строк в группе, ровно и как групп между собой - в принципе, не важна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 09:17 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Начинучка, Речь о другом. Чем row_number() over(order by created) отличается от rownum в запросе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 09:20 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Anatoly BНачинучка, Речь о другом. Чем row_number() over(order by created) отличается от rownum в запросе?тем, что запрос будет работать в СУБД, отличной от Oracle. И если поддержка оконно-аналитических функций в ней есть, то вот ROWNUM - отсутствует как класс. Спросил же в оракловой ветке потому, что считаю, что тут наиболее компетентные и авторитетные специалисты в области оконных функций. И мнение это основывается на том, что в оракле эти функции есть с незапамятных времен (с версии 8i). И только ленивый их не использует. В то время как в других СУБД - это сравнительно "недавно" появившееся новшество и многие ещё не совсем в курсе дел..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 09:26 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Начинучка, Если укажите СУБД, можно ответить точнее В некоторых например поддерживается: SELECT TOP n ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 12:58 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
MaximaXXL, СУБД MS SQL 2012 и выше. TOP n не подходит. Решаемая задача - удаление большого числа записей небольшими порциями. TOP n плохо вписывается, так как удалять нужно по определенному условию, которое непокрыто индексами, что приводит к многократным неоптимальным выборкам со сканами этой большой таблицы. Было решено один раз выбирать список удаляемых ID (первичный ключ с кластерным индексом) во временную таблицу, бить полученную выборку на "пакеты" и удалять данные попакетно. При этом в целевой таблице данные выбираются по ID, что допускает использование кластерного индекса (seek) и увеличивает скорость обработки данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:12 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Начинучка, Не очень понял почему TOP не вписывается Код: plsql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:25 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
MaximaXXL, Потому что условия выборки не ложатся на существующую схему индексирования. Соответственно, если делать select top(n) from t where <тут условия вне индексов таблицы>, то возникает fullscan таблицы в которой порядка 500 млн. записей. А так как это все делается в цикле, то получается печалька. И самое грустное - это блокировочный характер скульсервера. Который решает не утруждать себя строчными блокировками и эскалирует блокировку до уровня таблицы, что ставит на колени всё остальное, работающее с этой же таблицей.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:31 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Начинучка, если у тебя есть задача (в СУБД MS SQL 2012 и выше) удаление большого числа записей небольшими порциями, то иди в тему MS SQL и спрашивай как там люди это делают. тупее чем задавать в теме оракла вопрос о конкретной реализации одного из выбранных решений для другой субд придумать сложно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:32 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Vint, вопрос был не о том, как это реализовать в другое СУБД. вопрос был о том - нет ли аналитической функции, которая бы заменила собой конструкцию - ceil(row_number() over(order by created)/ 6 ) почему вопрос был задан именно тут - я уже ответил Анатолию Б. Все остальные ответы были исключительно для удовлетворения любопытства MaximaXXL и к первоначальному вопросу отношения не имеют. По сути вопроса ответ получен - готовой функции нет, используемое решение для деления множества на пакеты - вполне себе оптимальное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:42 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Начинучка, руки исправь. и научись искать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:45 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Начинучка, ну ок, не нравиться TOP возьмите связку Код: plsql 1. 2. тоже может мило побить на пакеты ... и должно работать на MS SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:45 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Vint, голову включи и почитай чего делает предложенный тобой и упомянутый мною выше NTILE - он делит выборку на заданное число групп. А мне не нужно заданное число групп, мне нужно - заданное количество строк в группе. Чтобы прикрутить NTILE именно для своей задачи, мне нужно будет знать количество строк, возвращаемых выборкой, поделить его на число строк в группе, чтобы вычислить кол-во групп, формируемое NTILE. Точно думаешь, что это будет проще того, что есть сейчас? Уж если пытаешься отвечать, то хотя бы вникай в суть дискуссии. Иначе получается как в рекламе про жвачку - что иногда лучше жевать, чем говорить..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:52 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Начинучка, я думаю что твоя задача решается по другому и абсолютно не надо делить на равное количество строк. это уже лично твоя идеотичность решения. вместо распаралеливания удаления ты пытаешься удалить какое то конкретное количество строк. так что это ты тут "олень", который вместо поиска решения - бьется головой в стенку и кричит что ее надо пробить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:58 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Vint, Что ещё раз выдаёт в тебе нечитателя.... Задача была озвучена - с минимальными затратами по ресурсам сервера и с минимальными помехами другим сессиям, удалить некоторое количество данных с большой высоконагруженной таблицы. По сути, выполнять удаление в фоне. А теперь расскажи мне, как параллельные вычисления позволяют снизить потребляемые ресурсы и ожидания доступа к таблице и журнальному логу в среде блокировочника. При условии, что удаляемые данные равномерно размазаны по страницам и сервер отказывается вешать блокировки уровня строк-страниц, а сразу эскалируется до уровня блокировки таблицы. Буду рад услышать варианты решений от неоленя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 15:05 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 16:13 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Vint.. идео тичность решения... Какое из этих слов является основой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 07:52 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Начинучка, Тоже нечитатель, но чем не подошло банальное Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 10:49 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
env, авторНо подумал - может просмотрел какую-то аналитическую функцию, которая делает тоже самое ? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 11:48 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
env, Разбиение на "пакеты" идет по значению ID. ID - первичный ключ с кластерным индексом (для ораклистов - очень приближенный аналог IOT). Тут суть в том, что остаток от деления будет раскидывать близкие по значению записи в совершенно разные группы. В результате чего, при удалении записей одного "пакета" будет затронуто бОльшее число страниц. При первоначально выбранном алгоритме разбиения вероятность попадания близких по значению ID в один пакет - сильно выше. Тут только из этих соображений делался выбор. Возможно, то экономия на спичках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 12:03 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
НачинучкаПри первоначально выбранном алгоритме разбиения вероятность попадания близких по значению ID в один пакет - сильно выше. Всё равно не понял в чём сложность. Если надо последовательно разбить на группы в рамках сортировки, то можно воспользоваться прямолинейностью скуль сервера. Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 12:50 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
env, Даже cast не нужен, с точки зрения скуль сервера здесь деление int на int, а значит результат тоже int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 12:56 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
НачинучкаСпросил же в оракловой ветке потому, что считаю, что тут наиболее компетентные и авторитетные специалисты в области оконных функций Дык, наиболее компетентные и авторитетные специалисты первыми и ответили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 12:58 |
|
||
|
Разделение результата выборки на группы с заданным числом строк
|
|||
|---|---|---|---|
|
#18+
Stax, Стас, когда решал подобную задачу - точно также удалял пачками по row_number() / int. Там структура хранения отличается от оракловой, поэтому желательно попадать в страницы и задействовать кластерный индекс при массовом удалении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 13:01 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39556521&tid=1884886]: |
0ms |
get settings: |
11ms |
get forum list: |
22ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
192ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
93ms |
get tp. blocked users: |
2ms |
| others: | 249ms |
| total: | 595ms |

| 0 / 0 |
