I have simple select
x
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.