Skip to content
Advertisement

Filtering UNION ALL result is much slower than filtering each subquery

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.

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement