I have simple select
EXPLAIN (ANALYZE, COSTS, VERBOSE, BUFFERS, FORMAT JSON) SELECT * FROM view_rezervacijos_krepselio_pardavimai where krepselis = '82520963324053795678'
that runs slowly. Exactly the same problem as in https://dba.stackexchange.com/questions/136653/filtering-union-all-result-is-much-slower-than-filtering-each-subquery I wonder is there anything I could do without making a function that accepts krepselis as parameter. There is my explain https://pastebin.com/zTBWzkW1 that i use in https://tatiyants.com/pev/#/plans/new
Indexes of private.blt_rezervuota_vieta:
CREATE INDEX fki_renginys ON private.blt_rezervuota_vieta USING btree (rvt_renginys); CREATE INDEX fki_rezervuotos_vietos_bilietas ON private.blt_rezervuota_vieta USING btree (rvt_bilietas); CREATE INDEX idx_blt_rezervuota_vieta__pirkinys_id ON private.blt_rezervuota_vieta USING btree (rvt_pirkinys_id); CREATE INDEX idx_rezervuota_vieta ON private.blt_rezervuota_vieta USING btree (rvt_renginys, rvt_renginio_data, rvt_renginio_laikas, rvt_sektorius COLLATE pg_catalog."default", rvt_eile COLLATE pg_catalog."default", rvt_vieta COLLATE pg_catalog."default"); CREATE INDEX idx_rvt_seansas ON private.blt_rezervuota_vieta USING btree (rvt_renginys, rvt_renginio_data, rvt_renginio_laikas, rvt_sales_planas);
And there is the view itself:
CREATE OR REPLACE VIEW public.view_rezervacijos_krepselio_pardavimai AS SELECT DISTINCT skirtingi_pard.krepselis, skirtingi_pard.pardavimo_id FROM ( SELECT view_blt_rezervacijos_krepselio_prekes_copy.rkp_krepselis AS krepselis, view_blt_rezervacijos_krepselio_prekes_copy.rkp_pardavimas AS pardavimo_id FROM private.view_blt_rezervacijos_krepselio_prekes_copy WHERE view_blt_rezervacijos_krepselio_prekes_copy.rkp_pardavimas IS NOT NULL UNION ALL SELECT view_blt_rezervacijos_krepselio_abonementai_copy.rka_krepselis AS krepselis, view_blt_rezervacijos_krepselio_abonementai_copy.rka_pardavimas AS pardavimo_id FROM private.view_blt_rezervacijos_krepselio_abonementai_copy WHERE view_blt_rezervacijos_krepselio_abonementai_copy.rka_pardavimas IS NOT NULL UNION ALL SELECT view_blt_rezervuota_vieta_copy.rvt_krepselis AS krepselis, view_blt_rezervuota_vieta_copy.rvt_pardavimas AS pardavimo_id FROM private.view_blt_rezervuota_vieta_copy WHERE view_blt_rezervuota_vieta_copy.rvt_pardavimas IS NOT NULL UNION ALL SELECT blt_rezervacijos_krepselio_avanso_papildymas.rka_krepselis AS krepselis, blt_rezervacijos_krepselio_avanso_papildymas.rka_pardavimas AS pardavimo_id FROM private.blt_rezervacijos_krepselio_avanso_papildymas JOIN b_mokejimai ON b_mokejimai.mok_pardavimas = blt_rezervacijos_krepselio_avanso_papildymas.rka_pardavimas WHERE b_mokejimai.mok_budas <> 7 UNION ALL SELECT blt_rezervacijos_krepselio_td_sutartis.ktd_krepselis AS krepselis, imoku_pardavimai.pard_id AS pardavimo_id FROM private.blt_rezervacijos_krepselio_td_sutartis JOIN b_td_sutartis ON b_td_sutartis.tds_id = blt_rezervacijos_krepselio_td_sutartis.ktd_sutartis JOIN b_pardavimai td_pardavimas ON td_pardavimas.pard_id = b_td_sutartis.tds_pardavimas JOIN b_pardavimai imoku_pardavimai ON imoku_pardavimai.pard_susieta = td_pardavimas.pard_susieta UNION ALL SELECT view_blt_rezervacijos_krepselio_kuponai_paslaugai_copy.kkp_krepselis AS krepselis, kuponai_paslaugai.kp_pardavimas AS pardavimo_id FROM private.view_blt_rezervacijos_krepselio_kuponai_paslaugai_copy JOIN kuponai_paslaugai ON kuponai_paslaugai.kp_numeris::text = view_blt_rezervacijos_krepselio_kuponai_paslaugai_copy.kkp_kupono_numeris::text WHERE kuponai_paslaugai.kp_pardavimas IS NOT NULL UNION ALL SELECT blt_rezervacijos_krepselio_kuponai_sumai.kks_krepselis AS krepselis, kuponai_sumai.ks_pardavimas AS pardavimo_id FROM private.blt_rezervacijos_krepselio_kuponai_sumai JOIN kuponai_sumai ON kuponai_sumai.ks_numeris::text = blt_rezervacijos_krepselio_kuponai_sumai.kks_kuponas::text WHERE kuponai_sumai.ks_pardavimas IS NOT NULL UNION ALL SELECT blt_rezervacijos_krepselio_pakvietimo_naudojimas.rpn_krepselis AS krepselis, kuponai_paslaugai.kp_naudojimas AS pardavimo_id FROM private.blt_rezervacijos_krepselio_pakvietimo_naudojimas JOIN kuponai_paslaugai ON kuponai_paslaugai.kp_numeris::text = blt_rezervacijos_krepselio_pakvietimo_naudojimas.rpn_pakvietimas::text WHERE kuponai_paslaugai.kp_naudojimas IS NOT NULL UNION ALL SELECT blt_rezervacijos_krepselio_td_plano_keitimas.rkpk_krepselis AS krepselis, blt_rezervacijos_krepselio_td_plano_keitimas.rkpk_pardavimas AS pardavimo_id FROM private.blt_rezervacijos_krepselio_td_plano_keitimas WHERE blt_rezervacijos_krepselio_td_plano_keitimas.rkpk_pardavimas IS NOT NULL UNION ALL SELECT blt_rezervacijos_krepselio_td_plano_keitimas.rkpk_krepselis AS krepselis, blt_rezervacijos_krepselio_td_plano_keitimas.rkpk_avanso_papildymo_pardavimas AS pardavimo_id FROM private.blt_rezervacijos_krepselio_td_plano_keitimas WHERE blt_rezervacijos_krepselio_td_plano_keitimas.rkpk_avanso_papildymo_pardavimas IS NOT NULL UNION ALL SELECT view_blt_rezervacijos_krepselio_abonemento_keitimas_copy.rkak_krepselis AS krepselis, view_blt_rezervacijos_krepselio_abonemento_keitimas_copy.rkak_pardavimas AS pardavimo_id FROM private.view_blt_rezervacijos_krepselio_abonemento_keitimas_copy WHERE view_blt_rezervacijos_krepselio_abonemento_keitimas_copy.rkak_pardavimas IS NOT NULL UNION ALL SELECT blt_rezervacijos_krepselio_td_nutraukimai.rkn_krepselis AS krepselis, blt_rezervacijos_krepselio_td_nutraukimai.rkn_pardavimas AS pardavimo_id FROM private.blt_rezervacijos_krepselio_td_nutraukimai WHERE blt_rezervacijos_krepselio_td_nutraukimai.rkn_pardavimas IS NOT NULL) skirtingi_pard;
Advertisement
Answer
Solved the problem by casting each union item that points to krepselis, to same database type.