|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
Привет! На самом деле, это один из вопросов на интервью в компанию, которая занимается хайлоадом. Например, есть таблица размером 1TB с первичным b-tree ключем по id. Нам нужно сделать селект по рейджу id >= 5000 and id < 10000000. Мы не должны заблокировать всю базу. База под высокой нагрузкой. Имеет ли смысл разбивать такой select запрос на много маленьких? Код: sql 1. 2. 3.
Если да, то почему? Чем это объясняется? Какие могут быть еще техники решения этой задачи? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2020, 16:23 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
imissyouso Привет! На самом деле, это один из вопросов на интервью в компанию, которая занимается хайлоадом. Например, есть таблица размером 1TB с первичным b-tree ключем по id. Нам нужно сделать селект по рейджу id >= 5000 and id < 10000000. Мы не должны заблокировать всю базу. База под высокой нагрузкой. Имеет ли смысл разбивать такой select запрос на много маленьких? Код: sql 1. 2. 3.
Если да, то почему? Чем это объясняется? Какие могут быть еще техники решения этой задачи? Спасибо. "селект по рейджу" Что такое "рейджу"? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2020, 17:56 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
Заблокировать селектом? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2020, 18:40 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
mefman Заблокировать селектом? Селект что-то блокирует ? (в том виде, как приведено в первом сообщении) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2020, 18:43 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
Если под "заблокировать" понимается "поставить колом" дисковую подсистему на сервере, то это наверное лечится банальным уменьшение скорости "забирания" данных или нормальным железом/OS/прямыми_руками_админов. Уменьшить скорость "забирания" можно: банальным sleep после fetch'а на клиенте ограничить скорости сети (наверное могут сделать админы) до конкретного клиента ограничить скорости процессор/диск конкретного процесса postgres на сервере (х.з. как определить, какой процесс ограничивать) и 100500 резных других способов которые можно придумать в меру своих фантазий В Oracle для таких целей есть Oracle Database Resource Manager , есть ли аналогичные средства в PostgreSQL - не знаю. Бить один SELECT на несколько - лично я смысла не вижу. IMHO ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2020, 18:55 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
imissyouso Код: sql 1.
меня это смущает... а куда селект то? это в HTML будут выводить? тогда не надо! кому и зачем понадобилось 10 лямов строк со всеми колонками?! на загруженной базе... это как не разбивай, всё равно будет нагрузка. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2020, 21:10 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
imissyouso Привет! На самом деле, это один из вопросов на интервью в компанию, которая занимается хайлоадом. Например, есть таблица размером 1TB с первичным b-tree ключем по id. Нам нужно сделать селект по рейджу id >= 5000 and id < 10000000. Мы не должны заблокировать всю базу. База под высокой нагрузкой. Имеет ли смысл разбивать такой select запрос на много маленьких? Код: sql 1. 2. 3.
Если да, то почему? Чем это объясняется? Какие могут быть еще техники решения этой задачи? Спасибо. 1 это очень много данных, извлекаться они будут долго, в это время нагрузка на сервер как правило будет максимальна, плюс к этому, сервером будут выполнятся другие запросы, поэтому надо разбивать один запрос на тысячи, быть может миллионы запросов, между запросами будут паузы, тем самым сервер будет разгружен и выполнять запросы от других процессов, 2 множество запросов наверняка позволит избежать создания временных таблиц (в этом случае временная таблица вряд ли будет создаваться, но так часто бывает с сложными запросами) 3 обычно такая выгрузка влечет последующие обработки и быстрая выдача данных из маленьких запросов позволит сразу же начать эти вычисления 4 postgresql такой огромный запрос не заблокирует таблицу, но другие СУБД например Mysql, может вызвать блокировку на несколько дней (было у меня такое) PS и как показывает практика, извлечение много данных маленькими запросами, но в несколько потоков, происходит на много быстрее чем один огромный селект ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 04:27 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
bochkov, Про mvcc не надо забывать ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 09:59 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
Ролг Хупин"селект по рейджу" Что такое "рейджу"? рейнджу* = range bochkovpostgresql такой огромный запрос не заблокирует таблицу, но другие СУБД например Mysql, может вызвать блокировку на несколько дней (было у меня такое) и как решали эту проблему в mysql? в мускуле это случается потому что там нет mvcc? Он вынужден блокировать каждую строку по отдельности? bochkov1 это очень много данных, извлекаться они будут долго, в это время нагрузка на сервер как правило будет максимальна, плюс к этому, сервером будут выполнятся другие запросы, поэтому надо разбивать один запрос на тысячи, быть может миллионы запросов, между запросами будут паузы, тем самым сервер будет разгружен и выполнять запросы от других процессов, но ведь можно выставить каждому клиенту свой приоритет, чтобы не отжирал все ресурсы и не забирал их у других клиентов, плюс у каждого запроса свой определенный буфферный кэш, который по размеру не равен вообще всему кэшу системы. Вопрос в том как это сделать, может есть здесь знатоки. Алексей Розаменя это смущает... а куда селект то? это в HTML будут выводить? тогда не надо! кому и зачем понадобилось 10 лямов строк со всеми колонками?! на загруженной базе... это как не разбивай, всё равно будет нагрузка. да никуда, просто очень абстрактная задача, представим что раз в год кому-то понадобилось выгрузить много данных Leonid KudryavtsevБить один SELECT на несколько - лично я смысла не вижу. ну как минимум в postgres'e ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 11:13 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
imissyouso Leonid KudryavtsevБить один SELECT на несколько - лично я смысла не вижу. ну как минимум в postgres'e А начиная с 9.6 есть параллелизм, как минимум для последовательных чтений. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 11:17 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
imissyouso да никуда, просто очень абстрактная задача, представим что раз в год кому-то понадобилось выгрузить много данных ну и пусть ночью выгружает. или "заказ данных", когда в бэкграунде создаётся файлик и выкладывается куда-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 12:23 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
авторbochkovpostgresql такой огромный запрос не заблокирует таблицу, но другие СУБД например Mysql, может вызвать блокировку на несколько дней (было у меня такое) и как решали эту проблему в mysql? в мускуле это случается потому что там нет mvcc? Он вынужден блокировать каждую строку по отдельности? mysql блокирует таблицу пока insert(update) не пройдет select делается паралельно но если очередь запросов будет типа долгий select, insert, потом select и еще select ... все selectы после insert , будут ждать пока insert не дождется выполнения первого запроса, которым долго извлекаются данные для mysql проблема решается в твоем случае Код: sql 1. 2. 3. 4. 5. 6.
обычно такие выборки происходят ETL средствами, которые позволяют объединить результат, обработать, ну и подготовить данные для отчета авторbochkov1 это очень много данных, извлекаться они будут долго, в это время нагрузка на сервер как правило будет максимальна, плюс к этому, сервером будут выполнятся другие запросы, поэтому надо разбивать один запрос на тысячи, быть может миллионы запросов, между запросами будут паузы, тем самым сервер будет разгружен и выполнять запросы от других процессов, но ведь можно выставить каждому клиенту свой приоритет, чтобы не отжирал все ресурсы и не забирал их у других клиентов, плюс у каждого запроса свой определенный буфферный кэш, который по размеру не равен вообще всему кэшу системы. Вопрос в том как это сделать, может есть здесь знатоки. можно наверное, этим не занимался, сервак не твоя собственность, как правило ты даже не админ (а даже если и админ, тут надо быть очень осторожным и долго подумать), и те приложения которые берут оттуда данные написаны давно и даже не тобой и должны работать быстро, как прежде, и твоя выгрузка юзерам не должна портить настроение авторLeonid KudryavtsevБить один SELECT на несколько - лично я смысла не вижу. ну как минимум в postgres'e если запрос более разумного ожидания, то надо бить, потому что твои изделия будут ложить сервер ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 12:38 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
Алексей Роза imissyouso да никуда, просто очень абстрактная задача, представим что раз в год кому-то понадобилось выгрузить много данных ну и пусть ночью выгружает. или "заказ данных", когда в бэкграунде создаётся файлик и выкладывается куда-то. это если ночью сервер простаивает ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 12:40 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
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'ам, лично мне не понятно). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 15:51 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
https://wiki.postgresql.org/wiki/Priorities https://pgxn.org/dist/prioritize/ Если железо более-менее нормальное и пользователей много, то снижение приоритета на CPU -> вероятно автоматически приведет и к снижению read нагрузки на IO. Разумеется, в ситуации когда на сервере один HDD и полтора пользователя, то снижай / не снижай - сильно большой разницы не заметишь. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 17:21 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev bochkov mysql блокирует таблицу пока insert(update) не пройдет select делается паралельно но если очередь запросов будет типа долгий select, insert, потом select и еще select ... все selectы после insert , будут ждать пока insert не дождется выполнения первого запроса, которым долго извлекаются данные Жесть какая. Как-то даже не верится. Т.к. что бы сделать такую однопоточную хрень (с блокировкой таблицы при INSERT), это нужно быть на первом курсе ПТУ. Т.к. даже на втором курсе, даже после полбутылки водки, такую ахинею спроектировать крайне сложно Это наверняка про myisam говорилось, а не про mysql. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.06.2020, 17:35 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
Алексей Роза imissyouso Код: sql 1.
меня это смущает... а куда селект то? это в HTML будут выводить? тогда не надо! кому и зачем понадобилось 10 лямов строк со всеми колонками?! на загруженной базе... это как не разбивай, всё равно будет нагрузка. Думаю это фильтр для отбраковки тех, кто оставит звёздочку и не задаст вопроса "какие поля нужны". Сурово, но ведь это же "хайлоад" ;-) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 06:24 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
Имеет ли смысл разбивать себе голову на много маленьких? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2020, 15:47 |
|
Имеет ли смысл разбивать большой select запрос на много маленьких?
|
|||
---|---|---|---|
#18+
mefman, Если есть сомнения, то нужно протестировать 2-8 вариантов и сравнить скорость работы, хотя бы на локальной машине. Иногда случаются парадоксы - то что хорошо работает в одном случае - ужасно работает в другом случае, хотя код и суть примерно одинаковая. Уж не знаю почему, но отличия по времени могут достигать 2 раз, при этом нагрузка примерно одинаковая. В вашем случае вообще непонятно, зачем 10 млн строк? Для того, чтобы переварить такой запрос железо должно быть не хилым и ДА, такой запрос подвесит вашу базу данных. . Если же вы анализируете БД и хотите сделать какие то аналитические выборки/исследования, то лучше делать это кусками. Будет и быстрее и нагрузки меньше. . ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2020, 15:31 |
|
|
start [/forum/topic.php?fid=53&msg=39974017&tid=1994619]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
40ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 152ms |
0 / 0 |