Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Имеет ли смысл разбивать большой select запрос на много маленьких? / 19 сообщений из 19, страница 1 из 1
27.06.2020, 16:23
    #39973763
imissyouso
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
Привет!
На самом деле, это один из вопросов на интервью в компанию, которая занимается хайлоадом.
Например, есть таблица размером 1TB с первичным b-tree ключем по id. Нам нужно сделать селект по рейджу id >= 5000 and id < 10000000. Мы не должны заблокировать всю базу. База под высокой нагрузкой.
Имеет ли смысл разбивать такой select запрос на много маленьких?
Код: sql
1.
2.
3.
select * from a where id > =5000 and id < 10000;
select * from a where id >= 10000 and id < 15000;
...


Если да, то почему? Чем это объясняется? Какие могут быть еще техники решения этой задачи?
Спасибо.
...
Рейтинг: 0 / 0
28.06.2020, 17:56
    #39973950
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
imissyouso
Привет!
На самом деле, это один из вопросов на интервью в компанию, которая занимается хайлоадом.
Например, есть таблица размером 1TB с первичным b-tree ключем по id. Нам нужно сделать селект по рейджу id >= 5000 and id < 10000000. Мы не должны заблокировать всю базу. База под высокой нагрузкой.
Имеет ли смысл разбивать такой select запрос на много маленьких?
Код: sql
1.
2.
3.
select * from a where id > =5000 and id < 10000;
select * from a where id >= 10000 and id < 15000;
...


Если да, то почему? Чем это объясняется? Какие могут быть еще техники решения этой задачи?
Спасибо.


"селект по рейджу"

Что такое "рейджу"?
...
Рейтинг: 0 / 0
28.06.2020, 18:40
    #39973960
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
Заблокировать селектом?
...
Рейтинг: 0 / 0
28.06.2020, 18:43
    #39973961
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
mefman
Заблокировать селектом?

Селект что-то блокирует ?
(в том виде, как приведено в первом сообщении)
...
Рейтинг: 0 / 0
28.06.2020, 18:55
    #39973962
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
Если под "заблокировать" понимается "поставить колом" дисковую подсистему на сервере, то это наверное лечится банальным уменьшение скорости "забирания" данных или нормальным железом/OS/прямыми_руками_админов. Уменьшить скорость "забирания" можно:
банальным sleep после fetch'а на клиенте
ограничить скорости сети (наверное могут сделать админы) до конкретного клиента
ограничить скорости процессор/диск конкретного процесса postgres на сервере (х.з. как определить, какой процесс ограничивать)
и 100500 резных других способов которые можно придумать в меру своих фантазий

В Oracle для таких целей есть Oracle Database Resource Manager , есть ли аналогичные средства в PostgreSQL - не знаю.

Бить один SELECT на несколько - лично я смысла не вижу.

IMHO
...
Рейтинг: 0 / 0
28.06.2020, 21:10
    #39973975
Имеет ли смысл разбивать большой select запрос на много маленьких?
imissyouso
Код: sql
1.
select *


меня это смущает... а куда селект то? это в HTML будут выводить? тогда не надо!
кому и зачем понадобилось 10 лямов строк со всеми колонками?!
на загруженной базе...
это как не разбивай, всё равно будет нагрузка.
...
Рейтинг: 0 / 0
29.06.2020, 04:27
    #39974017
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
imissyouso
Привет!
На самом деле, это один из вопросов на интервью в компанию, которая занимается хайлоадом.
Например, есть таблица размером 1TB с первичным b-tree ключем по id. Нам нужно сделать селект по рейджу id >= 5000 and id < 10000000. Мы не должны заблокировать всю базу. База под высокой нагрузкой.
Имеет ли смысл разбивать такой select запрос на много маленьких?
Код: sql
1.
2.
3.
select * from a where id > =5000 and id < 10000;
select * from a where id >= 10000 and id < 15000;
...


Если да, то почему? Чем это объясняется? Какие могут быть еще техники решения этой задачи?
Спасибо.

1 это очень много данных, извлекаться они будут долго, в это время нагрузка на сервер как правило будет максимальна,
плюс к этому, сервером будут выполнятся другие запросы, поэтому надо разбивать один запрос на тысячи, быть может миллионы запросов, между запросами будут паузы, тем самым сервер будет разгружен и выполнять запросы от других процессов,
2 множество запросов наверняка позволит избежать создания временных таблиц (в этом случае временная таблица вряд ли будет создаваться, но так часто бывает с сложными запросами)
3 обычно такая выгрузка влечет последующие обработки и быстрая выдача данных из маленьких запросов позволит сразу же начать эти вычисления
4 postgresql такой огромный запрос не заблокирует таблицу, но другие СУБД например Mysql, может вызвать блокировку на несколько дней (было у меня такое)
PS и как показывает практика, извлечение много данных маленькими запросами, но в несколько потоков, происходит на много быстрее чем один огромный селект
...
Рейтинг: 0 / 0
29.06.2020, 09:59
    #39974075
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
bochkov,
Про mvcc не надо забывать
...
Рейтинг: 0 / 0
29.06.2020, 11:13
    #39974098
imissyouso
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
Ролг Хупин"селект по рейджу"

Что такое "рейджу"?

рейнджу* = range

bochkovpostgresql такой огромный запрос не заблокирует таблицу, но другие СУБД например Mysql, может вызвать блокировку на несколько дней (было у меня такое)
и как решали эту проблему в mysql? в мускуле это случается потому что там нет mvcc? Он вынужден блокировать каждую строку по отдельности?

bochkov1 это очень много данных, извлекаться они будут долго, в это время нагрузка на сервер как правило будет максимальна,
плюс к этому, сервером будут выполнятся другие запросы, поэтому надо разбивать один запрос на тысячи, быть может миллионы запросов, между запросами будут паузы, тем самым сервер будет разгружен и выполнять запросы от других процессов,

но ведь можно выставить каждому клиенту свой приоритет, чтобы не отжирал все ресурсы и не забирал их у других клиентов, плюс у каждого запроса свой определенный буфферный кэш, который по размеру не равен вообще всему кэшу системы. Вопрос в том как это сделать, может есть здесь знатоки.

Алексей Розаменя это смущает... а куда селект то? это в HTML будут выводить? тогда не надо!
кому и зачем понадобилось 10 лямов строк со всеми колонками?!
на загруженной базе...
это как не разбивай, всё равно будет нагрузка.
да никуда, просто очень абстрактная задача, представим что раз в год кому-то понадобилось выгрузить много данных

Leonid KudryavtsevБить один SELECT на несколько - лично я смысла не вижу.

ну как минимум в postgres'e
...
Рейтинг: 0 / 0
29.06.2020, 11:17
    #39974100
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
imissyouso

Leonid KudryavtsevБить один SELECT на несколько - лично я смысла не вижу.

ну как минимум в postgres'e
А начиная с 9.6 есть параллелизм, как минимум для последовательных чтений.
...
Рейтинг: 0 / 0
29.06.2020, 12:23
    #39974132
Имеет ли смысл разбивать большой select запрос на много маленьких?
imissyouso
да никуда, просто очень абстрактная задача, представим что раз в год кому-то понадобилось выгрузить много данных

ну и пусть ночью выгружает.
или "заказ данных", когда в бэкграунде создаётся файлик и выкладывается куда-то.
...
Рейтинг: 0 / 0
29.06.2020, 12:38
    #39974138
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
авторbochkovpostgresql такой огромный запрос не заблокирует таблицу, но другие СУБД например Mysql, может вызвать блокировку на несколько дней (было у меня такое)
и как решали эту проблему в mysql? в мускуле это случается потому что там нет mvcc? Он вынужден блокировать каждую строку по отдельности?
mysql блокирует таблицу пока insert(update) не пройдет
select делается паралельно
но если очередь запросов будет типа
долгий select, insert, потом select и еще select ... все selectы после insert , будут ждать пока insert не дождется выполнения первого запроса, которым долго извлекаются данные

для mysql проблема решается в твоем случае
Код: sql
1.
2.
3.
4.
5.
6.
select * from a where id=5000
select * from a where id=5001
select * from a where id=5002
select * from a where id=5003
...
select * from a where id=10000000


обычно такие выборки происходят ETL средствами, которые позволяют объединить результат, обработать, ну и подготовить данные для отчета

авторbochkov1 это очень много данных, извлекаться они будут долго, в это время нагрузка на сервер как правило будет максимальна,
плюс к этому, сервером будут выполнятся другие запросы, поэтому надо разбивать один запрос на тысячи, быть может миллионы запросов, между запросами будут паузы, тем самым сервер будет разгружен и выполнять запросы от других процессов,

но ведь можно выставить каждому клиенту свой приоритет, чтобы не отжирал все ресурсы и не забирал их у других клиентов, плюс у каждого запроса свой определенный буфферный кэш, который по размеру не равен вообще всему кэшу системы. Вопрос в том как это сделать, может есть здесь знатоки.
можно наверное, этим не занимался,
сервак не твоя собственность, как правило ты даже не админ (а даже если и админ, тут надо быть очень осторожным и долго подумать), и те приложения которые берут оттуда данные написаны давно и даже не тобой и должны работать быстро, как прежде, и твоя выгрузка юзерам не должна портить настроение

авторLeonid KudryavtsevБить один SELECT на несколько - лично я смысла не вижу.

ну как минимум в postgres'e
если запрос более разумного ожидания,
то надо бить, потому что твои изделия будут ложить сервер
...
Рейтинг: 0 / 0
29.06.2020, 12:40
    #39974139
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
Алексей Роза
imissyouso
да никуда, просто очень абстрактная задача, представим что раз в год кому-то понадобилось выгрузить много данных

ну и пусть ночью выгружает.
или "заказ данных", когда в бэкграунде создаётся файлик и выкладывается куда-то.

это если ночью сервер простаивает
...
Рейтинг: 0 / 0
29.06.2020, 15:51
    #39974216
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
bochkov

mysql блокирует таблицу пока insert(update) не пройдет
select делается паралельно
но если очередь запросов будет типа
долгий select, insert, потом select и еще select ... все selectы после insert , будут ждать пока insert не дождется выполнения первого запроса, которым долго извлекаются данные

Жесть какая. Как-то даже не верится. Т.к. что бы сделать такую однопоточную хрень (с блокировкой таблицы при INSERT), это нужно быть на первом курсе ПТУ. Т.к. даже на втором курсе, даже после полбутылки водки, такую ахинею спроектировать крайне сложно

IMHO

P.S.Хотя, при должном профессионализме, и Oracle можно колом поставить. Например наплодив в OLTP системе Bitmap индексов.
P.P.S. Бегло посмотрел доку по InnoDB, даже специальный тип блокировки есть "Insert Intention Locks" и "AUTO-INC Locks", ни про какое "блокирует таблицу" документация не упоминает (хотя AUTO-INC Locks и "is a special table-level lock" как он может мешать SELECT'ам, лично мне не понятно).
...
Рейтинг: 0 / 0
29.06.2020, 17:21
    #39974240
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
https://wiki.postgresql.org/wiki/Priorities
https://pgxn.org/dist/prioritize/

Если железо более-менее нормальное и пользователей много, то снижение приоритета на CPU -> вероятно автоматически приведет и к снижению read нагрузки на IO.

Разумеется, в ситуации когда на сервере один HDD и полтора пользователя, то снижай / не снижай - сильно большой разницы не заметишь.

IMHO & AFAIK
...
Рейтинг: 0 / 0
29.06.2020, 17:35
    #39974244
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
Leonid Kudryavtsev
bochkov

mysql блокирует таблицу пока insert(update) не пройдет
select делается паралельно
но если очередь запросов будет типа
долгий select, insert, потом select и еще select ... все selectы после insert , будут ждать пока insert не дождется выполнения первого запроса, которым долго извлекаются данные

Жесть какая. Как-то даже не верится. Т.к. что бы сделать такую однопоточную хрень (с блокировкой таблицы при INSERT), это нужно быть на первом курсе ПТУ. Т.к. даже на втором курсе, даже после полбутылки водки, такую ахинею спроектировать крайне сложно

Это наверняка про myisam говорилось, а не про mysql.
...
Рейтинг: 0 / 0
01.07.2020, 06:24
    #39974823
Shweik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
Алексей Роза
imissyouso
Код: sql
1.
select *


меня это смущает... а куда селект то? это в HTML будут выводить? тогда не надо!
кому и зачем понадобилось 10 лямов строк со всеми колонками?!
на загруженной базе...
это как не разбивай, всё равно будет нагрузка.

Думаю это фильтр для отбраковки тех, кто оставит звёздочку и не задаст вопроса "какие поля нужны". Сурово, но ведь это же "хайлоад" ;-)
...
Рейтинг: 0 / 0
01.07.2020, 15:47
    #39974934
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
Имеет ли смысл разбивать себе голову на много маленьких?
...
Рейтинг: 0 / 0
02.07.2020, 15:31
    #39975500
О-О-О
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Имеет ли смысл разбивать большой select запрос на много маленьких?
mefman,

Если есть сомнения, то нужно протестировать 2-8 вариантов и сравнить скорость работы, хотя бы на локальной машине.
Иногда случаются парадоксы - то что хорошо работает в одном случае - ужасно работает в другом случае, хотя код и суть примерно одинаковая. Уж не знаю почему, но отличия по времени могут достигать 2 раз, при этом нагрузка примерно одинаковая.

В вашем случае вообще непонятно, зачем 10 млн строк?
Для того, чтобы переварить такой запрос железо должно быть не хилым и ДА, такой запрос подвесит вашу базу данных.

.
Если же вы анализируете БД и хотите сделать какие то аналитические выборки/исследования, то лучше делать это кусками.
Будет и быстрее и нагрузки меньше.
.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Имеет ли смысл разбивать большой select запрос на много маленьких? / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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