|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Коллеги, доброе утро. По Постгре опыт не сильно большой. Базовые настройки менял, запросы оптимизировал. Но вот наткнулись на такой ньюанс. СУБД на Windows. Есть линейный запрос: Код: sql 1.
Ставим вместо х 10.000, запрос работает 10с. 20.000 - 20с. и т.д., все вроде бы линейно. Но по достижению какого-то порогового значения, допустим, 60.000, запрос выполняется ну там 1.5 минуты. После этого запрос на 10.000 начинает работать дольше, 18с. Через какое-то время все запросы снова выполняются за стандартное время. Не очень понятно, что происходит. Может я не до конца понимаю, как работает буфер данных в Постгре... Проверяли все это на продакшн сервере на виртуалке, на тестовом сервере на другой виртуалке, и даже на локальном физическом сервере. На 2х виртуалках с разными ресурсами(32 на тестовом и 57 на продакшн гб) по памяти наблюдали данный эффект. На локальном физическом сервере такого эффекта не наблюдали, но там данных было всего 41.000. Памяти вроде достаточно. На тестовом в Shared_buffers указано 6гб, на продакшн поднимали с 6 до 12, никакого эффекта не достигнули. Или дело может быть в виртуалках? При тестировании всех и все отключали. На тестовом так точно никого не нет --- Проходя мимо разложенных граблей, ты теряешь драгоценный опыт. (с) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 10:08 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
MegabyteПо Постгре опыт не сильно большой. Базовые настройки менял, запросы оптимизировал. Это такой замкадский диалект? типа поребрика, шавермы итд? СУБД называется PostgreSQL, допустимо называть Постгрес, на не как не что-то другое ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 10:40 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
mefmanMegabyteПо Постгре опыт не сильно большой. Базовые настройки менял, запросы оптимизировал. СУБД называется PostgreSQL, допустимо называть Постгрес, на не как не что-то другое Принято. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:01 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Megabyte, смотрите для начала explain (analyze, buffers) при включенном в конфиге track_io_timing. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:24 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Megabyte, Приведите `EXPLAIN (analyze, buffers)` для запросов с интересующими значениями X, будет проще показать. Однако, использовать столь большие значения для LIMIT да ещё и без ORDER BY — сильный анти-паттерн. Какую задачу пытаетесь решить? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 11:24 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
vyegorovMegabyte, Однако, использовать столь большие значения для LIMIT да ещё и без ORDER BY — сильный анти-паттерн. Какую задачу пытаетесь решить? Как таковой задачи нет. Просто клиент на больших объемах заметил такую вот особенность. В первую очередь для себя хочу разобраться, почему такое поведение. EXPLAIN (analyze, buffers), да, гляну. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 12:11 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
X = 10.000: время выполнения, 1с. Код: sql 1. 2. 3. 4. 5. 6.
X = 20.000: 3с. Код: sql 1. 2. 3. 4. 5. 6.
X = 40.000: 6с. Код: sql 1. 2. 3. 4. 5. 6.
X = 60.000: 9с Код: sql 1. 2. 3. 4. 5. 6.
X = 100.000: 58с, 2й раз 60с. Код: sql 1. 2. 3. 4. 5. 6.
X = 100.000: 2й раз 60с. Код: sql 1. 2. 3. 4. 5. 6.
Я так понимаю, что в следующих итерациях PostgreSQL меньше данных читает из буфера. Почему? Сделал запрос с явной сортировкой: Код: sql 1.
Выполнился за 30с, 2й раз за 25с. Код: sql 1. 2. 3. 4. 5. 6.
Прикольно, PostgreSQL заюзал Primary Key и сделал индекс скан вместо сканирования таблицы... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 14:31 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Megabyte, чем вы свои секунды измеряете? В последнем примере, где вы пишите 60 с, база уверена, что сделала все за 4,8 с. Если вы смотрите время выполнения в PgAdmin, то он показывает не время выполнения запроса, а суммарное время, потребное в т.ч. на передачу данных и, возможно, отображение. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 16:32 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Ы2Megabyte, чем вы свои секунды измеряете? В последнем примере, где вы пишите 60 с, база уверена, что сделала все за 4,8 с. Если вы смотрите время выполнения в PgAdmin, то он показывает не время выполнения запроса, а суммарное время, потребное в т.ч. на передачу данных и, возможно, отображение. Я написал фактическое время, да, когда, собственно, выполнил сам запрос. А Execution time в explain разве показывает реальное время, а не предполагаемое? Т.к. запрос с explain - это уже был следующий запрос. p.s. Т.е., получается, PostgreSQL значительную часть времени может тратить на передачу и отображение, а не выполнение запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 17:38 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
MegabyteТ.е., получается, PostgreSQL значительную часть времени может тратить на передачу и отображение, а не выполнение запроса? НЕ PostgreSQL, а то приложение, которым Вы данные извлекаете. IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 17:42 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Megabytep.s. Т.е., получается, PGAdmin значительную часть времени может тратить на передачу и отображение, а не выполнение запроса? поправил ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 17:45 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
MegabyteА Execution time в explain разве показывает реальное время, а не предполагаемое? explain analyze - именно реальное выполнение запроса. И actual time в каждом узле - реальное измеренное время выполнения этого узла плана от первой до последней строки результата. Но без учёта передачи ответа по сети, да. Т.к. ответ никуда не передаётся. И даже Planning time - это не планируемое время, а реальное время затраченное планировщиком запроса на составление и выбор плана выполнения. При включенном track_io_timing в explain (analyze,buffers) будет ещё измерение времени чтения всех блоков, которые не нашли в shared buffers. Которое тоже может сильно скакать, тем более в вашем случае где судя по explain ничего в shared buffers не было и чуть менее чем всё просили читать операционную систему. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 20:35 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Спасибо. К слову о реальной задаче. Есть запрос, без каких либо условий фильтрации. Просто join нескольких таблиц среднего размера(100-300 тысяч записей). Базовая(первая таблица выборки) таблица, как раз та, по которой возник вопрос насчет Select * from Table limit X. В MS SQL этот запрос отрабатывает в районе 10с, что в студии, что в приложении. В PostgreSQL запрос в студии и в приложении работает 70с. Execution time в explain (analyse, buffers) показывает 15-16с. Получается, что 55-56с тратится, что в приложении, что в PgAdmin на передачу данных и отображение..? Это возможно как-то ускорить? Или что на это влияет? Со слов клиента, раньше этот запрос в приложении работал за 30с(проверить нет возможности), Кол-во данных не менялось. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 21:20 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
MegabyteСпасибо. К слову о реальной задаче. Есть запрос, без каких либо условий фильтрации. Просто join нескольких таблиц среднего размера(100-300 тысяч записей). Базовая(первая таблица выборки) таблица, как раз та, по которой возник вопрос насчет Select * from Table limit X. В MS SQL этот запрос отрабатывает в районе 10с, что в студии, что в приложении. В PostgreSQL запрос в студии и в приложении работает 70с. Execution time в explain (analyse, buffers) показывает 15-16с. Получается, что 55-56с тратится, что в приложении, что в PgAdmin на передачу данных и отображение..? Это возможно как-то ускорить? Или что на это влияет? Со слов клиента, раньше этот запрос в приложении работал за 30с(проверить нет возможности), Кол-во данных не менялось. Для начала - обновится до 10.4 и включить параллельное выполнение запросов на многих ядрах. Дальше в psql делать 1)explain (analyze, costs, buffers, timing) запроса общего 2)\timing on \o somefile запрос; чтобы посмотреть на сколько времени запрос выполняется в реальности и главное какой обьем данных он отдает 3)если с временем на приложении сильно не совпадает - смотреть на то какая вообще скорость сети и за какое время этот БОЛЬШОЙ ответ через нее пролезает (вряд ли у вас 10GBit кругом чтобы не думать об этом почти) 4)если сети хватает - лечить приложение. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 21:38 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Спасибо, буду копать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 21:50 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Maxim BogukДальше в psql делать 1)explain (analyze, costs, buffers, timing) запроса общего C таким explain получилось уже 52с. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 22:05 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
MegabyteMaxim BogukДальше в psql делать 1)explain (analyze, costs, buffers, timing) запроса общего C таким explain получилось уже 52с. Со 2,3го раза уже 18,20с. Но сам запрос все равно в районе 70с. Что-то я не улавливаю причины... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2018, 22:46 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Megabyte, Вы абсолютно не туда смотрите. Время исполнения запроса базой гораздо меньше и явно видно в выводе `EXPLAIN`. То, что вы замеряете — пропускная способность сети + поведенческие особенности вашего клиентского приложения. С этим помочь в рамках форума не выйдет. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 00:18 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Maxim Boguk2)\timing on \o somefile запрос; чтобы посмотреть на сколько времени запрос выполняется в реальности и главное какой обьем данных он отдает 3)если с временем на приложении сильно не совпадает - смотреть на то какая вообще скорость сети и за какое время этот БОЛЬШОЙ ответ через нее пролезает (вряд ли у вас 10GBit кругом чтобы не думать об этом почти) Недавно наткнулся, вроде в тему. psql может много времени тратить на форматирование результата. Возможно и pgAdmin грешит этим, не проверял. Несложные замеры в psql показывают, что выгрузка данных в файл командой SELECT выполняется существенно дольше, чем командой COPY .. TO. В таблице tickets демонстрационной базы данных около 3 миллионов строк. Попробуем выгрузить данные столбца contact_data в файл. Сначала командой SELECT, а затем командой COPY .. TO. Интересует время выгрузки, поэтому включим \timing. Дополнительно замерим время между двумя вызовами функции clock_timestamp: до и после выгрузки. Скрипт timing.sql: -- Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
-- Запускаем: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Обращает на себя внимание. 1. Реальное время выполнения, полученное разницей вызовов clock_timestamp первой выгрузки (~10 сек), значительно больше чем показал \timing (~2 сек). Т.е. к показаниям \timing нужно относиться аккуратно. 2. Вторая выгрузка (COPY .. TO) заняла ~2,6 сек, что почти в 4 раза быстрее чем первая выгрузка. Однако причина вовсе не в особенностях выполнения команд SELECT и COPY .. TO. Столь существенная разница объясняется тем, что psql по умолчанию форматирует результаты запросов. В частности выравнивает ширину столбцов. Стоит только отключить выравнивание, как время обоих запросов становится похожим: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 10:42 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
vyegorovТо, что вы замеряете — пропускная способность сети + поведенческие особенности вашего клиентского приложения. Но MS SQL этому не подвержен. Не выгрузку оттуда сеть и приложение не влияет почему-то. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 15:29 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
MegabytevyegorovТо, что вы замеряете — пропускная способность сети + поведенческие особенности вашего клиентского приложения. Но MS SQL этому не подвержен. Не выгрузку оттуда сеть и приложение не влияет почему-то. Это уже вам тут не помогут. С таким вопросом. Разбирайтесь сами. Непрофильный вопрос. Профилируйте/смотрите что где тормозит и тд. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 16:15 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Maxim BogukMegabyteпропущено... Но MS SQL этому не подвержен. Не выгрузку оттуда сеть и приложение не влияет почему-то. Это уже вам тут не помогут. С таким вопросом. Разбирайтесь сами. Непрофильный вопрос. Профилируйте/смотрите что где тормозит и тд. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru Да это не вопрос был. Скорее рассуждение на тему влияния сети и приложения на длительность запроса... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 16:29 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
MegabyteДа это не вопрос был. Скорее рассуждение на тему влияния сети и приложения на длительность запроса... Так протоколы то разные. Кстати о протоколах у вас там в ответе двоичных данных (LO/bytea) нет случайно больших? Попробуйте изменить bytea_output на hex если еще не (если у вас есть в ответе bytea большие). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 16:47 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Maxim BogukMegabyteДа это не вопрос был. Скорее рассуждение на тему влияния сети и приложения на длительность запроса... Так протоколы то разные. Кстати о протоколах у вас там в ответе двоичных данных (LO/bytea) нет случайно больших? Попробуйте изменить bytea_output на hex если еще не (если у вас есть в ответе bytea большие). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru Посмотрю, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2018, 21:31 |
|
Постгре начинает тормозить на запросе при пороговом значении limit
|
|||
---|---|---|---|
#18+
Коллеги, подскажите, а в Explain в: Код: sql 1.
Что означают последние 2 блока: dirtied, written? Что обозначают hit, read, я в курсе. Поиском что-то не нашел ничего путного... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.08.2018, 22:18 |
|
|
start [/forum/topic.php?fid=53&fpage=52&tid=1995641]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 271ms |
total: | 413ms |
0 / 0 |