|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
Коллеги, приветствую! Утупился в такую задачку, не могу нормально решить полдня, хоть убейся! Есть довольно длинная, в пределе - миллиард записей (чуток меньше, но не сильно) таблица. С PK и кластерным индексом по нему, если это важно. Нужно получить выборку такого вида: Номер порции, JSON 100000 (ста тысяч) записей. Т.е. порезать таблицу на кусочки сто тысяч записей, сделать из каждой порции JSON, и, соответственно вернуть выборку № порции - json. Принцип отбора записей в порцию - никакого значения не имеет. Ну, разумеется 1 запись должна входить только в одну порцию, и каждая запись должна входить хоть в какую-нибудь порцию. Как это сделать максимально быстро, с минимумом самосоединений? Или лучше вообще без них... ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 17:03 |
|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
uaggster, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 18:14 |
|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
uaggster, таблицу можно разметить ранжирующей функцией NTILE. Чтобы не активировать сортировку, можно использовать трюк с ORDER BY (1/0). Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 18:45 |
|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
Курсор с аккумулированием порции во временную таблицу (табличную переменную) с последующим заджсониванием. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 18:48 |
|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
invm, нууу 10к итераций... Зато по разметке можно параллельный джейсонизатор замутить, на сколько ядер хватит. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 18:53 |
|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
Владислав Колосов нууу 10к итераций... Владислав Колосов Зато по разметке можно параллельный джейсонизатор замутить, на сколько ядер хватит. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 19:33 |
|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
a_voronin, Да, примерно так и делал: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
Но работает жутко медленно, честно говоря. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 20:39 |
|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
invm Владислав Колосов нууу 10к итераций... Владислав Колосов Зато по разметке можно параллельный джейсонизатор замутить, на сколько ядер хватит. Блин. 800 миллионов строк перебирать в цикле офонареешь. Теоретически, можно было бы сделать: Код: sql 1. 2. 3. 4. 5. 6.
Курсором. Благо это хранилище и данные неизменны. Может, действительно быстрее получится. Проблема в том, что ID - GUID. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 20:50 |
|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
uaggster Блин. 800 миллионов строк перебирать в цикле офонареешь. Курсором делается в один проход по таблице. Курсор должен быть fast_forward. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 21:13 |
|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
invm uaggster Блин. 800 миллионов строк перебирать в цикле офонареешь. Курсором делается в один проход по таблице. Курсор должен быть fast_forward. Да, так получилось гораздо быстрее. В тестовой базе на 10 млн. - 30 секунд против 5 с лишним минут примером выше. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
Спасибо, invm , как всегда - выручаете. (вместо spt_values будет честный генератор миллиона последовательных значений, так что ошибки нет. Это просто для теста). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2020, 21:23 |
|
Порезать большую табличку на json'ы
|
|||
---|---|---|---|
#18+
invm Владислав Колосов нууу 10к итераций... Владислав Колосов Зато по разметке можно параллельный джейсонизатор замутить, на сколько ядер хватит. По ключам, как же еще? Вы решите задачу перебором строк из рекордсета, а у меня - одновременные просмотры диапазонов ключа. Let's challenge! Для разовой задачи мое решение избыточно сложное. PS Это если для сортировки использовать ключ. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.05.2020, 12:01 |
|
|
start [/forum/topic.php?fid=46&msg=39954819&tid=1686156]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 135ms |
0 / 0 |