Size: a a a

pgsql – PostgreSQL

2021 March 09

s

shoxrux in pgsql – PostgreSQL
Yaroslav Schekin
Лучше так не делать, по-хорошему (т.е. это почти наверняка неудачная схема БД).
А так — покажите пример таблиц или как-то подробнее объясните, что именно нужно.
У меня есть мэйн таблица у которой есть поле account_id. И мне нужно по account_id найти суммы кред или дебет по этому пользователю, а суммы хранятся в другой таблице. В другой таблице есть две колонки, которые отвечают  за кредит, а другой за дебет. То есть если у клиента debet то нужно соединить с мэйн по cl_deb = account_id. если кредит, то по cl_cred = account_id (cl_deb и cl_cred  - две колонки из второй таблицы)
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
shoxrux
У меня есть мэйн таблица у которой есть поле account_id. И мне нужно по account_id найти суммы кред или дебет по этому пользователю, а суммы хранятся в другой таблице. В другой таблице есть две колонки, которые отвечают  за кредит, а другой за дебет. То есть если у клиента debet то нужно соединить с мэйн по cl_deb = account_id. если кредит, то по cl_cred = account_id (cl_deb и cl_cred  - две колонки из второй таблицы)
> И мне нужно по account_id найти суммы кред или дебет

В зависимости от чего "кред или дебет"?

> То есть если у клиента debet

И это что значит?
источник

AD

Artemiy Dubovoy in pgsql – PostgreSQL
shoxrux
У меня есть мэйн таблица у которой есть поле account_id. И мне нужно по account_id найти суммы кред или дебет по этому пользователю, а суммы хранятся в другой таблице. В другой таблице есть две колонки, которые отвечают  за кредит, а другой за дебет. То есть если у клиента debet то нужно соединить с мэйн по cl_deb = account_id. если кредит, то по cl_cred = account_id (cl_deb и cl_cred  - две колонки из второй таблицы)
Сделайте 2 джойна, а кредит/дебет выведите через coalesce
источник

AD

Artemiy Dubovoy in pgsql – PostgreSQL
Примерно вот так:

select  t1.a,
       coalesce(t2_cred.cred, t2_debet.debet) as cred_debet
from    t1
       left join   t2 as t2_cred
           on  t1.field_a = t2_cred.field_a
       left join   t2 as t2_debet
           on  t1.field_b = t2_debet.field_b
источник

s

shoxrux in pgsql – PostgreSQL
Yaroslav Schekin
> И мне нужно по account_id найти суммы кред или дебет

В зависимости от чего "кред или дебет"?

> То есть если у клиента debet

И это что значит?
* В зависимости от чего "кред или дебет"?

Устанавливаю сам. Есть условия при которых я могу сказать, что здесь я должен соединять по debet или по kred.

Мне нужно, как-то сказать, что этот подзапрос содержит кредит счет и должен соединяться с мэйн по cl_kred
источник

AD

Artemiy Dubovoy in pgsql – PostgreSQL
shoxrux
* В зависимости от чего "кред или дебет"?

Устанавливаю сам. Есть условия при которых я могу сказать, что здесь я должен соединять по debet или по kred.

Мне нужно, как-то сказать, что этот подзапрос содержит кредит счет и должен соединяться с мэйн по cl_kred
Это плохая практика, Ярослав и написал, что со схемой скорее всего проблемы. Когда в джойнах появляются условия — это тревожный звонок. Условия должны быть в where
источник

s

shoxrux in pgsql – PostgreSQL
Ясно. Спасибо большое
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
shoxrux
* В зависимости от чего "кред или дебет"?

Устанавливаю сам. Есть условия при которых я могу сказать, что здесь я должен соединять по debet или по kred.

Мне нужно, как-то сказать, что этот подзапрос содержит кредит счет и должен соединяться с мэйн по cl_kred
Лучше б Вы пример схемы / запроса показали, мне до сих пор так и не понятно... а так — условия в LEFT JOIN или JOIN с "(SELECT ... FROM a UNION ALL SELECT FROM b) AS ab ON ... ", например.
Но, вообще, подобные схемы ведут к проблемам, в т.ч. с написанием запросов.
К примеру, запрос https://t.me/pgsql/288791 — скорее всего, неправильный. ;)
источник

s

shoxrux in pgsql – PostgreSQL
select a.name,
        (select sum_val
           from table_1 d1
          where d1.dat_doc between '01.10.2020' and '30.10.2020'
            and (d1.ls_cl like '10501%' or d1.ls_cl like '10101%')
            and (d1.naz_pla like '45020%' or d1.naz_pla like '45021%' or
                d1.naz_pla like '45022%' or d1.naz_pla like '45023%' or
                d1.naz_pla like '45024%')
            and d1.ls_cl = a.account) sub1, --debet
        (select sum_val
           from table_1
          where d1.dat_doc between '01.10.2020' and '30.10.2020'
            and (d1.ls_cor like '20201%' or d1.ls_cor like '20204%')
            and (d1.naz_pla like '45020%' or d1.naz_pla like '45021%' or
                d1.naz_pla like '45022%' or d1.naz_pla like '45023%' or
                d1.naz_pla like '45024%'
            and d1.ls_cor = a.account)) sub2 --kredit
   from acc a -- main table  Мне нужно чтобы он взял инфу с мэйна. Если кредит то по кредиту, если дебет по дебету.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
shoxrux
select a.name,
        (select sum_val
           from table_1 d1
          where d1.dat_doc between '01.10.2020' and '30.10.2020'
            and (d1.ls_cl like '10501%' or d1.ls_cl like '10101%')
            and (d1.naz_pla like '45020%' or d1.naz_pla like '45021%' or
                d1.naz_pla like '45022%' or d1.naz_pla like '45023%' or
                d1.naz_pla like '45024%')
            and d1.ls_cl = a.account) sub1, --debet
        (select sum_val
           from table_1
          where d1.dat_doc between '01.10.2020' and '30.10.2020'
            and (d1.ls_cor like '20201%' or d1.ls_cor like '20204%')
            and (d1.naz_pla like '45020%' or d1.naz_pla like '45021%' or
                d1.naz_pla like '45022%' or d1.naz_pla like '45023%' or
                d1.naz_pla like '45024%'
            and d1.ls_cor = a.account)) sub2 --kredit
   from acc a -- main table  Мне нужно чтобы он взял инфу с мэйна. Если кредит то по кредиту, если дебет по дебету.
Можно либо посылать разные запросы (если это весь запрос, и "нужен кредит или дебет" зависит от внешних условий), либо внести это условие в JOIN, с помощью либо CASE, либо UNION ALL (как я писал выше).
Но в последнем случае могут быть проблемы с производительностью — PostgreSQL вообще "не любит" кривых схем и запросов, учтите.
источник

s

shoxrux in pgsql – PostgreSQL
Можете пример запроса отправить. Если буду прописывать в условие join.
join table_2 on ???
источник

s

shoxrux in pgsql – PostgreSQL
Я этого не могу понять
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
shoxrux
Можете пример запроса отправить. Если буду прописывать в условие join.
join table_2 on ???
Хмм... по-моему, у Вас с запросом что-то совсем не то.
Вот это какая-то чушь:
and (d1.naz_pla like '45020%' or d1.naz_pla like '45021%' or
                d1.naz_pla like '45022%' or d1.naz_pla like '45023%' or
                d1.naz_pla like '45024%'
            and d1.ls_cor = a.account)

нет?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
shoxrux
Я этого не могу понять
Т.е. показали бы Вы нормальный пример.
И да, я в этом запросе не вижу самого условия, по которому должен выдаваться кредит либо дебет.
источник

GT

Gonchik Tsymzhitov in pgsql – PostgreSQL
Привет!

подскажите, у меня есть такой запрос, который сильно медленно отрабатывается, результат запроса 15 МБ.
explain (analyze,buffers)  SELECT OAV."ID",OAV."TEXT_VALUE" FROM public."AO_8542F1_IFJ_OBJ_ATTR_VAL" OAV JOIN public."AO_8542F1_IFJ_OBJ_ATTR" OA ON OA."ID" = OAV."OBJECT_ATTRIBUTE_ID" WHERE OA."OBJECT_TYPE_ATTRIBUTE_ID" IN (529, 10, 506, 143) ;
                                                                                  QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Gather  (cost=1000.57..712718.82 rows=599184 width=34) (actual time=0.474..2319.057 rows=655844 loops=1)
  Workers Planned: 4
  Workers Launched: 4
  Buffers: shared hit=3296662 read=258958
  ->  Nested Loop  (cost=0.56..651800.42 rows=149796 width=34) (actual time=0.111..2204.502 rows=131169 loops=5)
        Buffers: shared hit=3296662 read=258958
        ->  Parallel Seq Scan on "AO_8542F1_IFJ_OBJ_ATTR" oa  (cost=0.00..425675.07 rows=152918 width=8) (actual time=0.053..1049.557 rows=131169 loops=5)
              Filter: ("OBJECT_TYPE_ATTRIBUTE_ID" = ANY ('{529,10,506,143}'::integer[]))
              Rows Removed by Filter: 7888265
              Buffers: shared hit=13870 read=258958
        ->  Index Scan using index_ao_8542f1_ifj228666017 on "AO_8542F1_IFJ_OBJ_ATTR_VAL" oav  (cost=0.56..1.47 rows=1 width=42) (actual time=0.008..0.008 rows=1 loops=655844)
              Index Cond: ("OBJECT_ATTRIBUTE_ID" = oa."ID")
              Buffers: shared hit=3282792
Planning time: 0.326 ms
Execution time: 2340.710 ms



Подскажите куда копать ? буффера, довольно норм
источник

s

shoxrux in pgsql – PostgreSQL
Yaroslav Schekin
Хмм... по-моему, у Вас с запросом что-то совсем не то.
Вот это какая-то чушь:
and (d1.naz_pla like '45020%' or d1.naz_pla like '45021%' or
                d1.naz_pla like '45022%' or d1.naz_pla like '45023%' or
                d1.naz_pla like '45024%'
            and d1.ls_cor = a.account)

нет?
Это не чушь:). Нужный фильтр без него никак:)
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
shoxrux
Это не чушь:). Нужный фильтр без него никак:)
Неужели? Вы на скобки-то посмотрите. ;)
Т.е. для соединения достаточно любого из этих условий?
Т.е. чтобы naz_pla был like '45020%', или ..., или d1.ls_cor = a.account?
источник

s

shoxrux in pgsql – PostgreSQL
Аааа, лол)
источник

GT

Gonchik Tsymzhitov in pgsql – PostgreSQL
Gonchik Tsymzhitov
Привет!

подскажите, у меня есть такой запрос, который сильно медленно отрабатывается, результат запроса 15 МБ.
explain (analyze,buffers)  SELECT OAV."ID",OAV."TEXT_VALUE" FROM public."AO_8542F1_IFJ_OBJ_ATTR_VAL" OAV JOIN public."AO_8542F1_IFJ_OBJ_ATTR" OA ON OA."ID" = OAV."OBJECT_ATTRIBUTE_ID" WHERE OA."OBJECT_TYPE_ATTRIBUTE_ID" IN (529, 10, 506, 143) ;
                                                                                  QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Gather  (cost=1000.57..712718.82 rows=599184 width=34) (actual time=0.474..2319.057 rows=655844 loops=1)
  Workers Planned: 4
  Workers Launched: 4
  Buffers: shared hit=3296662 read=258958
  ->  Nested Loop  (cost=0.56..651800.42 rows=149796 width=34) (actual time=0.111..2204.502 rows=131169 loops=5)
        Buffers: shared hit=3296662 read=258958
        ->  Parallel Seq Scan on "AO_8542F1_IFJ_OBJ_ATTR" oa  (cost=0.00..425675.07 rows=152918 width=8) (actual time=0.053..1049.557 rows=131169 loops=5)
              Filter: ("OBJECT_TYPE_ATTRIBUTE_ID" = ANY ('{529,10,506,143}'::integer[]))
              Rows Removed by Filter: 7888265
              Buffers: shared hit=13870 read=258958
        ->  Index Scan using index_ao_8542f1_ifj228666017 on "AO_8542F1_IFJ_OBJ_ATTR_VAL" oav  (cost=0.56..1.47 rows=1 width=42) (actual time=0.008..0.008 rows=1 loops=655844)
              Index Cond: ("OBJECT_ATTRIBUTE_ID" = oa."ID")
              Buffers: shared hit=3282792
Planning time: 0.326 ms
Execution time: 2340.710 ms



Подскажите куда копать ? буффера, довольно норм
этот же запрос повторяется с частотой 2-3 минуты, на стороне приложения пока готовятся, но как быть с продом ?
источник

s

shoxrux in pgsql – PostgreSQL
Yaroslav Schekin
Неужели? Вы на скобки-то посмотрите. ;)
Т.е. для соединения достаточно любого из этих условий?
Т.е. чтобы naz_pla был like '45020%', или ..., или d1.ls_cor = a.account?
Это другой фильтр. Вы хотите вынести условия ?. Сам подселект должен каким-то образом намикать жоину, что он дебет или кредит и нужно соединить по определенным полям)
источник