powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Успростить запрос
6 сообщений из 6, страница 1 из 1
Успростить запрос
    #40045283
Levaz12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет
Есть такой запрос:

Код: 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.
        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 записи

мне нужно его упростить. И я пробывал так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
        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 записей

тогда я решил попробывать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
            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 .

Какие советы можете дать или может подсказать что?
...
Рейтинг: 0 / 0
Успростить запрос
    #40045287
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Levaz12,

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

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



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Успростить запрос
    #40045289
Levaz12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ускорить, проблема в том что explain analyze как бы не доступен, (location,latitude) и (location,longitude) geo метки которых нет в самой таблице они обрабатываются не на уровне sql запроса, а без них запрос не имеет смысла, по этому тут пролёт. По этой же причине я и прошу советы ибо без углублённых познаний sql хз как можно решить этот вопрос
...
Рейтинг: 0 / 0
Успростить запрос
    #40045420
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Levaz12
Ускорить, проблема в том что explain analyze как бы не доступен, (location,latitude) и (location,longitude) geo метки которых нет в самой таблице они обрабатываются не на уровне sql запроса, а без них запрос не имеет смысла, по этому тут пролёт. По этой же причине я и прошу советы ибо без углублённых познаний sql хз как можно решить этот вопрос


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

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

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Успростить запрос
    #40045512
Levaz12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk


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

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


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

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

В любом случае спасибо вам за ваше время)))
...
Рейтинг: 0 / 0
Успростить запрос
    #40045514
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Успростить запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]