|
Ограничение джойнов по числу записей
|
|||
---|---|---|---|
#18+
Чисто спортивный интерес. Имеется работающий запрос Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Но работает только при небольших значениях периода. Если интервал больше 15 дней, сервер матерится: Код: plaintext
Попытка обмануть систему путем перемещения ограничений из фильтра в условия связывания ожидаемо результата не дала. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Ошибка та же. А вот если основную таблицу обернуть вложенным селектом, то итоговый запрос вполне справляется с гораздо большим интервалом. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Я думал, может это count(DISTINCT ...) так затратно работает. Но нет, если дистинкты ото всюду убрать, результат будет (другой, но) аналогичный. Вопрос: можно ли как-то (настройки, индексы, директивы) заставить первый запрос работать более эффективно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 10:53 |
|
Ограничение джойнов по числу записей
|
|||
---|---|---|---|
#18+
paverобмануть систему путем перемещения ограничений из фильтра в условия связыванияНу это Вы только себя обманываете. Почитайте, как выполняются запросы - оба этих запроса фактически разворачиваются в одну и ту же картезианку со всеми условиями отбора во WHERE. paverА вот если основную таблицу обернуть вложенным селектомНадеюсь, Вы понимаете, что такой запрос неэквивалентен исходному - по причине наличия DISTINCT в подзапросе? paverсервер материтсяСервер не только матерится, но и вполне вменяемо советует, как можно уговорить его не материться. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 11:19 |
|
Ограничение джойнов по числу записей
|
|||
---|---|---|---|
#18+
paver, Попробуйте так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
в общем старайтесь агрегатные функции выполнить на меньшем объеме данных, т.е. выполнение COUNT(DISTINCT h.ticket_id) это плохо, когда можно выполнить COUNT(ticket_id) на более низком уровне необходимо наличие индексов на ticket_history.create_time; users.id; user_preferences.user_id (в идеале индекс user_preferences(user_id, preferences_key, preferences_value). если условие up.preferences_key = 'UserComment' AND up.preferences_value = 'tag1' отсеивает большую часть пользователей то лучше покажет себя следующий набор индексов user_preferences(preferences_key, preferences_value); ticket_history(create_time, create_by) и запрос вида Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 11:55 |
|
Ограничение джойнов по числу записей
|
|||
---|---|---|---|
#18+
Akinapaverобмануть систему путем перемещения ограничений из фильтра в условия связыванияНу это Вы только себя обманываете. Не обманываюсь ) Я же написал - ожидаемо AkinapaverА вот если основную таблицу обернуть вложенным селектомНадеюсь, Вы понимаете, что такой запрос неэквивалентен исходному - по причине наличия DISTINCT в подзапросе? Полагаю, что эквивалентны - по причине наличия DISTINCT в COUNT в исходном запросе. По крайней мере, результаты запросов эквивалентны. Кроме того, я отметил, что если избавиться от дистинктов, результат будет аналогичным, т.е. первый выполняется с ошибкой, третий - без. Akinapaverсервер материтсяСервер не только матерится, но и вполне вменяемо советует, как можно уговорить его не материться. Да, но! Совет заключается (как я понимаю) в увеличении выделенных ресурсов. Третий запрос обходится без этого. Означает ли это то, что запрос с подзапросом оптимальнее с точки зрения потребления ресурсов ОП? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 12:57 |
|
Ограничение джойнов по числу записей
|
|||
---|---|---|---|
#18+
paver, автор Означает ли это то, что запрос с подзапросом оптимальнее с точки зрения потребления ресурсов ОП? Да, если это значительно сократит выборку (хотя в случае с нормально составленными индексами оптимизатор сам справится) Но все зависит от конкретной задачи, объемов данных и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 13:12 |
|
Ограничение джойнов по числу записей
|
|||
---|---|---|---|
#18+
Swa111в общем старайтесь агрегатные функции выполнить на меньшем объеме данных, т.е. выполнение COUNT(DISTINCT h.ticket_id) это плохо, когда можно выполнить COUNT(ticket_id) на более низком уровне Ну да, примерно это и сделано в третьем запросе. Основной массив данных фильтруется в подзапросе, а вторая и третья таблицы - это скорее справочники. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 13:22 |
|
Ограничение джойнов по числу записей
|
|||
---|---|---|---|
#18+
Swa111paver, автор Означает ли это то, что запрос с подзапросом оптимальнее с точки зрения потребления ресурсов ОП? Да, если это значительно сократит выборку (хотя в случае с нормально составленными индексами оптимизатор сам справится) Но все зависит от конкретной задачи, объемов данных и т.п. С конкретной задачей - понятно. Я имел в виду общий случай. Почему корректные "чистые" джойны работают хуже подзапросов? Т.е. как заставить первый запрос работать не хуже третьего? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 13:28 |
|
Ограничение джойнов по числу записей
|
|||
---|---|---|---|
#18+
paverТ.е. как заставить первый запрос работать не хуже третьего? что explain показывает для первого запроса? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2018, 13:33 |
|
|
start [/forum/topic.php?fid=47&fpage=41&tid=1829386]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
86ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
others: | 314ms |
total: | 517ms |
0 / 0 |