Добрый день. Есть 2 среды прод и дев. постгоес почему то строит разные планы запросов для этих сред. почему может быть так?
дев:
explain SELECT
ddv.id FROM draft_data_validation ddv WHERE ddv.draft_id = 8262 AND NOT exists(SELECT 1 FROM draft_data ref WHERE ref.draft_version_id=8262 and ((ddv.record ->> 'mainGUID') is null or (ddv.record ->> 'mainGUID') = (ref.record ->> 'mainGUID') ) );
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------
Nested Loop Anti Join (cost=0.71..75.45 rows=1 width=8)
Join Filter: (((ddv.record ->> 'mainGUID'::text) IS NULL) OR ((ddv.record ->> 'mainGUID'::text) = (ref.record ->> 'mainGUID'::text)))
-> Index Scan using draft_data_validation_main_guid_idx on draft_data_validation ddv (cost=0.29..8.30 rows=1 width=563)
Index Cond: (draft_id = 8280)
-> Index Scan using draft_data_draft_version_id on draft_data ref (cost=0.42..65.82 rows=98 width=457)
Index Cond: (draft_version_id = 8280)
прод
unsi=# explain SELECT
ddv.id FROM unsi.draft_data_validation ddv WHERE ddv.draft_id = 23376 AND NOT exists(SELECT 1 FROM unsi.draft_data ref WHERE ref.draft_version_id=23376 and ((ddv.record ->> 'mainGUID') is null or (ddv.record ->> 'mainGUID') = (ref.record ->> 'mainGUID') ) );
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------
Nested Loop Anti Join (cost=0.56..28579957500.18 rows=223975 width=8)
Join Filter: (((ddv.record ->> 'mainGUID'::text) IS NULL) OR ((ddv.record ->> 'mainGUID'::text) = (ref.record ->> 'mainGUID'::text)))
-> Seq Scan on draft_data_validation ddv (cost=0.00..409379.34 rows=1423882 width=375)
Filter: (draft_id = 23376)
-> Materialize (cost=0.56..539422.54 rows=1700662 width=379)
-> Index Scan using draft_data_draft_version_id on draft_data ref (cost=0.56..446218.23 rows=1700662 width=379)
Index Cond: (draft_version_id = 23376)
(7 rows)
и там и там были созданы индексы
create index draft_data_validation_main_guid_idx on unsi.draft_data_validation (draft_id, (record ->> 'mainGUID'));
create index draft_data_main_guid_idx on unsi.draft_data (draft_version_id, (record ->> 'mainGUID'));
vacuum analyze был выполнен для draft_data и draft_data_validation
соотношение общего числа записей к числу по выборке
дев
draft_data 738222/3000
draft_data_validation 12116/0
прод
draft_data 6673963\2807963
draft_data_validation 5917660\2807963