Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите с запросом, не могу понять как оптимизировать :(
|
|||
|---|---|---|---|
|
#18+
Нужно обновить таблицу entities, задать время которое берется из таблицы transactions, связь между ними через таблицу entities_stats, у каждого entities может быть несколько entities_stats и нужно выбрать минимальное время, я выбираю его через id entities_stats так как понятно что первая запись самая ранняя. Код: plsql 1. 2. 3. 4. локально на маленькой базе всего в 10к entities выполняется за 14 секунд, продакшн база содержит 200М entities и 1B entities_stats, 200M transactions. Запрос висит уже сутки и пока результата нет. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 16:43 |
|
||
|
Помогите с запросом, не могу понять как оптимизировать :(
|
|||
|---|---|---|---|
|
#18+
berni, про dml-оператор MERGE почитайте... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:00 |
|
||
|
Помогите с запросом, не могу понять как оптимизировать :(
|
|||
|---|---|---|---|
|
#18+
Щукина Анна, А как тут MERGE поможет, в его PG-варианте `INSERT ... ON CONFLICT`? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:25 |
|
||
|
Помогите с запросом, не могу понять как оптимизировать :(
|
|||
|---|---|---|---|
|
#18+
berni, Такой UPDATE привидёт к существенному приросту размера таблицы. В продукции лучше делать небольшими кусочками, 3-5% от общего числа записей, перемежая вакуумом (ну или дожидаться autovacuum-а). Также, вам надо избавиться от доступа к `entities_stats` через первичный ключ. Что у вас со статистикой, давно обновлялась? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:31 |
|
||
|
Помогите с запросом, не могу понять как оптимизировать :(
|
|||
|---|---|---|---|
|
#18+
vyegorov, я думал о том что бы засунуть время в entities_stats, и даже сделал запрос на локалке что бы проверить скорость вставляя пока просто id вместо времени, через group by entity_id выбирая min(id) в запросе но скорость осталась практически такой-же может прибавила пару секунд. данные обновляются часто, несколько тысяч в час. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:39 |
|
||
|
Помогите с запросом, не могу понять как оптимизировать :(
|
|||
|---|---|---|---|
|
#18+
Я правильно понимаю, что большинство из строк в процессе не меняется? Т.е. должны обновиться только небольшое число строк, у кого изменился результат подзапроса? Попробуйте вот так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Идея в том, чтобы сначала посчитать строки, которые надо обновлять и обновить только их. explain (analyze, buffers) покажите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:56 |
|
||
|
Помогите с запросом, не могу понять как оптимизировать :(
|
|||
|---|---|---|---|
|
#18+
Melkij, Не совем, мне нужно обновить всю таблицу entities. грубо говоря нам нужно что бы в ней теперь было поле first_seen, не предусмотрели это с самого начала. А что бы выбрать дату когда мы увидели эту запись в первый раз найдо найти транзакцию через entities_stats, которых несколько для каждой entity. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 18:00 |
|
||
|
Помогите с запросом, не могу понять как оптимизировать :(
|
|||
|---|---|---|---|
|
#18+
berni, На вопрос про статистику не ответили -- как часто обновляется статистика (pg_stat_user_tables)? Я бы попробовал сделать: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 18:03 |
|
||
|
Помогите с запросом, не могу понять как оптимизировать :(
|
|||
|---|---|---|---|
|
#18+
berni, возможно тут понадобится индекс по (entity_id, id) в entities_stats, если для одного entity_id в среднем достаточно большое число строк может быть. если есть возможность - попробуйте обновить относительно небольшое число строк (добавьте какое-то условие) и покажите explain analyze запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 18:03 |
|
||
|
Помогите с запросом, не могу понять как оптимизировать :(
|
|||
|---|---|---|---|
|
#18+
berniгрубо говоря нам нужно что бы в ней теперь было поле first_seen, не предусмотрели это с самого начала Что, одноразовая задача? Одной транзакцией такое делать конечно не надо. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. И идите в цикле такими не очень большими транзакциями вплоть до curval(какой-то там сиквенс). Именно отдельными транзакциями, чтобы не держать блокировки. Впрочем, если у вас не OLTP, раз запросу позволительно висеть уже сутки, то можно кусками побольше обновлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 18:19 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39357908&tid=1996839]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
169ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 310ms |
| total: | 576ms |

| 0 / 0 |
