|
|
|
Быстрый запрос в 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 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38918603&tid=1998077]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
5ms |
track hit: |
179ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 531ms |

| 0 / 0 |
