powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT по двум таблицам
12 сообщений из 37, страница 2 из 2
SELECT по двум таблицам
    #39907899
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Troglodit,

на таких кардинальностях, как в моём тестовом наборе (и с теми же индексами) еще быстрее (примерно вдвое) будет примерно так :

Код: 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.
SELECT t1.*
	--,t23.*
FROM
	(select
			id_table1
	FROM table2 t2 
	where
		t2.elementcode = 1
		and exists(select 1 from table2 t22
				 where t22.elementcode  = 13
						and t22.id_table1 =t2.id_table1)
		and exists(select 1 from table2 t22
				 where t22.elementcode  = 17
						and t22.id_table1 =t2.id_table1)
				-- и только они:
--/*
		and
		not exists(select 1 from table2 t22
				 where not t22.elementcode  = any(array[1,13,17])
						and t22.id_table1 =t2.id_table1) 
--*/
	) t2 join table1 t1
		on t1.id = t2.id_table1
--join table2 t23 on t1.id = t23.id_table1



хотя и многословнее , за счет чего хуже поддается параметризации в унифицированный препаред (или я не вижу подходящей комбинации кляуз, для переменной длины набора элементов). что наводит на мысль изобрести новую кляузу для одновременного множественного екзиста. или расширения синтакса старой.
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39907913
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint
Troglodit,

авторЯ прождал пять минут используя ваш вариант, но результата так и не дождался,
хотя мой последний вариант с правками от qwwq или его вариант на этих же данных исполняется менее секунды.


Думаю - это логично
Автор не предоставил структуру, а я её не придумывал, просто дал одно решение

А Ваш вариант, с Вашей структурой базы данных, с Вашим запросом и с Вашим пониманием предмета и должен работать быстро
Структура не моя, но соответствует постановке задачи, это не сферический конь в вакууме, а то что distinct на миллионах записей будет тормозить и так понятно.
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39907956
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,
интересное решение, неожиданное, я бы до такого не додумался,
но никак не пойму вашу страсть к массивам,
Код: sql
1.
t22.elementcode  = any(array[1,13,17])


почему не пишете на стандартном sql
Код: sql
1.
t22.elementcode  in (1,13,17)


как бы более стандартно хоть и тоже самое?
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39907960
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Troglodit
qwwq,
интересное решение, неожиданное, я бы до такого не додумался,
но никак не пойму вашу страсть к массивам,
Код: sql
1.
t22.elementcode  = any($array) -- параметр


почему не пишете на стандартном sql
Код: sql
1.
t22.elementcode  in (?????)


как бы более стандартно хоть и тоже то же самое?

патамушта например набор в in не параметризуецца.

массивы хороши например для хранения в табличках рукопашных "инвертированных индексов". и кучи схожих задач.
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39908519
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Troglodit,

Код: plsql
1.
2.
3.
4.
5.
6.
SELECT DISTINCT a.id FROM table1 AS a
	INNER JOIN table2 AS b ON b.id_table1 = a.id AND b.elementcode = 1
	INNER JOIN table2 AS c ON c.id_table1 = a.id AND c.elementcode = 13
	INNER JOIN table2 AS d ON d.id_table1 = a.id AND d.elementcode = 17
        LEFT  JOIN LATERAL (SELECT id_table1 FROM table2 AS e WHERE e.id_table1 = a.id AND e.elementcode NOT IN (1, 13, 17) LIMIT 1) AS e ON true
WHERE e.id_table1 IS NULL



Как ?
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39908712
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint
Troglodit,

Код: plsql
1.
2.
3.
4.
5.
6.
SELECT DISTINCT a.id FROM table1 AS a
	INNER JOIN table2 AS b ON b.id_table1 = a.id AND b.elementcode = 1
	INNER JOIN table2 AS c ON c.id_table1 = a.id AND c.elementcode = 13
	INNER JOIN table2 AS d ON d.id_table1 = a.id AND d.elementcode = 17
        LEFT  JOIN LATERAL (SELECT id_table1 FROM table2 AS e WHERE e.id_table1 = a.id AND e.elementcode NOT IN (1, 13, 17) LIMIT 1) AS e ON true
WHERE e.id_table1 IS NULL



Как ?

У вас просто косметически исправленный последний вариант qwwq, причем на мой взгляд в худшую сторону.
и кстати просветите зачем нужен DISTINCT?
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39908933
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Troglodit,

согласно предложенной Вами структуре сочетание elementcode + id_table1 - не уникально, т.е. возможны дубли по этому сочетанию,
а нам нужны уникальные Id, для этого DISTINCT, иначе увидим кучу дублей

/*
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE public.table2
(
    elementcode integer,
    qty integer,
    id_table1 integer
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

CREATE INDEX table2_elementcode_idx
    ON public.table2 USING btree
    (elementcode)
    TABLESPACE pg_default;

CREATE INDEX table2_id_table1_elementcode_idx
    ON public.table2 USING btree
    (id_table1, elementcode)
    TABLESPACE pg_default;


*/


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WITH t(id_table1, qty, elementcode) AS 
(
	SELECT 1, 1, 1  UNION ALL 
	SELECT 1, 1, 1  UNION ALL 
	SELECT 1, 1, 1  UNION ALL 
	SELECT 1, 1, 13 UNION ALL 
	SELECT 1, 1, 13 UNION ALL 
	SELECT 1, 1, 13 UNION ALL 
	SELECT 1, 1, 17 UNION ALL 	
	SELECT 1, 1, 17 UNION ALL 	
	SELECT 1, 1, 17
)
SELECT /*DISTINCT*/ a.id FROM table1 AS a
	INNER JOIN t AS b ON b.id_table1 = a.id AND b.elementcode = 1
	INNER JOIN t AS c ON c.id_table1 = a.id AND c.elementcode = 13
	INNER JOIN t AS d ON d.id_table1 = a.id AND d.elementcode = 17
        LEFT  JOIN LATERAL (SELECT id_table1 FROM t AS e WHERE e.id_table1 = a.id AND e.elementcode NOT IN (1, 13, 17) LIMIT 1) AS e ON true
WHERE e.id_table1 IS NULL



Кстати нет внешних ключей и поле elementcode поддерживает NULL (!!!!!)
в этом случае правильный скрипт
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT DISTINCT a.id FROM table1 AS a
	INNER JOIN table2 AS b ON b.id_table1 = a.id AND b.elementcode = 1
	INNER JOIN table2 AS c ON c.id_table1 = a.id AND c.elementcode = 13
	INNER JOIN table2 AS d ON d.id_table1 = a.id AND d.elementcode = 17
        LEFT  JOIN LATERAL (SELECT id_table1 FROM table2 AS e WHERE e.id_table1 = a.id AND COALESCE(e.elementcode, -1) NOT IN (1, 13, 17) LIMIT 1) AS e ON true
WHERE e.id_table1 IS NULL



автормой взгляд в худшую сторону
с моей точки зрения в разы понятней, удобней в сопровождении, более расширяемое, красивое и в конце концов правильное
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39908949
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint
Troglodit,

согласно предложенной Вами структуре сочетание elementcode + id_table1 - не уникально, т.е. возможны дубли по этому сочетанию,
а нам нужны уникальные Id, для этого DISTINCT, иначе увидим кучу дублей

/*
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE TABLE public.table2
(
    elementcode integer,
    qty integer,
    id_table1 integer
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

CREATE INDEX table2_elementcode_idx
    ON public.table2 USING btree
    (elementcode)
    TABLESPACE pg_default;

CREATE INDEX table2_id_table1_elementcode_idx
    ON public.table2 USING btree
    (id_table1, elementcode)
    TABLESPACE pg_default;


*/


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
WITH t(id_table1, qty, elementcode) AS 
(
	SELECT 1, 1, 1  UNION ALL 
	SELECT 1, 1, 1  UNION ALL 
	SELECT 1, 1, 1  UNION ALL 
	SELECT 1, 1, 13 UNION ALL 
	SELECT 1, 1, 13 UNION ALL 
	SELECT 1, 1, 13 UNION ALL 
	SELECT 1, 1, 17 UNION ALL 	
	SELECT 1, 1, 17 UNION ALL 	
	SELECT 1, 1, 17
)
SELECT /*DISTINCT*/ a.id FROM table1 AS a
	INNER JOIN t AS b ON b.id_table1 = a.id AND b.elementcode = 1
	INNER JOIN t AS c ON c.id_table1 = a.id AND c.elementcode = 13
	INNER JOIN t AS d ON d.id_table1 = a.id AND d.elementcode = 17
        LEFT  JOIN LATERAL (SELECT id_table1 FROM t AS e WHERE e.id_table1 = a.id AND e.elementcode NOT IN (1, 13, 17) LIMIT 1) AS e ON true
WHERE e.id_table1 IS NULL



Кстати нет внешних ключей и поле elementcode поддерживает NULL (!!!!!)
в этом случае правильный скрипт
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT DISTINCT a.id FROM table1 AS a
	INNER JOIN table2 AS b ON b.id_table1 = a.id AND b.elementcode = 1
	INNER JOIN table2 AS c ON c.id_table1 = a.id AND c.elementcode = 13
	INNER JOIN table2 AS d ON d.id_table1 = a.id AND d.elementcode = 17
        LEFT  JOIN LATERAL (SELECT id_table1 FROM table2 AS e WHERE e.id_table1 = a.id AND COALESCE(e.elementcode, -1) NOT IN (1, 13, 17) LIMIT 1) AS e ON true
WHERE e.id_table1 IS NULL



автормой взгляд в худшую сторону

с моей точки зрения в разы понятней, удобней в сопровождении, более расширяемое, красивое и в конце концов правильное

Извините, буду краток.
Для тех кто в танке, постановка задачи автора, это НЕ МОЯ структура.
Кто сказал, что возможны дубли и дубли чего, если дубли по документу, то в результирующую выборку они не по попадут ПО ОПРЕДЕЛЕНИЮ задачи автора.
Продолжайте искать блох на рыбе, я больше в беседе с вами не участвую, контрпродуктивно.
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39908954
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Troglodit,

Невежливо (((
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39908980
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Troglodit,

согласно предложенной Вами структуре сочетание elementcode + id_table1 - не уникально, т.е. возможны дубли по этому сочетанию,
а нам нужны уникальные Id, для этого DISTINCT, иначе увидим кучу дублей
именно поэтому екзистс, фетчащий не более 1 записи предпочтительнее джойнов с последующим дистинктом.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
truncate table1;
truncate table2;
------------
insert into table2 
SELECT
 (30 *RANDOM() )::INT + ge
, 1 as cnt , gI
from generate_series(1,1000000) gi, generate_series(1,4) gE
--group by 1,3; -- ~ unique by data generation
;
insert into table1 
select id_table1, array_agg (elementcode )::text from TABLE2 group by id_table1 
;


Код: 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.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
SELECT t1.*
	--,t23.*
FROM
	(select distinct 
			id_table1
	FROM table2 t2 
	where
		t2.elementcode = 1
		and exists(select 1 from table2 t22
				 where t22.elementcode  = 13
						and t22.id_table1 =t2.id_table1)
		and exists(select 1 from table2 t22
				 where t22.elementcode  = 17
						and t22.id_table1 =t2.id_table1)
				-- и только они:
--/*
		and
		not exists(select 1 from table2 t22
				where t22.id_table1 =t2.id_table1
				and not (t22.elementcode  = any(array[1,13,17])
					or t22.elementcode is null)
					) 
--*/
	) t2 join table1 t1
		on t1.id = t2.id_table1
--join table2 t23 on t1.id = t23.id_table1
;
-------------------------------
'Nested Loop  (cost=51766.30..51774.35 rows=1 width=17) (actual time=88.787..88.810 rows=5 loops=1)'
'  Output: t1.id, t1.description'
'  Buffers: shared hit=65677 read=23831'
'  ->  Unique  (cost=51765.88..51765.88 rows=1 width=4) (actual time=88.767..88.768 rows=5 loops=1)'
'        Output: t2.id_table1'
'        Buffers: shared hit=65658 read=23830'
'        ->  Sort  (cost=51765.88..51765.88 rows=1 width=4) (actual time=88.767..88.767 rows=5 loops=1)'
'              Output: t2.id_table1'
'              Sort Key: t2.id_table1'
'              Sort Method: quicksort  Memory: 25kB'
'              Buffers: shared hit=65658 read=23830'
'              ->  Nested Loop Semi Join  (cost=1001.29..51765.87 rows=1 width=4) (actual time=11.807..88.753 rows=5 loops=1)'
'                    Output: t2.id_table1'
'                    Buffers: shared hit=65658 read=23830'
'                    ->  Nested Loop Semi Join  (cost=1000.86..51763.54 rows=1 width=8) (actual time=11.804..88.735 rows=6 loops=1)'
'                          Output: t2.id_table1, t22.id_table1'
'                          Buffers: shared hit=65635 read=23830'
'                          ->  Gather  (cost=1000.43..51753.73 rows=1 width=4) (actual time=11.800..88.694 rows=7 loops=1)'
'                                Output: t2.id_table1'
'                                Workers Planned: 3'
'                                Workers Launched: 3'
'                                Buffers: shared hit=65609 read=23829'
'                                ->  Nested Loop Anti Join  (cost=0.43..50753.63 rows=1 width=4) (actual time=22.946..86.504 rows=2 loops=4)'
'                                      Output: t2.id_table1'
'                                      Buffers: shared hit=65273 read=23829'
'                                      Worker 0: actual time=34.933..84.867 rows=2 loops=1'
'                                        Buffers: shared hit=16156 read=5871'
'                                      Worker 1: actual time=27.987..86.327 rows=2 loops=1'
'                                        Buffers: shared hit=16214 read=5929'
'                                      Worker 2: actual time=17.275..86.354 rows=2 loops=1'
'                                        Buffers: shared hit=16790 read=6156'
'                                      ->  Parallel Seq Scan on public.table2 t2  (cost=0.00..37751.03 rows=5677 width=4) (actual time=0.046..74.711 rows=4200 loops=4)'
'                                            Output: t2.elementcode, t2.qty, t2.id_table1'
'                                            Filter: (t2.elementcode = 1)'
'                                            Rows Removed by Filter: 995800'
'                                            Buffers: shared hit=188 read=21434'
'                                            Worker 0: actual time=0.031..73.389 rows=4146 loops=1'
'                                              Buffers: shared hit=46 read=5324'
'                                            Worker 1: actual time=0.079..74.586 rows=4176 loops=1'
'                                              Buffers: shared hit=45 read=5322'
'                                            Worker 2: actual time=0.020..74.469 rows=4328 loops=1'
'                                              Buffers: shared hit=50 read=5523'
'                                      ->  Index Only Scan using table2_id_table1_elementcode_idx on public.table2 t22_2  (cost=0.43..6.49 rows=4 width=4) (actual time=0.003..0.003 rows=1 loops=16798)'
'                                            Output: t22_2.id_table1, t22_2.elementcode'
'                                            Index Cond: ((t22_2.id_table1 = t2.id_table1) AND (t22_2.elementcode IS NOT NULL))'
'                                            Filter: (t22_2.elementcode <> ALL ('{1,13,17}'::integer[]))'
'                                            Rows Removed by Filter: 1'
'                                            Heap Fetches: 8619'
'                                            Buffers: shared hit=65085 read=2395'
'                                            Worker 0: actual time=0.003..0.003 rows=1 loops=4146'
'                                              Buffers: shared hit=16110 read=547'
'                                            Worker 1: actual time=0.003..0.003 rows=1 loops=4176'
'                                              Buffers: shared hit=16169 read=607'
'                                            Worker 2: actual time=0.003..0.003 rows=1 loops=4328'
'                                              Buffers: shared hit=16740 read=633'
'                          ->  Index Only Scan using table2_id_table1_elementcode_idx on public.table2 t22  (cost=0.43..5.51 rows=1 width=4) (actual time=0.005..0.005 rows=1 loops=7)'
'                                Output: t22.id_table1, t22.elementcode'
'                                Index Cond: ((t22.id_table1 = t2.id_table1) AND (t22.elementcode = 13))'
'                                Heap Fetches: 6'
'                                Buffers: shared hit=26 read=1'
'                    ->  Index Only Scan using table2_id_table1_elementcode_idx on public.table2 t22_1  (cost=0.43..1.46 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=6)'
'                          Output: t22_1.id_table1, t22_1.elementcode'
'                          Index Cond: ((t22_1.id_table1 = t22.id_table1) AND (t22_1.elementcode = 17))'
'                          Heap Fetches: 5'
'                          Buffers: shared hit=23'
'  ->  Index Scan using table1_id_idx on public.table1 t1  (cost=0.42..8.44 rows=1 width=17) (actual time=0.007..0.007 rows=1 loops=5)'
'        Output: t1.id, t1.description'
'        Index Cond: (t1.id = t2.id_table1)'
'        Buffers: shared hit=19 read=1'
'Planning time: 0.715 ms'
'Execution time: 89.959 ms'
-------------------




Код: 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.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
SELECT DISTINCT on ( a.id) a.* FROM table1 AS a
	INNER JOIN table2 AS b ON b.id_table1 = a.id AND b.elementcode = 1
	INNER JOIN table2 AS c ON c.id_table1 = a.id AND c.elementcode = 13
	INNER JOIN table2 AS d ON d.id_table1 = a.id AND d.elementcode = 17
	LEFT  JOIN LATERAL (SELECT id_table1 FROM table2 AS e
		WHERE e.id_table1 = a.id AND --COALESCE(e.elementcode, -1) NOT IN (1, 13, 17)
		not (e.elementcode  = any(array[1,13,17])
					or e.elementcode is null)
		LIMIT 1

        ) AS e ON true
WHERE e.id_table1 IS NULL;
------------
'Unique  (cost=59380.60..59380.61 rows=1 width=17) (actual time=129.623..129.626 rows=5 loops=1)'
'  Output: a.id, a.description'
'  Buffers: shared hit=118569 read=28124 written=2'
'  ->  Sort  (cost=59380.60..59380.60 rows=1 width=17) (actual time=129.623..129.623 rows=10 loops=1)'
'        Output: a.id, a.description'
'        Sort Key: a.id'
'        Sort Method: quicksort  Memory: 25kB'
'        Buffers: shared hit=118569 read=28124 written=2'
'        ->  Nested Loop Left Join  (cost=1001.71..59380.59 rows=1 width=17) (actual time=15.755..129.608 rows=10 loops=1)'
'              Output: a.id, a.description'
'              Filter: (e.id_table1 IS NULL)'
'              Rows Removed by Filter: 104'
'              Buffers: shared hit=118569 read=28124 written=2'
'              ->  Gather  (cost=1001.28..56885.45 rows=659 width=17) (actual time=4.740..128.719 rows=114 loops=1)'
'                    Output: a.id, a.description'
'                    Workers Planned: 3'
'                    Workers Launched: 3'
'                    Buffers: shared hit=118184 read=28053 written=2'
'                    ->  Nested Loop  (cost=1.28..55819.55 rows=213 width=17) (actual time=7.802..127.119 rows=28 loops=4)'
'                          Output: a.id, a.description'
'                          Join Filter: (b.id_table1 = c.id_table1)'
'                          Buffers: shared hit=117797 read=28053 written=2'
'                          Worker 0: actual time=10.311..126.833 rows=32 loops=1'
'                            Buffers: shared hit=37114 read=8878'
'                          Worker 1: actual time=6.967..126.986 rows=42 loops=1'
'                            Buffers: shared hit=39142 read=9403 written=1'
'                          Worker 2: actual time=9.441..126.316 rows=20 loops=1'
'                            Buffers: shared hit=20769 read=4816 written=1'
'                          ->  Nested Loop  (cost=0.85..55168.59 rows=1098 width=25) (actual time=0.691..126.425 rows=402 loops=4)'
'                                Output: a.id, a.description, b.id_table1, d.id_table1'
'                                Join Filter: (b.id_table1 = d.id_table1)'
'                                Buffers: shared hit=112865 read=28053 written=2'
'                                Worker 0: actual time=0.393..126.096 rows=527 loops=1'
'                                  Buffers: shared hit=35502 read=8878'
'                                Worker 1: actual time=1.819..126.247 rows=539 loops=1'
'                                  Buffers: shared hit=37483 read=9403 written=1'
'                                Worker 2: actual time=0.274..125.635 rows=281 loops=1'
'                                  Buffers: shared hit=19905 read=4816 written=1'
'                                ->  Nested Loop  (cost=0.42..51802.90 rows=5677 width=21) (actual time=0.088..114.087 rows=4200 loops=4)'
'                                      Output: a.id, a.description, b.id_table1'
'                                      Buffers: shared hit=64630 read=24290 written=1'
'                                      Worker 0: actual time=0.092..112.593 rows=5286 loops=1'
'                                        Buffers: shared hit=20287 read=7712'
'                                      Worker 1: actual time=0.101..112.146 rows=5601 loops=1'
'                                        Buffers: shared hit=21421 read=8123 written=1'
'                                      Worker 2: actual time=0.077..114.761 rows=2944 loops=1'
'                                        Buffers: shared hit=11447 read=4156'
'                                      ->  Parallel Seq Scan on public.table2 b  (cost=0.00..37751.03 rows=5677 width=4) (actual time=0.077..99.945 rows=4200 loops=4)'
'                                            Output: b.elementcode, b.qty, b.id_table1'
'                                            Filter: (b.elementcode = 1)'
'                                            Rows Removed by Filter: 995800'
'                                            Buffers: shared hit=13 read=21609'
'                                            Worker 0: actual time=0.073..96.907 rows=5286 loops=1'
'                                              Buffers: shared hit=6 read=6812'
'                                            Worker 1: actual time=0.093..96.141 rows=5601 loops=1'
'                                              Buffers: shared hit=6 read=7090'
'                                            Worker 2: actual time=0.067..102.541 rows=2944 loops=1'
'                                              Buffers: shared read=3816'
'                                      ->  Index Scan using table1_id_idx on public.table1 a  (cost=0.42..2.47 rows=1 width=17) (actual time=0.003..0.003 rows=1 loops=16798)'
'                                            Output: a.id, a.description'
'                                            Index Cond: (a.id = b.id_table1)'
'                                            Buffers: shared hit=64617 read=2681 written=1'
'                                            Worker 0: actual time=0.003..0.003 rows=1 loops=5286'
'                                              Buffers: shared hit=20281 read=900'
'                                            Worker 1: actual time=0.002..0.003 rows=1 loops=5601'
'                                              Buffers: shared hit=21415 read=1033 written=1'
'                                            Worker 2: actual time=0.003..0.004 rows=1 loops=2944'
'                                              Buffers: shared hit=11447 read=340'
'                                ->  Index Only Scan using table2_id_table1_elementcode_idx on public.table2 d  (cost=0.43..0.58 rows=1 width=4) (actual time=0.003..0.003 rows=0 loops=16798)'
'                                      Output: d.id_table1, d.elementcode'
'                                      Index Cond: ((d.id_table1 = a.id) AND (d.elementcode = 17))'
'                                      Heap Fetches: 259'
'                                      Buffers: shared hit=48235 read=3763 written=1'
'                                      Worker 0: actual time=0.002..0.002 rows=0 loops=5286'
'                                        Buffers: shared hit=15215 read=1166'
'                                      Worker 1: actual time=0.002..0.002 rows=0 loops=5601'
'                                        Buffers: shared hit=16062 read=1280'
'                                      Worker 2: actual time=0.003..0.003 rows=0 loops=2944'
'                                        Buffers: shared hit=8458 read=660 written=1'
'                          ->  Index Only Scan using table2_id_table1_elementcode_idx on public.table2 c  (cost=0.43..0.58 rows=1 width=4) (actual time=0.001..0.001 rows=0 loops=1606)'
'                                Output: c.id_table1, c.elementcode'
'                                Index Cond: ((c.id_table1 = a.id) AND (c.elementcode = 13))'
'                                Heap Fetches: 20'
'                                Buffers: shared hit=4932'
'                                Worker 0: actual time=0.001..0.001 rows=0 loops=527'
'                                  Buffers: shared hit=1612'
'                                Worker 1: actual time=0.001..0.001 rows=0 loops=539'
'                                  Buffers: shared hit=1659'
'                                Worker 2: actual time=0.002..0.002 rows=0 loops=281'
'                                  Buffers: shared hit=864'
'              ->  Limit  (cost=0.43..3.77 rows=1 width=4) (actual time=0.007..0.007 rows=1 loops=114)'
'                    Output: e.id_table1'
'                    Buffers: shared hit=385 read=71'
'                    ->  Index Only Scan using table2_id_table1_elementcode_idx on public.table2 e  (cost=0.43..13.77 rows=4 width=4) (actual time=0.007..0.007 rows=1 loops=114)'
'                          Output: e.id_table1'
'                          Index Cond: ((e.id_table1 = a.id) AND (e.elementcode IS NOT NULL))'
'                          Filter: (e.elementcode <> ALL ('{1,13,17}'::integer[]))'
'                          Rows Removed by Filter: 2'
'                          Heap Fetches: 383'
'                          Buffers: shared hit=385 read=71'
'Planning time: 0.877 ms'
'Execution time: 130.806 ms'




entrypoint

с моей точки зрения в разы понятней, удобней в сопровождении, более расширяемое, красивое и в конце концов правильное

кому и кобыла невеста
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39909007
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,
как абычна наврал
Код: sql
1.
2.
3.
4.
5.
6.
--вместо ~~
not (e.elementcode  = any(array[1,13,17])
	or e.elementcode is null)
--читать 
	((not e.elementcode  = any(array[1,13,17]))
	or e.elementcode is null)



-- поправил

для планов не принципиально
...
Рейтинг: 0 / 0
SELECT по двум таблицам
    #39909306
Troglodit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
entrypoint
Troglodit,

Невежливо (((

Я же извинился заранее.
Но все же.
Если прочитать тему с начала я как и вы тоже предложил рабочий но далеко не оптимальный вариант.
qwwq не только предложил лучше и изящнее, но и пояснил почему.
И вместо того, чтобы упираться рогом как вы, я признал что его кунгфу круче.
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT по двум таблицам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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