Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Успростить запрос  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Успростить запрос  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4581
Levaz12,

Давайте разберемся...
вы хотите УПРОСТИТЬ (т.е. сделать короче)
или вы хотите УСКОРИТЬ (т.е. сделать быстрее)

если первое то задача конечно интересная но не понятен смысл
если второе то надо с explain analyze результатов начинать.



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
14 фев 21, 20:53    [22280859]     Ответить | Цитировать Сообщить модератору
 Re: Успростить запрос  [new]
Levaz12
Member

Откуда:
Сообщений: 3
Ускорить, проблема в том что explain analyze как бы не доступен, (location,latitude) и (location,longitude) geo метки которых нет в самой таблице они обрабатываются не на уровне sql запроса, а без них запрос не имеет смысла, по этому тут пролёт. По этой же причине я и прошу советы ибо без углублённых познаний sql хз как можно решить этот вопрос
14 фев 21, 20:59    [22280861]     Ответить | Цитировать Сообщить модератору
 Re: Успростить запрос  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4581
Levaz12
Ускорить, проблема в том что explain analyze как бы не доступен, (location,latitude) и (location,longitude) geo метки которых нет в самой таблице они обрабатываются не на уровне sql запроса, а без них запрос не имеет смысла, по этому тут пролёт. По этой же причине я и прошу советы ибо без углублённых познаний sql хз как можно решить этот вопрос


Вы что то очень странное в этом предложении написали.
К любому запросу можно explain analyze сделать
Ускорять и оптимизировать запрос не имея explain analyze на руках НЕ ВОЗМОЖНО в принципе и пока вы план не покажете вам никто помочь не сможет.

Попробуйте объяснить по другому почему вы не можете сделать explain analyze так как я не смог понять что именно и почему вам мешает.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
15 фев 21, 13:00    [22281060]     Ответить | Цитировать Сообщить модератору
 Re: Успростить запрос  [new]
Levaz12
Member

Откуда:
Сообщений: 3
Maxim Boguk


Попробуйте объяснить по другому почему вы не можете сделать explain analyze так как я не смог понять что именно и почему вам мешает.

Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


Сначала хочу поблагодарить вас за участие , тот запрос что возвращает 0 записей оказался правильным ну и более быстрым чем два других.

Ну а по поводу explain analyze:
как я уже говорил (location,latitude) и (location,longitude) в таблицах не присутсвуют (по крайней мере в явном виде , может в быть в хэш варианте) и весь запрос не получается проанализировать. Но мне подсказали разбить запрос на части и так посмотреть где что хромает.

В любом случае спасибо вам за ваше время)))
15 фев 21, 16:15    [22281211]     Ответить | Цитировать Сообщить модератору
 Re: Успростить запрос  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4581
Levaz12
Maxim Boguk


Попробуйте объяснить по другому почему вы не можете сделать explain analyze так как я не смог понять что именно и почему вам мешает.

Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


Сначала хочу поблагодарить вас за участие , тот запрос что возвращает 0 записей оказался правильным ну и более быстрым чем два других.

Ну а по поводу explain analyze:
как я уже говорил (location,latitude) и (location,longitude) в таблицах не присутсвуют (по крайней мере в явном виде , может в быть в хэш варианте) и весь запрос не получается проанализировать. Но мне подсказали разбить запрос на части и так посмотреть где что хромает.

В любом случае спасибо вам за ваше время)))


Так параметры запроса для explain analyze берутся или из приложения или из лога базы. 99% запросов зависит от входящих данных это не мешает их explain analyze просто подставив разумные входящие данные.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
15 фев 21, 16:19    [22281215]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить