|
|
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
Привет. Есть три таблицы, user, conversation, message. С таблицей user - все понятно, поля id, login, last_login_time (время последнего входа) conversation, поля: id, user1_id, user2_id, message_last_read_id_user1 - id последнего прочитанного сообщения пользователем user1_id message_last_write_id_user1 - id последнего отправленного сообщения пользователем user1_id message_last_read_id_user2 - id последнего прочитанного сообщения пользователем user2_id message_last_write_id_user2 - id последнего отправленного сообщения пользователем user2_id ... message, поля: id, conversation_id, poster_id, - id пользователя, который отправил данное сообщение msg, ... Цель выбрать пользователей, кто входил в течении последнего часа и выбрать для каждого из них количество непрочитанных сообщений: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Одно из unread_user1 или unread_user2 всегда будет 0. План выполнения запроса здесь http://explain.depesz.com/s/VT6 Может у кого-то будут идеи как объединить эти два под-запроса в один? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 14:29 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
INOKENTiY, думайте в сторону WHERE (c.user1_id = u.id OR c.user2_id = u.id) AND ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 16:41 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
ilejn, Пробовал так, но еще медленей получается. Может индекс дополнительный сделать по пробовал по message_last_read_id_user1 и message_last_write_id_user2 создать и по message_last_read_id_user2 и message_last_write_id_user1, но результатов не дало ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 17:20 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
Необходимо избавиться от подзапросов в выражении между SELECT и FROM (это всегда тормоза). Рекомендуется попробовать использовать выражение SELECT c DISTINCT ON. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 18:58 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
big-trotНеобходимо избавиться от подзапросов в выражении между SELECT и FROM (это всегда тормоза). Рекомендуется попробовать использовать выражение SELECT c DISTINCT ON. пробовал вот так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. но так намного медленей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 19:33 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
INOKENTiY, explain analyze запросов приведите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.01.2016, 19:38 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
INOKENTiYпробовал вот так .... т.е. вот так : Код: sql 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. начиная с 9.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 10:43 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
qwwq, вот блин у меня 9.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 13:40 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
Alexiusexplain analyze вот explain analyze первого запроса http://explain.depesz.com/s/rpBT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 14:25 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
INOKENTiYqwwq, вот блин у меня 9.1 тогда 2 кореллята. (есть трюки со сведением к одному корелляту компаунду или массиву, с извлечением полей на 2-м проходе уже по свёртке -- они примитивны) примерно вот туда: Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 14:26 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
qwwq, Проблему при join'е таблицы message, она большая в ней 20млн записей. Думаю если понять как этот запрос ускорить, то можно воспользоваться вашим решением Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Вот его план выполнения http://explain.depesz.com/s/2B0 Больше всего занимает выборка сообщений по ключу conversation_pkey id = m.conversation_id, наверное это уже никак не ускорить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 18:33 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
INOKENTiY, а скажите, любезный, сколько от числа всех user_id попадает в Код: sql 1. -- и мы, с вами, будем подумать, нужно ли вам сворачивать всё со всем, или совсем даже не обязательно. а можно очень немного и очень в корелляте. если от этого никуда не деться -- то делайте как вам нравится - кто ж вам запретит. но и тогда мне кажется вам ы сначала проанализироовать ваши таблички -- там 10 кратное отличие прогноза от результата (11лямов лупов индекс сика даже по пк -- радуют). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 18:59 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
qwwq, 886 пользователей в среднем. автор нужно ли вам сворачивать всё со всем, или совсем даже не обязательно. а можно очень немного и очень в корелляте. а можно это более популярно растолковать? спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 19:27 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
qwwq, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. пробую так, но этот запрос вообще не желает выполнятся за обозримое время, прошло 3 минуты я остановил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 19:54 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
qwwqINOKENTiY, а скажите, любезный, сколько от числа всех user_id попадает в INOKENTiYqwwq, 886 пользователей в среднем. и какая это часть "от числа всех" пользователей ? INOKENTiYа можно это более популярно растолковать? спасибо -- что именно ? я просто пытаюсь следить за вашей мыслью -- вы зачем то, в последнем вашем запросе, берёте полную свертку от произведения сообщений на conversation я, абстрагируясь от вопроса, зачем оно вам надо, хочу понять, нельзя ли эффективно проредить вашу выборку-для-свёртки ещё до свёртки. (перейдя к корелятам) но, видимо я зря абстрагируюсь -- вы просто гребёте стейтменты в кучку, и надо самому разбираться в постановке задачи, а не следовать за вашими попытками. Пока, скажу честно, мне лень разбираться с вашей структурой, и выяснять "кто на ком стоял " в вашем conversation. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.01.2016, 21:07 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
qwwq, 886 пользователей из 1200000. Сообщений 20млн, а в conversation 6млн записей. Не совсем понял ваши термины "свертка" Цель подсчитать количество не прочитаных сообщений для пользователей, которые заходили не позже чем чам назад. Для этого в conversation есть поля message_last_read_id_user1 - id последнего прочитанного сообщения пользователем user1_id message_last_write_id_user1 - id последнего отправленного сообщения пользователем user1_id message_last_read_id_user2 - id последнего прочитанного сообщения пользователем user2_id message_last_write_id_user2 - id последнего отправленного сообщения пользователем user2_id Вот ними и можно проредить выборку произведения сообщений на conversation. Вся проблема в том, что я не могу знать в каком поле user1_id или user2_id пользователь, который выбирается из таблицы user по условию last_login_time >= :timestamp_now - 3600. Потому в исходном запросе и есть два подзапроса. К примеру, у меня есть id пользователя, я узнаю что его айди соответсвует user2_id, значит, мне нужно проверить или message_last_read_id_user2 < message_last_write_id_user1, или id прочитаного мной сообщения меньше id отправленного сообщения моим собеседником user1. Что бы посчитать эти непрочитаные сообщения нужно выбрать сообщени по условию message_last_read_id_user2 < id <= message_last_write_id_user1 и которые отправленны user_id ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2016, 00:22 |
|
||
|
Как правильно объединить запросы?
|
|||
|---|---|---|---|
|
#18+
INOKENTiYqwwq, 886 пользователей из 1200000. Сообщений 20млн, а в conversation 6млн записей. и зачем тогда в теме появились полные свертки всех сообщений по всем пользователям ? вот кто вот это 18668735 и это 18669143 писал ? Вася Пупкин ? какого хера я должен про вот это вот 18668735 и это 18669143 вообще думать ? если речь -- о 886 из 1200000 ? о 886 из 1200000, Карл ! что вы можете, а что нет -- мне не интересно. напишите правильный фомально запрос, мы начнем его формально преобразовывать. И всё. человек усекающий множества через {coalesce(,) operator coalesce(,)} должен страдать. мне за него думать лень. и вообще тогда не понял , план какого именно запроса приведен в 18668735 . если этого 18667107 -- то что там делает фулл-скан по message а если вашего, простите, высера из 18668735 -- то зачем он мне ? зачем мне про него вообще думать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2016, 08:51 |
|
||
|
|

start [/forum/topic.php?fid=53&tid=1997528]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
159ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 448ms |

| 0 / 0 |
