|
|
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Добрый день. Не могу понять в чем дело, копаюсь уже неделю, наверное. Есть БД в которой сейчас примерно 260 таблиц, есть такие таблицы как статистика, они унаследованы от основной таблицы статистики, т.е. в базе реализовано партицирование по времени и id юзера, получаются таблицы вида stats_y2015_m3_u1(год 2015, месяц 3, юзер 1), в каждой таблице есть CHECK CONSTRAINT, на основной таблице висит триггер на insert который проверяет есть ли такая таблица в которую надо сделать вставку, если нет, то создает ее и делает insert. Обновление примерно 1к строк для одного юзера занимает примерно 160сек(секунд), что как бы ооочень долго, я считаю. explain analyze показывает такие данные - http://explain.depesz.com/s/fnz т.е. выполняется запрос 0.115мсек(миллисекунд), если же я запускаю вставку на сервере, то по монитору вижу, что каждый такой запрос выполняется 0.1-0.2..сек(секунд). Postgresql 9.4.0,пробовал запускать на 9.3 и на 9.2 - результат такой же. Причем заметил, что если база чистая и партицированных таблиц нет, то вставка происходит намного быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 08:10 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK, поветрие пошло -- гребсти слова в кучку. И все -- ниочом. приведите именно тот код, который, по вашему мнению, тормозит. Весь. будем посмотреть. И да, в обновлении (партицирующих триггерах) предусмотрена возможность смены партиции ? или по месту не двигаетесь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 08:30 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Код который выполняется: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 08:36 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKКод который выполняется: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. для начала сделайте Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. и пришлите его сюда. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 09:08 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKДобрый день. Не могу понять в чем дело, копаюсь уже неделю, наверное. Есть БД в которой сейчас примерно 260 таблиц, есть такие таблицы как статистика, они унаследованы от основной таблицы статистики, т.е. в базе реализовано партицирование по времени и id юзера, получаются таблицы вида stats_y2015_m3_u1(год 2015, месяц 3, юзер 1), в каждой таблице есть CHECK CONSTRAINT, на основной таблице висит триггер на insert который проверяет есть ли такая таблица в которую надо сделать вставку, если нет, то создает ее и делает insert. Обновление примерно 1к строк для одного юзера занимает примерно 160сек(секунд), что как бы ооочень долго, я считаю. explain analyze показывает такие данные - http://explain.depesz.com/s/fnz т.е. выполняется запрос 0.115мсек(миллисекунд), если же я запускаю вставку на сервере, то по монитору вижу, что каждый такой запрос выполняется 0.1-0.2..сек(секунд). Postgresql 9.4.0,пробовал запускать на 9.3 и на 9.2 - результат такой же. Причем заметил, что если база чистая и партицированных таблиц нет, то вставка происходит намного быстрее. А если тоже самое сделать на схеме без партиций (прямо указав с какой таблицей работаете)? Тут есть 4 теории: 1)время планирования запроса (сколько у вас партиций сейчас)? 2)время на commit транзакции (вы все 1000 строк в одной транзакции обновляете или каждый update в своей транзакции)? 3)сетевые задержки (у вас приложение и база на одном сервере живут или на разных)? 4)диски перегруженные на запись (explain analyze никак время на commit транзакции и запись wal не учитывает). --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 09:13 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Ответ на второй пост: Если выполнять просто на таблице: Код: plsql 1. 2. 3. 4. 5. 1. Партиций сейчас именно по таблице stats около 100 2. делаю общий commit, я засекал время его выполнения в коде, выполняется моментально 3. на разных серверах, но я же смотрю время выполнения запроса непосредственно на сервере. 4. если верить pg_activity диски вообще не используются, памяти на сервере 128Гб, вся база весит 35, пробовал отключить fsync - не помогло вообще никак. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 09:22 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Ответ на второй пост: Если выполнять просто на таблице: Код: plsql 1. 2. 3. 4. 5. 1. Партиций сейчас именно по таблице stats около 100 2. делаю общий commit, я засекал время его выполнения в коде, выполняется моментально 3. на разных серверах, но я же смотрю время выполнения запроса непосредственно на сервере. 4. если верить pg_activity диски вообще не используются, памяти на сервере 128Гб, вся база весит 35, пробовал отключить fsync - не помогло вообще никак. 1)это в пределах разумного 2)это хорошо 4)тоже очень хорошо... а вот про 3 - а как собственно вы смотрите время выплнения запроса непосредственно на сервере? попробуйте включить log_min_duration_statement=0 и прислать то что записалось в лог для одного из ваших проблемных запросов. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 13:03 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, вот, выдернул из лога только что Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 13:41 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
у тебя для апдейта 1000 строк, вызывается 100 апдейтов??? нельзя пакетно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 15:44 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Ivan Durakу тебя для апдейта 1000 строк, вызывается 100 апдейтов??? нельзя пакетно? в смысле всю свою статистику инсертишь в лог. А раз в N секунд из лога пакетно группируешь и обновляешь таблицы статистики, а лог очищаешь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 15:47 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Ivan Durak, это 1000 уже сгруппированных уникальных по PK строк, я выполняю update, insert, update на случай если строки не было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 16:38 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKIvan Durak, это 1000 уже сгруппированных уникальных по PK строк, я выполняю update, insert, update на случай если строки не было. Где же тут твоя тысяча??? Есть есть уже 1000 сгруппированных то апдейт будет такой: UPDATE stats s set actions = s.actions + coalesce(t.actions, 0), ... etc FROM TableWith1000Rows t WHERE s.pk = t.pk; ---------------------- конечно тут даже не 1000, на 1000 врядли будет выйгрыш, тут еще лучше сразу миллионами обновлять - чем больше тем лучше ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 09:38 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Ivan Durak, этих строк может не быть в базе. Если нет хотя бы одной, значит надо сделать insert, но сфейлится весь запрос. Как сделать upsert? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 09:43 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK Как сделать upsert? Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 10:59 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKIvan Durak, этих строк может не быть в базе. Если нет хотя бы одной, значит надо сделать insert, но сфейлится весь запрос. Как сделать upsert? не сфейлится с чего вдруг? Обновит что есть. А после апдейта делай инсерт, хочешь как в посте выше, хочешь отдельно Insert into stats select t.* from TableWith1000Rows t left join stats s on s.pk=t.pk where s.pk is null; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2015, 11:47 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Ivan Durak, проблема то в том что именно запрос на апдейт одной строки выполняется долго(см. первый пост), тут экономия получится только на больших объемах, но в целом хочется понять почему такая проблема с апдейтом. Из-за большого кол-ва партиций или дело еще в чем-то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 12:52 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKIvan Durak, проблема то в том что именно запрос на апдейт одной строки выполняется долго(см. первый пост), тут экономия получится только на больших объемах, но в целом хочется понять почему такая проблема с апдейтом. Из-за большого кол-ва партиций или дело еще в чем-то? duration: 150.878 ms Куда быстрее-то!? Проблема таки в том что не надо апдейтить по одной! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 13:18 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKIvan Durak, проблема то в том что именно запрос на апдейт одной строки выполняется долго(см. первый пост), тут экономия получится только на больших объемах, но в целом хочется понять почему такая проблема с апдейтом. Из-за большого кол-ва партиций или дело еще в чем-то? у вас теже самые записи кто то еще паралелльно не может обновлять? очень уж похоже на блокировки. Попробуйте (временно) поставить deadlock_timeout=100ms + log_lock_waits=on и посмотрите на логи на предмет не были ли ожиданий локов на ваших update. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 15:12 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, была такая мысль уже, проверял, локов нет. Думаю остановлюсь на идее делать только insert, буду группировать и каждые n минут сбрасывать в базу записи. Получится больше строк, но думаю это не критично в данный момент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 21:20 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, вопрос в догонку - вы тоже считаете, что 150мсек это нормально на такие запросы и на мою структуру? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 21:25 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK, Вы делаете UPDATE на мастер-таблицу, так? А в партиции запрос спускается через триггер, да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 21:39 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
vyegorov, в партиции спускается только insert, триггер стоит на insert, а update понимает через check constraint по полям в PK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 22:53 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2015, 23:30 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKMaxim Boguk, вопрос в догонку - вы тоже считаете, что 150мсек это нормально на такие запросы и на мою структуру? :) Ненормально по времени на пару порядков. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 02:56 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
vyegorov, выкладываю парочку запросов, один в 2 раза быстрее получился, но такое бывает иногда, с утра меньше нагрузки. Длинный: Код: plsql 1. 2. 3. 4. 5. 6. 7. и побыстрее: Код: plsql 1. 2. 3. 4. 5. 6. 7. Меня смущает, что в обоих случаях actual time=0.218..0.221, вот такое время на апдейт меня устраивает. Видимо все остальное время работает планировщик? о_О ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 08:18 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK, "остальное время" может работать планировщик, если запросы редкие, партиций много, и всё для планирования ему приходится поднимать в кеш по новой с диска. у меня например были случаи стабильного планирования по ~15 сек. (в холодном состоянии) думаю, надо поискать у вас триггера, чеки, FK-и и прочие триггерные (по факту) ограничения, нет ли там чего-то неподобающего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 08:29 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
йоксель, запросы совсем не редкие, один из самых частых запросов, на самом деле. FK а базе нет, ну и триггер срабатывает только на insert(кстати замерял только вставку - отрабатывает моментально), а выполняется долго update. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 08:34 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK, какие ограничения висят на таблице ? [цах] какие из них -- пользуются планировщиком для отброса партиций при планировании ? и вообще, все, что можете -- про таблицу расскажите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 08:59 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK, Да, похоже на планировщик — это известная фишка Постгреса при партиционировании. Есть возможность использовать подготовленные запросы ? При инициализации сессии подготовьте запрос и потом его только исполняйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 09:22 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
vyegorovVerusK, Да, похоже на планировщик — это известная фишка Постгреса при партиционировании. Есть возможность использовать подготовленные запросы ? При инициализации сессии подготовьте запрос и потом его только исполняйте. При использовании autoexplain (да и обычного explain analyze) - время планирование в actual time НЕ ИДЕТ (его вообще до 9.4 версии нигде не видно). Тем более что планирование всегда занимает более менее одно и тоже время а тут то тормозит то нет. Ну и надо учитывать что по словам автора топика у него вся база в памяти и поднимать с диска вроде бы ничего не надо. Всетаки мне кажется что блокировки. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 09:34 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK а сколько у вас на базе shared buffers стоит? и как настроены checkpoints? И просто для очистки совести посмотрите iostat -x -m -d 10 пару-тройку минут на предмет загрузки дисковой подсистемы. И что у вас за дисковая подсистема? --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 09:39 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
vyegorovVerusK, Да, похоже на планировщик — это известная фишка Постгреса при партиционировании. Ага, вот, например: http://www.postgresql.org/message-id/2371.1234539121@sss.pgh.pa.us]http://www.postgresql.org/message-id/2371.1234539121@sss.pgh.pa.us vyegorovЕсть возможность использовать подготовленные запросы ? При инициализации сессии подготовьте запрос и потом его только исполняйте. Вот это хороший совет, IMHO, стоит попробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 09:42 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK и остальные... Снимаю свои возражения про планировщик, был невнимателен. Это явно оно судя по: "Planning time: 47.748 ms" Теперь вопрос к автору топика покажите вывод \d+ stats. Что-то у меня большие сомнения на счет 100 дочерних таблиц... такое время планирования скорее будет на 10000 дочерних таблиц. PS: prepared запросы тут только хуже сделают... так как база будет во всех дочерних таблицах пытаться update строки а не в одной. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 09:43 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
PgSQLAnonymousvyegorovЕсть возможность использовать подготовленные запросы ? При инициализации сессии подготовьте запрос и потом его только исполняйте. Вот это хороший совет, IMHO, стоит попробовать. Во избежание запутывания уважаемой аудитории и распостранения городских легенд позволю внести себе ясность в вопрос: 1)И так... prepared запрос планируется на этапе когда параметры запроса еще не известны. 2)В случае партиционирования это приводит к тому что план ВСЕГДА будет включать в себя обработку всех партиций, так как построить универсальный план по другому - невозможно. 3)Это приводит к тому что в данной конкретной задаче будет произведена попытка поиска строк ВО ВСЕХ наличных партициях. Что приведет еще более печальным результатам чем у автора топика наблюдаются. Все вышеприведенное относится и к хранимкам. По факту при использовании партиционирования приходится делать следующие вещи: 1)в prepared запросах надо ЯВНО (не параметрами) указывать условия по которым партиционируем. 2)в хранимках при работе с партиционированной таблицей использовать execute для перепланирования при каждом вызове. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 09:49 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
vacuum full всех системных таблиц попробуй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 09:50 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim BogukPgSQLAnonymousпропущено... Вот это хороший совет, IMHO, стоит попробовать. Во избежание запутывания уважаемой аудитории и распостранения городских легенд позволю внести себе ясность в вопрос: 1)И так... prepared запрос планируется на этапе когда параметры запроса еще не известны. 2)В случае партиционирования это приводит к тому что план ВСЕГДА будет включать в себя обработку всех партиций, так как построить универсальный план по другому - невозможно. 3)Это приводит к тому что в данной конкретной задаче будет произведена попытка поиска строк ВО ВСЕХ наличных партициях. Что приведет еще более печальным результатам чем у автора топика наблюдаются. Да, не подумал. :( Maxim Boguk прав, не делайте этого --- станет только хуже. ;( Сколько у Вас партиций, в самом деле? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 10:11 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim BogukVerusK и остальные... <> Что-то у меня большие сомнения на счет 100 дочерних таблиц... такое время планирования скорее будет на 10000 дочерних таблиц. <>если много сложных индексов -- и все примерно про одно и то же, и примерно вдоль плана -- то очень даже бывает. 1. можно попробовать генерить sql динамически, с генерацией полного имени партиции -- должно спасти 2. попробовать (FK на бд по утверждению автора нет) заменить апдейт на delete + insert. (insert, по тому же утверждению, не тормозит). 3. у автора двухкомпонентное партицирование, кажется (по 2-м параметрам) -- можно попробовать перестроить иерархию -- от корня унаследовать пустышки по одному ключу, а от них -- по обоим, на обоих уровнях inherit констрайнт по первому ключу партицирования -- число переборов планером может сократится (хотя не верю - в случае наличия стопящего констрайнта типа {CHECK (FALSE) NO INHERIT} на головной именно в плане update оно зачем то аппендит такую "головную") ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 10:28 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk 2)В случае партиционирования это приводит к тому что план ВСЕГДА будет включать в себя обработку всех партиций, так как построить универсальный план по другому - невозможно. это зависит от того, что такое "универсальный план в СУБД". кажется оракел умеет пользоваться значением бинд переменной для конкретизации плана "в момент исполнения". могу врать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 10:40 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
конфиг PG: shared_buffers = 32GB # - Checkpoints - checkpoint_segments = 64 checkpoint_completion_target = 0.9 \d+ stats - https://gist.github.com/anonymous/77e4c1000ae39f1fffb1 таблиц даже меньше 100 :) iostat - https://gist.github.com/anonymous/50d9041f145fe2cf12a4 йоксель, 1. Первое, что пришло в голову - не помогает :( 2. Попробую сейчас поиграться 3. Все верно, партицирование идет по 2м параметрам, по ts_spawn и по user_id - планировалось так чтобы у пользователей стата не тормозила(на самом деле это помогло, но зато столкнулся с проблемой записи этой самой статы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 10:40 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK 1. Первое, что пришло в голову - не помогает :( тогда проблема не в планировании. тосты к партициям толстые ли ? индексы на них не протухшие ли? я бы туда таки посмотрел, кто из них уникъю, и т.п. -- индексов то у вас просто немеряно. Если есть сильно протухшие уникъю индексы -- они будут тормозить проверкой. все время апаемая табличка нуждается в регулярных реиндексах, пичалька. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 10:50 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
PS ddl ЧЕК-ов мы так и не увидели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 10:54 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Вот код триггера, тут как раз создание дочерних таблиц - https://gist.github.com/anonymous/79d37e631892b4c2048f ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 11:07 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKВот код триггера, тут как раз создание дочерних таблиц - https://gist.github.com/anonymous/79d37e631892b4c2048f страшноватый. у вас д.б. гарантированно один писатель в stats, без конкурентов . например джоб с контролем уникальности себя в моменте. иначе -- будете все в белом. есть надежда, что у вас сильно протухшие ваши пк (было слишком много апдейтов). Но как их неконкурентно поджать -- м.б. Максимовой утилиткой ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 11:25 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
йоксель, я провел эксперимент, сделал полный дамп базы и развернул его на версиях 9.2 и 9.3 - результат точно такой же, апдейт медленный. При разворачивании дампа он ведь строит индексы заново, верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 11:38 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk1)И так... prepared запрос планируется на этапе когда параметры запроса еще не известны. 2)В случае партиционирования это приводит к тому что план ВСЕГДА будет включать в себя обработку всех партиций, так как построить универсальный план по другому - невозможно. Начиная с версии 9.2 PostgreSQL поддерживает параметризованные подготовленные запросы (вторая звездочка). Другое дело, что были жалобы (я не смогу найти быстро), что первые 4 исполнения проходят быстро, а потом планировщик переклинивает и он выбирает не оптимальные планы. Вроде эта тема была закрыта (патчами). В связи с этим 2 вопроса: какие конкретно версии (интересуют все 3 цифры) вы тестировали? в смысле — все ли апдейты стоят? каким будет поведение на 9.1? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 11:53 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
vyegorov, тестировал конкретно 9.2.4, 9.3, 9.4, 9.4.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 12:04 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK, верно но я не понимаю, как ваще автор1. Первое, что пришло в голову - не помогает :( соотносится с вашим же авторОтвет на второй пост: Если выполнять просто на таблице: Код: sql 1. 2. 3. -- в первом случае есть какое-то отягощение ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 12:07 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
йоксель, действительно, что-то я сам запутался в экспериментах. Если указать конкретную партицию, то работает очень быстро, наверное, как и должно. 1000 строк проапдейтилась за 10сек на локале ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 12:20 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK, А покажите вывод: Код: sql 1. Код: sql 1. Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 13:24 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 13:39 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusK, Я бы понизил shared_buffers до 2Гб, work_mem до 8Мб, effective_cache_size до 64Гб и пересобрал бы статистики. Также я бы оставил commit_delay + commit_siblings по умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 14:15 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 14:23 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKВот код триггера, тут как раз создание дочерних таблиц - https://gist.github.com/anonymous/79d37e631892b4c2048f а вот что попробуйте вместо Код: plaintext 1. сделать один общий CHECK: Код: plaintext (причем на всех уже созданных партициях сменить тоже). И посмотрите не исправилась ли ситуация. Так как единственное отличие от нормальных схем у вас это два независимых условия партиционирования. Может там что то не так работает. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 15:26 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKvyegorov, все запросы - https://gist.github.com/anonymous/90e84a06ab8bbe60f37e Вам бы следовало дать хоть какой-то SQL-script для воспроизведения ситуации. :( Я вот попробовал воспроизвести (упрощённо): http://sqlfiddle.com/#!15/9a9c2/2 Неудобство в том, что PostgreSQL там максимум 9.3, зато оттуда можно скопировать и попробовать у себя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 15:42 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, попробовать можно, но не скоро, надо подумать как этот процесс автоматизировать. Руками нереально :) PgSQLAnonymous, это если только дать дамп всех таблиц, там много записей уже, sqlfiddle отказывается столько заполнять :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 16:33 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
А если попробовать написать триггер на update? Т.е. в триггере указывать в какой конкретно таблице надо проапдейтить запись. Наткнулся вот на такое обсуждение - http://postgresql.nabble.com/Query-plan-for-partitioned-UPDATE-DELETE-slow-and-swaps-vmem-compared-to-SELECT-td3291659.html может с 2010 в этом плане ничего и не изменилось? :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 16:37 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKА если попробовать написать триггер на update? Т.е. в триггере указывать в какой конкретно таблице надо проапдейтить запись. Наткнулся вот на такое обсуждение - http://postgresql.nabble.com/Query-plan-for-partitioned-UPDATE-DELETE-slow-and-swaps-vmem-compared-to-SELECT-td3291659.html может с 2010 в этом плане ничего и не изменилось? :(как вы себе представляете событие данных в таблице, в которой их нет ? или вы на стейтмент хотите триггер повесить ? я вам попытался предложить тестирование альтернативы -- делаете наследников 2-х уровней. пустышки по первому чеку, им наследуете реальные таблицы с первым наследуемым и вторым чеком -- просто проверить, как идет пеербор чеков -- сразу на всю глубину иерархии, или умнее. скорее всего не выгорит. но может и полететь а обход иерархий скриптом -- стандартная задача ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 17:01 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
vyegorovMaxim Boguk1)И так... prepared запрос планируется на этапе когда параметры запроса еще не известны. 2)В случае партиционирования это приводит к тому что план ВСЕГДА будет включать в себя обработку всех партиций, так как построить универсальный план по другому - невозможно. Начиная с версии 9.2 PostgreSQL поддерживает параметризованные подготовленные запросы (вторая звездочка). Другое дело, что были жалобы (я не смогу найти быстро), что первые 4 исполнения проходят быстро, а потом планировщик переклинивает и он выбирает не оптимальные планы. Вроде эта тема была закрыта (патчами). В связи с этим 2 вопроса: какие конкретно версии (интересуют все 3 цифры) вы тестировали? в смысле — все ли апдейты стоят? каким будет поведение на 9.1? Тут коротко на этот вопрос не ответишь. Часть1: Как работают параметризованные prepared запросы - строятся 2 плана общий в начале и частный с учетом параметров при первом вызове. Далее пока данный prepared запрос работает только с теми параметрами которые подходят под частный план - все в теории хорошо, но стоит 1 раз вызвать этот же prepared запрос с другими параметрами как он НЕОБРАТИМО переключится на generic plan и будет его использовать все время жизни prepared запроса. Иногда это приводит к милым эффектам - вот есть большое java приложение, вот оно сделало prepared запрос для какой то большой партиционированной таблицы. Далее 99.999% случаев запросы работают с текущим месяцем данные которого успешно закешированны в базе, потом какой то менеджер решает случайно посмотреть данные за прошлый месяц и тут наступает ад, так как этот prepared запрос (а они в java Дооолго живут) начинает перебирать архив партиций с данными за последние 10 лет которые лежат на медленных SAS дисках просто для истории, а он может вызываться часто. Вот так сервер работал-работал и упс. Я такую проблему как то 2 недели ловил. Часть2: Касательно " в теории хорошо" - на практике в 9.2.10 (последнем) поведение следующее у меня получается: Код: plaintext 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. Так что проблему не исправили. Что в сочетании с изложенным в Часть1 делает лобовое использование партиций в сочетании с prepared запросами наработоспособным. Увы. PS: пойду bug report напишу. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 19:40 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
VerusKPgSQLAnonymous, это если только дать дамп всех таблиц, там много записей уже, sqlfiddle отказывается столько заполнять :) А я вот погонял тот fiddle, на который давал ссылку, на своём Postgres-е, и у меня Ваша проблема-то воспроизводится. ;) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Это при том, что у stats всего 61 partition и по одной записи в каждой из них. Это PostgreSQL 9.4.1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 20:23 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
PgSQLAnonymous, Текущая теория что партиционирование по 2м чекам приводит к каким то проблемам с планированием. Попробую сделать короткий test case и зарепортить bug (если test case получится конечно) --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 20:30 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, Спасибо за подробный ответ. Давно думаю, что отчасти из-за таких же проблем оракл свой шаред_пул сделал (там, правда, свои грабли). Эх, не исправят они эту фишку пока полноценные партиции не прикрутят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 20:37 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim BogukPgSQLAnonymous, Текущая теория что партиционирование по 2м чекам приводит к каким то проблемам с планированием. Попробую сделать короткий test case и зарепортить bug (если test case получится конечно) Хм... А чем Вам этот fiddle не подходит как test case? Кстати, при 155 таблицах уже: Planning time: 534.810 ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 20:47 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Maxim BogukPgSQLAnonymous, Текущая теория что партиционирование по 2м чекам приводит к каким то проблемам с планированием. Попробую сделать короткий test case и зарепортить bug (если test case получится конечно) --Maxim Boguk www.postgresql-consulting.ru по моим экспериментам получилось что проблема не столько в партициях сколько в 60*25 = 1500 индексах в плане. без 25 индексов на каждой таблице запрос планируется раз в 10 быстрее что уже ближе к правде. --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 20:47 |
|
||
|
Быстрый запрос в explain analyze но медленный по факту
|
|||
|---|---|---|---|
|
#18+
Кстати, в другом проекте использовал партиционирование по одному чеку - таких проблем там не наблюдается, проверил(PG 9.3). Убрать тут чеки для тестов со всех таблиц еще не успел :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2015, 22:25 |
|
||
|
|

start [/forum/topic.php?all=1&fid=53&tid=1998077]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
250ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
102ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 617ms |

| 0 / 0 |
