powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос
10 сообщений из 10, страница 1 из 1
Оптимизировать запрос
    #39798664
korumbo1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как можно оптимизировать этот запрос или никак совсем?
Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
SELECT
  *
FROM
  fournisseurs f
WHERE
  f.actif = true
  AND f."dateSuppression" IS NULL
  AND f.local = false
  AND ((f.id IN (
    SELECT DISTINCT f."siegeId"
    FROM fournisseurs f
    WHERE f.actif = true
      AND f.local = false
      AND f."dateSuppression" IS NULL
      AND (
            f."id" IN (SELECT DISTINCT com."fournisseurId"
                       FROM commissions com
                       WHERE com."dateDebut" <= NOW()
                         AND com.actif = true
                         AND com."dateSuppression" IS NULL
                         AND com."dateFin" >= NOW()
                         AND com."clientId" IN (SELECT DISTINCT c.id "clientId"
                                                FROM clients c
                                                         INNER JOIN sites s
                                                                    on c.id = s."clientId" AND s.actif = true AND s."dateSuppression" IS NULL
                                                         INNER JOIN utilisateur_sites us on s.id = us."siteId"
                                                         INNER JOIN utilisateurs u
                                                                    on u.id = us."utilisateurId" AND u.actif = true AND
                                                                       u."dateSuppression" IS NULL
                                                WHERE c.actif = true
                                                  AND c."dateSuppression" IS NULL
                                                  AND u.id = 26
                       )
        )
        )
))
    OR f.id IN (SELECT DISTINCT com."fournisseurId"
                FROM commissions com
                WHERE com."dateDebut" <= NOW()
                  AND com.actif = true
                  AND com."dateSuppression" IS NULL
                  AND com."dateFin" >= NOW()
                  AND com."clientId" IN (SELECT DISTINCT c.id "clientId"
                                         FROM clients c
                                                  INNER JOIN sites s
                                                             on c.id = s."clientId" AND s.actif = true AND s."dateSuppression" IS NULL
                                                  INNER JOIN utilisateur_sites us on s.id = us."siteId"
                                                  INNER JOIN utilisateurs u
                                                             on u.id = us."utilisateurId" AND u.actif = true AND
                                                                u."dateSuppression" IS NULL
                                         WHERE c.actif = true
                                           AND c."dateSuppression" IS NULL
                                           AND u.id = 26
                )
    )

    )

    ;
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39798719
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
korumbo1,

Версия MySQL? Показывайте DDL всех таблиц, включая индексы.
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39798723
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оптимизировать WHERE .. IN - почти что дохлый номер.

Обычный в таких случаях совет: "Публикуйте проблему, а не свои попытки её решить".
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39798842
korumbo1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люди извините. Оказалось это был postgresql

Модератор: Тема перенесена из форума "MySQL".
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39798950
Mr.DKSoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
korumbo1,
Код: plsql
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
with A as
(
 SELECT DISTINCT c.id "clientId"
                                         FROM clients c
                                                  INNER JOIN sites s
                                                               on c.id = s."clientId" 
                                                              AND s.actif 
                                                              AND s."dateSuppression" IS NULL
                                                  INNER JOIN utilisateur_sites us
                                                             on s.id = us."siteId"
                                                  INNER JOIN utilisateurs u
                                                             on u.id = us."utilisateurId" 
                                                             AND u.actif
                                                             AND u."dateSuppression" IS NULL
                                         WHERE c.actif
                                           AND c."dateSuppression" IS NULL
                                           AND u.id = 26
)
,b As  (
SELECT DISTINCT com."fournisseurId"
                       FROM commissions com
                            ,A A
                       WHERE com."dateDebut" <= NOW()
                         AND com.actif = true
                         AND com."dateSuppression" IS NULL
                         AND com."dateFin" >= NOW()
                         AND com."clientId"=A.ClientID) 
,C as (
    SELECT DISTINCT f."siegeId"
    FROM fournisseurs f
        ,C C
    WHERE f.actif = true
      AND f.local = false
      AND f."dateSuppression" IS NULL
      AND f."id"=C.ID 
)
,D as (
SELECT DISTINCT com."fournisseurId"
                FROM commissions com
                    ,A A
                WHERE com."dateDebut" <= NOW()
                  AND com.actif = true
                  AND com."dateSuppression" IS NULL
                  AND com."dateFin" >= NOW()
                  AND com."clientId"=A.ClientID
)

SELECT
  f.*
FROM
  fournisseurs f
 ,C C 
WHERE
  f.actif = true
  AND f."dateSuppression" IS NULL
  AND f.local = false
  AND f.id=C.siegeId
UNION 
SELECT
  f.*
FROM
  fournisseurs f
 ,C D 
WHERE
  f.actif = true
  AND f."dateSuppression" IS NULL
  AND f.local = false
  AND f.id=D.fournisseurId
 


Если грубо то как-то так
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39798981
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.DKSoft,
не надо учить плохому.

2тс многое зависит от индексов

но навскидку для пж заменить все in
Код: sql
1.
2.
AND (
            f."id" IN (SELECT DISTINCT com."fournisseurId"



на соответсв. им exists (SELECT 0 from ...

и возможно заменить волатильные now() на параметры (т.е преобразовать запрос в препаред или ф-ю) . так чтобы оптимайзер мог иметь значение.
или хотя бы вшить в текст конкретные литералы вместо now().
например в пж есть литерал " timestamp[tz]'now' " (что м.б. чревато при препаредах).

подробно не смотрел. план бы посмотреть ещё.
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39799228
Mr.DKSoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

А что же Вы увидели плохого ?
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39799524
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.DKSoftqwwq,

А что же Вы увидели плохого ?


например cte в пж всегда материализуется

поэтому имеет смысл предвыбирать (материализовать) им только редкие данные (за исключением гетерогенных запросов через fdw)

а если "select Distinct anytab.id from anytable join {multyjoin}... " возвращает редкие записи, то и не нужно было размножаться записями на джойнах (и потом дистинктить ), а просто проверить exsists - ом эти редкие записи в зависимых. особенно -- при наличии нужных индексов в последних

в некоторых случаях (выборки из большой таблицы дистинктного набора многократных редких значений, если нет покрывающей ключевой таблицы (т.е. ФК)) -- выгоднее задействовать рукопашный loose-индекскан для дистинкта. при наличии нужного индекса в этой большой

ну и т.п.

опять же "where ... and t.id in (select distinct foo.id ........ {big table|multyjoin} as foo) " часто проигрывает "where ...and exists (select 1 from {big table|multyjoin} foo where foo.id = t.id) " (когда не готово свалиться в хещджойн -- навскидку не наш случай -- мы сам ид фильтруем. его хешить в таблицу невыгодно). // и то тогда именно в пж бывает (требует проверки, могло измениться) выгоднее писать "where ... and t.id =ANY(ARRAY (select distinct foo.id ........ {big table|multyjoin} as foo) ) ".
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39799572
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqнапример cte в пж всегда материализуется
Уже можно начинать уточнять "до версии 12" .
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #39799591
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkijqwwqнапример cte в пж всегда материализуется
Уже можно начинать уточнять "до версии 12" .
снкс

вот это вот хорошо:
Код: sql
1.
.. AS [ MATERIALIZED ]
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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