Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / PostgreSQL |
![]() ![]() |
Levaz12 Member Откуда: Сообщений: 3 |
Всем привет Есть такой запрос: SELECT id, created_at, updated_at, details, formatted_address, place_id, ptype FROM ( SELECT :projection, CASE WHEN EXISTS( SELECT task.id FROM task LEFT JOIN property_task ON property_task.task_id = task.id LEFT JOIN property ON property.id = property_task.property_id LEFT JOIN contact_task ON contact_task.task_id = task.id LEFT JOIN contact ON contact.id = contact_task.contact_id LEFT JOIN "user" ON "user".id = task.owner_id LEFT JOIN user_group ON user_group.user_id = "user".id WHERE task.owner_id = {$userId} AND "user".id = user_group.user_id AND user_group.group_id = {$groupId} AND (contact.address_id = address.id OR property.address_id = address.id) AND task_type_id IN (4, 5, 6, 7) AND task.status = 'remind' AND date_trunc('day', task.tasked_at) <= date_trunc('day', NOW()) ) THEN 'remind' ELSE 'null' END AS ptype, (details::json#>>'{location,latitude}') AS latitude, (details::json#>>'{location,longitude}') AS longitude FROM address WHERE point( (details::json#>>'{location,longitude}')::DOUBLE PRECISION , (details::json#>>'{location,latitude}')::DOUBLE PRECISION)<@polygon('({$string})') ) AS addresses WHERE addresses.ptype != 'null' этот запрос возращает 2 записи мне нужно его упростить. И я пробывал так: SELECT :projection, (details::json#>>'{location,latitude}') AS latitude, (details::json#>>'{location,longitude}') AS longitude FROM address LEFT JOIN "user" ON address.user_id = "user".id LEFT JOIN user_group ON user_group.user_id = "user".id LEFT JOIN task ON "user"."id" = "task"."owner_id" LEFT JOIN property_task ON property_task.task_id = task.id LEFT JOIN property ON property.id = property_task.property_id LEFT JOIN contact_task ON contact_task.task_id = task.id LEFT JOIN contact ON contact.id = contact_task.contact_id WHERE point( (details::json#>>'{location,longitude}')::DOUBLE PRECISION , (details::json#>>'{location,latitude}')::DOUBLE PRECISION)<@polygon('({$string})') AND task.owner_id = {$userId} AND "user".id = user_group.user_id AND user_group.group_id = {$groupId} AND (contact.address_id = address.id OR property.address_id = address.id) AND task_type_id IN (4, 5, 6, 7) AND task.status = 'remind' AND date_trunc('day', task.tasked_at) <= date_trunc('day', NOW()) этот запрос возращает 0 записей тогда я решил попробывать так: SELECT :projection, CASE WHEN EXISTS( SELECT task.id FROM task LEFT JOIN property_task ON property_task.task_id = task.id LEFT JOIN property ON property.id = property_task.property_id LEFT JOIN contact_task ON contact_task.task_id = task.id LEFT JOIN contact ON contact.id = contact_task.contact_id LEFT JOIN "user" ON "user".id = task.owner_id LEFT JOIN user_group ON user_group.user_id = "user".id WHERE task.owner_id = {$userId} AND "user".id = user_group.user_id AND user_group.group_id = {$groupId} AND (contact.address_id = address.id OR property.address_id = address.id) AND task_type_id IN (4, 5, 6, 7) AND task.status = 'remind' AND date_trunc('day', task.tasked_at) <= date_trunc('day', NOW()) ) THEN 'remind' ELSE 'null' END AS ptype, (details::json#>>'{location,latitude}') AS latitude, (details::json#>>'{location,longitude}') AS longitude FROM address WHERE point( (details::json#>>'{location,longitude}')::DOUBLE PRECISION , (details::json#>>'{location,latitude}')::DOUBLE PRECISION)<@polygon('({$string})') HAVING address.ptype != 'null' В этом запросе жалуется на ptype мол нет такого column, я понимаю причину, но убрав ptype мне вернется целый список с ptype null и remind(которых ток 2 записи) и я не понимаю как можно отфильтровать null значения не добавляя subquery. Какие советы можете дать или может подсказать что? |
14 фев 21, 20:33 [22280852] Ответить | Цитировать Сообщить модератору |
Maxim Boguk Member Откуда: Melbourne, Австралия Сообщений: 4581 |
Levaz12, Давайте разберемся... вы хотите УПРОСТИТЬ (т.е. сделать короче) или вы хотите УСКОРИТЬ (т.е. сделать быстрее) если первое то задача конечно интересная но не понятен смысл если второе то надо с explain analyze результатов начинать. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru |
14 фев 21, 20:53 [22280859] Ответить | Цитировать Сообщить модератору |
Levaz12 Member Откуда: Сообщений: 3 |
Ускорить, проблема в том что explain analyze как бы не доступен, (location,latitude) и (location,longitude) geo метки которых нет в самой таблице они обрабатываются не на уровне sql запроса, а без них запрос не имеет смысла, по этому тут пролёт. По этой же причине я и прошу советы ибо без углублённых познаний sql хз как можно решить этот вопрос |
14 фев 21, 20:59 [22280861] Ответить | Цитировать Сообщить модератору |
Maxim Boguk Member Откуда: Melbourne, Австралия Сообщений: 4581 |
Вы что то очень странное в этом предложении написали. К любому запросу можно explain analyze сделать Ускорять и оптимизировать запрос не имея explain analyze на руках НЕ ВОЗМОЖНО в принципе и пока вы план не покажете вам никто помочь не сможет. Попробуйте объяснить по другому почему вы не можете сделать explain analyze так как я не смог понять что именно и почему вам мешает. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru |
||||
15 фев 21, 13:00 [22281060] Ответить | Цитировать Сообщить модератору |
Levaz12 Member Откуда: Сообщений: 3 |
Сначала хочу поблагодарить вас за участие , тот запрос что возвращает 0 записей оказался правильным ну и более быстрым чем два других. Ну а по поводу explain analyze: как я уже говорил (location,latitude) и (location,longitude) в таблицах не присутсвуют (по крайней мере в явном виде , может в быть в хэш варианте) и весь запрос не получается проанализировать. Но мне подсказали разбить запрос на части и так посмотреть где что хромает. В любом случае спасибо вам за ваше время))) |
||||
15 фев 21, 16:15 [22281211] Ответить | Цитировать Сообщить модератору |
Maxim Boguk Member Откуда: Melbourne, Австралия Сообщений: 4581 |
Так параметры запроса для explain analyze берутся или из приложения или из лога базы. 99% запросов зависит от входящих данных это не мешает их explain analyze просто подставив разумные входящие данные. -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru |
||||||||
15 фев 21, 16:19 [22281215] Ответить | Цитировать Сообщить модератору |
Все форумы / PostgreSQL | ![]() |